JavaScript
一门客户端脚本语言,运行在客户端,每一个浏览器都有JavaScript解析引擎,增强用户与HTML页面的交互过程,用来控制HTML元素,增加动态效果,增强用户体验。
1. 发展历程:
- 专用于表单校验的客户端脚本语言c--,后来更名为ScriptEase
- 网景公司开发的LiveScript脚本语言,后来与sun公司专家合作改进LiveScript开发出JavaScript
- 微软抄袭JavaScript开发脚本语言JScript
- ECMA(欧洲计算机制造商协会),制定标准ECMAScript,成为所有客户端脚本语言的标准
- 简而言之:JavaScript = ECMAScript + JavaScript(BOM + DOM)
2. ECMAScript
-
基本语法
-
与HTML的结合方式
- 内部JS:在HTML页面了定义script标签,在script内部写JavaScript代码
- 外部JS:在HTML页面了定义script标签,通过src属性引入外部js文件
- 注意:
- script标签的位置影响执行的顺序,是阻塞执行的
- Script标签可以定义在HTML页面的任意位置
-
注释
- 单行注释:// 注释内容
- 多行注释:/* 多行注释 */
-
数据类型
- 5种原始数据类型:
- number:数字,包括整数、小数、NaN
- string:字符串
- boolean:true和false
- null:一个对象为空的占位符
- undefined:未定义,变量没有给初始化值,默认赋值为undefined
- 引用数据类型:
- 数据类型转换:在JavaScript中,如果运算数不熟运算符要求的数据类型,那么js引擎会自动将运算数进行类型转换
- 其他类型转为number:
- string转为number:按照字面值进行转换,如果字面值无法转换,就转化为NaN
- boolean转为number:true转为1,false转为0
- 其他类型转boolean:
- number转boolean:0或者NaN为false,其他为true
- string转boolean:除了空字符串,其他全是true
- null&object转boolean:全是false
- 对象:所有对象全是true
- 其他类型转为number:
- 5种原始数据类型:
-
变量:一个存储数据的内存区域
- JavaScript是弱类型语言,在开辟变量存储空间时,不定义空间存储的数据类型,可以存储任意的数据类型
- 语法:var 变量名 = 变量值;
- 使用typeof运算符可以获取变量的类型,注意有一个小bug是ECMA沿用的JavaScript的小bug,typeof获取null的的类型是object
-
运算符
-
一元运算符:只有一个运算数 ++ 、--、 +(正号)
var s = +("123"); // 自动发生转换,转为number类型的123
-
算术运算符:+、- 、 * 、/
-
赋值运算符:=、+=、-=
-
比较运算符:>、<、、>= 、<=、=
-
类型相同的比较:直接比较
- string按照字典顺序、按位比较直到比出结果
-
类型不同的比较:先转换类型再比较
“123” == 123 //先进行类型转换返回true “123” === 123 // 在比较前先判断类型是否一致,返回false
-
-
逻辑运算符:&&、||、!
-
三元运算符:(表达式? 值1:值2)
-
-
流程控制语句:
- if...else
- switch:可以接收任意的原始数据类型
- while
- do...while
- for
-
JavaScript的一些特殊语法:
- 语句以分号结尾,当一行只有一条语句的时候可以省略分号
- 变量定义可以使用关键字var,但是也可以不使用
- 使用关键字var:定义的是局部变量
- 不使用关键字var:定义的是全局变量
-
3. 基本对象
-
Function:用来描述方法(函数)的对象
-
创建:
- var fun = new Function(形式参数列表,方法体);(不常用)
- function 方法名称(形式参数列表){方法体}
- var 方法名 = function(形式参数列表){方法体}
-
方法:
-
属性:
- 有一个length属性,表示形式参数的个数
-
特点:
-
定义方法不用写参数类型,因为都是var
-
方法是一个对象,如果定义名称相同的方法,那么后面回覆盖前面
-
在js中,方法的调用只与方法的名称有关,与参数列表无关,写几个参数都可以
-
在js方法的声明中,有一个隐藏的内置对象,是一个数组,名为
arguments
,用来封装调用时候传入的实际参数var sum = function () {// 返回值类型都是var,不用写 var ans = 0; for(i = 0; i < arguments.length; i++) { ans += arguments[i]; } return ans; } alert(sum(1,2,3)); alert(sum(1,2,3,4));
-
-
-
Array:
- 创建:
- var arr = new Array(元素列表);
- var arr = new Array(默认长度);
- var arr = [元素列表];
- 方法
- join(参数):将数组中的元素按照指定的分隔符将拼接成为一个字符串,无参数默认用“,”分割;
- push():向数组的末尾添加一个或者多个元素,返回值是新的数组长度;
- 属性
- 特点:
- 创建的时候只有一个值,那么就是表示数组的默认长度,有多个就表示元素列表
- 同一个数组可以有不同类型的元素,也就是可以装不同类型的元素;
- 数组的长度是可变的,使用到了会自动扩容
- 创建:
-
Boolean:相当于原始数据类型boolean的包装类
-
Date:
- 创建:var date = new Date();
- 方法:
- toLocaleString():返回当前date对象对应的时间本地字符串格式
- getTime():获取当前对象的毫秒值
-
Math:
- 创建:与java类似,不用创建对象,使用Math.方法名()
- 方法:
- random():返回0 - 1之间的随机数,包含0,不包含1
- ceil():天花板方法,向上取整
- floor():地板方法,向下取整
- round():四舍五入
-
Number:原始数据类型的包装类对象
-
String:原始数据类型的包装类对象
-
RegExp:正则表达式对象
- 正则表达式:定义字符串的组成规则
- 单个字符:[]
- 如:[a]——一个字母a,[ab]——a或者b,[a-zA-Z0-9_]——小写字母、大写字母、数字、下划线
- d——单个数字字符[0-9],w——单个单词字符[a-zA-Z0-9]
- 量词符号:
- *:出现0次或1一次
- ?:出现0次或多次
- +:出现一次或多次
- {m,n}:长度>=m && 长度 <= n;缺省m表示最多n次,缺省n表示最少m次
- 单个字符:[]
- 创建
- var reg = new RegExp("正则表达式");
- var reg = /正则表达式/
- 方法
- test(参数):验证字符串参数是否符合定义的规则
- 正则表达式:定义字符串的组成规则
-
Global:全局对象
-
特点:全局对象,这个对象的方法不需要对象可以直接使用:方法名()
-
方法:
-
encodeURL():URL编码
-
decodeURL():URL解码
-
encodeURLComponent():URL编码
-
decodeURLComponent():URL解码
var str = "你是猪吗"; var encode = encodeURI(str); document.write(encode + "<br>");// %E4%BD%A0%E6%98%AF%E7%8C%AA%E5%90%97 var decode = decodeURI(encode); document.write(decode + "<br>");// 你是猪吗
-
parseInt():将字符串转为数字,会逐一字符判断是否可以转为数字,直到无法转为数字
“1234”:1234 "1234abc”:1234
-
isNaN():判断一个值是否NaN
-
eval():将字符串转为js代码,并且执行该代码
var jscode = "alert(123)"; eval(jscode); // 弹出123
-
-
4. BOM对象
-
概念:Browser Object model,浏览器对象模型,将浏览器的各个组成部分封装成对象。
-
浏览器的对象:
-
window窗口对象:
- 创建:
- 方法:
- 与弹出框有关的方法:
- alert():显示一段消息以及一个确认按钮的警告框
- confirm():显示一段消息以及一个确认按钮和一个取消按钮
- 确定:返回true
- 取消:返回false
- prompt():显示可提示用户输入的对话框
- 返回值是用户输入的信息
- 与打开关闭有关的方法:
- open(参数):打开一个新窗口,返回新的一个Window对象,参数是URL,空参表示打开空白窗口
- close():关闭调用close()的对象,如
new_window.close()
关闭的是new_window窗口,默认是当前窗口
- 与定时器有关的方法:
- setTimeOut():在指定的毫秒数后调用函数或者计算表达式
- 参数:
- 参数1:js代码片段或者Function对象
- 参数2:毫秒值
- 返回值:定时器的名字
- 参数:
- clearTimeOut():取消由
setTimeOut()
方法设置的timeout- 参数:传入要取消的定时器
- setInterval():按照指定的周期(以毫秒计算)来调用函数或者计算表达式
- clearInterval():取消由
setInterval()
方法设置的interval
- setTimeOut():在指定的毫秒数后调用函数或者计算表达式
- 与弹出框有关的方法:
- 属性:
- 获取其他的BOM对象
- history
- location
- Navigator
- Screen
- 获取DOM对象
- document对象就是通过window对象获取的
- 获取其他的BOM对象
- 特点:
- Window对象不用创建,可以直接使用:window.方法名();
-
Location地址栏对象:
-
创建:通过window.location获取,或者直接history获取
-
方法:
- reload():重新加载当前文档,也就是刷新页面
-
属性:
- href:设置或者返回完整的URL
-
demo
// 5秒钟后自动跳转到百度 var second = 5; var showTime = function () { second--; if(second == 0) { location.href = "https://www.baidu.com"; } var time = document.getElementById("time"); time.innerHTML = second + ""; } setInterval(showTime, 1000);
-
-
History历史记录对象:
-
Navigator浏览器对象:
-
Screen屏幕对象:
-
5. DOM对象:Document Object Model
概念:定义了访问HTML和XML文档的标准,允许程序和脚本可以动态的访问和更新文档的内容、结构、样式;
W3C DOM标准被分为3个不同的部分:
- 核心DOM:针对任何结构化文档的标准模型
- Document:文档对象
- Element:元素对象
- Attribute:属性对象
- Text:文本对象
- Comment:注释对象
- Node:结点对象,是其他5个对象父对象
- XML DOM:针对XML文档的标准模型
- HTML DOM:针对HTML文档的标准模型
1.Document对象
- 创建(获取):使用window获取,window.document或者直接document
- 方法:
- 获取Element对象的方法:
- getElementById():根据id属性值获取元素对象,id属性值一般是唯一的
- getElementByTagName():根据元素名称获取对象们(全部同名的元素),返回一个元素对象的数组
- getElementByClassName():根据class属性的值获取元素对象们,返回一个数组;
- getElementByName() :根据name属性值获取元素对象们,返回一个数组
- 创建其他DOM对象的方法:
- createAttribute(name)
- createcomment():
- createElement():
- createTextNode():
- 获取Element对象的方法:
- 属性:
2. Element元素对象
- 创建(获取):通过document获取
- 方法:
- removeAttribute():删除属性
- setAttribute():设置属性
3. Node结点对象
-
特点:所有的DOM对象都可以认为一个Node对象
-
方法:
-
CRUD DOM树的方法
- appendChild():向节点的子节点列表的结尾添加新的节点;
- removeChild(参数):删除并返回当前节点的指定子节点
- replaceChild(参数1,参数2):用新节点替换原来的节点
del.onclick = function () { var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); div1.removeChild(div2); } var add = document.getElementById("add"); add.onclick = function () { var div1 = document.getElementById("div1"); var div3 = document.createElement("div"); div3.setAttribute("id", "div3"); div1.appendChild(div3); } // 点击连接希望连接不跳转,可以这样实现 <a href="javascript:void(0);" id="del">删除节点</a>
-
-
属性:parentNode获取到当前节点的父节点
6.HTML DOM
-
标签体的设置和获取:innerHTML
使用 += 添加子元素:
table.innerHTML += "<tr> " + " <td>"+id+"</td> " + " <td>"+name+"</td> " + " <td>"+gender+"</td> " + " <td><a href="javascript:void(0);" onclick="del(this);">删除</a></td> " + " </tr>";
-
使用HTML元素对象的属性
-
控制样式
var div1 = document.getElementsByTagName("div")[0]; div1.onclick = function () { // 1.使用style修改属性,style 是每一个标签都有的属性 div1.style.border = "1px solid green"; div1.style.width = "300px"; div1.style.fontSize = "20px"; } // 2. 提前定义好class选择器的样式,修改标签的class属性,那么提前定义好的样式就可以作用了 var div2 = document.getElementsByTagName("div")[1]; div2.onclick = function () { div2.className = "div2"; }
7.事件的监听机制
概念:某些组件被执行了某些操作之后,出发某些代码的执行
事件:单击、双击、按下键盘、鼠标移动等
事件源:按钮、文本输入框等
监听器:代码
-
常见的事件
-
点击事件:
- onclick:单击事件
- ondbclick:双击事件
-
焦点事件:
- onblur:失去焦点,一般用于表单校验,比如失去焦点后就应该校验用户输入的用户名是否存的、格式之类的。
- onfocus:元素获得焦点
-
加载事件:
- onload:一个页面、图片加载完成
- 一般给body、window绑定onload事件
- onload:一个页面、图片加载完成
-
鼠标事件:
-
onmousedown:鼠标按钮被按下
-
定义方法的时候可以给方法一个形式参数,用来接收event对象,该对象有一个属性button,可以获取是鼠标的哪一个键别按下了
username.onmousedown = function (event) { alert(event.button);// 鼠标三键左中右对应012 }
-
-
onmousemove:鼠标被移动
-
onmouseout:鼠标从元素移开
-
onmouseover:鼠标被移到某个元素之上
-
onmouseup:鼠标按钮被松开
-
-
键盘事件:
-
onkeydown:某个键盘按钮被按下
username.onkeydown = function(event) { alert(event.keyCode); }
-
onkeyup:某个键盘按钮被松开
-
onkeypress:某个键盘按钮被按下并松开
-
-
选择和改变:
- onchange:域的内容被改变
- onselect:文本该选中
-
表单事件:
-
onsubmit:确认按钮被点击
一般用来阻止表单提交,比如用户名校验不通过就阻止了,在方法里return false;
-
onreset:重置按钮被点击
-
-