第十一章 JavaScript对象
11.1 对象
11.1.1 什么是对象
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
对象是由属性和方法组成的。
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示(常用名词)
11.1.2为什么需要对象
保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。
11.2 创建对象的三种方式
在JavaScript中,现阶段我们可以采用三种方式创建对象(object):
- 利用字面量创建对象
- 利用new Object创建对象
- 利用构造函数创建对象
11.2.1 利用字面量创建对象
对象字面量:就是花括号{}里面包含了表达这个具体事物(对象)的属性和方法。
{}里面采取键值对的形式表示
- 键:相当于属性名
- 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型、函数类型等)
var star={
name:'pink',
age:18,
sex:'男',
sayHi:function(){
alert('hello');
}
};
对象的调用
- 对象里面的属性调用:对象.属性名,这个小点.就理解为“的”
- 对象里面属性的另一种调用方式:对象[‘属性名’],注意方括号里面的属性必须加引号
- 对象里面的方法调用:对象.方法名(),注意这个方法名字后面一定加括号
console.log(star.name);
console.log(star['name']);
star sayHi();
变量、属性、函数、方法总结
- 变量:单独声明赋值,单独存在
- 属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
- 函数:单独存在的,通过“函数名()”的方式就可以调用
- 方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()"的方式就可以调用,方法用来描述该对象的行为和功能
11.2.2 利用new Object创建对象
与newArray()原理一致
11.2.3 利用构造函数创建对象
构造函数:是一种特殊的函数,主要用来初始化的对象,即为对象成员变量赋初始值,他总与new运算符一起使用。
2.2.4 构造函数和对象
- 构造函数,如Stars(),抽象了对象的公共部分,封装了函数里面,他泛指某一大类(class)
- 创建对象,如new Stars(),特指某一个,通过new关键字创建对象的过程我们也称为对象实例化
11.3 new关键字
new关键字执行过程
- new构造函数可以在内存中创建一个空的对象
- this就会指向刚才创建的空对象
- 执行构造函数里面的代码给这个空对象添加属性和方法
- 返回这个对象
function Star(uname, age, sex) {
this.name = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(sang);
}
}
var 1 dh = new Star('张三', 18, '男');
11.4遍历对象属性
for…in语句用于对数组或者对象的属性进行循环操作。
第十二章 JavaScript内置对象
12.1内置对象
- JavaScript中的对象分为3种:自定义对象、内置对象、浏览器对象
- 前面两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于JS独有的
- 内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)
- 内置对象最大的优点就是帮助我们快速开发
- JavaScript提供了多个内置对象:Math、Date、Array、String等
12.2 查文档
12.2.1 MDN
学习一个内置对象的使用,只要学会其常用成员的使用即可,我们可以通过查文档学习,可以通过MDN/W3C来查询
Mozilla开发者网络(MDN)提供了有关开放网络技术(Open Web)的信息,包括HTML、CSS和万维网及HTML5应用的API
12.2.2 如何学习对象中的方法
- 查阅该方法的功能
- 查看里面参数的意义和类型
- 查看返回值的意义和类型
- 通过demo进行测试
12.3Math对象
12.3.1 Math概述
Math对象不是构造函数,它具有数字常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整,最大值等)可以使用Math中的成员。
Math.PI //圆周率
Math.floor() //向下取整
Math.ceil() //向上取整
Math.round() //四舍五入 就近取整 注意:-3.5 结果是-3
Math.abs() //绝对值
Math.max() //最大值
Math.min() //最小值
12.3.2 随机方法random()
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
12.4 日期对象
12.4.1 date概述
- Date对象和Math对象不一样,他是一个构造函数,所以我们需要实例化后才能使用
- Date实例用来处理日期和时间
12.4.2 Date()方法的使用
1. 获取当前时间必须实例化
var now = new Date();
console.log(new);
2. Date()构造函数的参数
如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为‘2022-9-8’,可以写成new Date(‘2022-9-8’)或者new Date(‘2022/9/8’)
12.4.3 日期格式化
我们想要2022-9-8 8:8:8格式的日期要怎么办
需要获取日期指定的部分,所以我们要动手的得到这种格式
方法名 | 说明 | 代码 |
---|---|---|
getFullYear() | 获取当年 | dObj.getFullYear() |
getMounth() | 获取当月(0-11) | dObj.getMounth() |
getDate() | 获取当天日期 | dObj.getDate() |
getDay() | 获取星期几(周日0 到 周六6) | dObj.getDay() |
getHours() | 获取当前小时 | dObj.getHours() |
getMinutes() | 获取当前分钟 | dObj.getMinutes() |
getSeconds() | 获取当前秒 | dObj.getSeconds() |
12.4.4获取日期的总的毫秒形式
Date对象是基于1970年1月1日(世界标准时间)起的毫秒数
//获得Date总的毫秒数(时间戳)不是当前时间的毫秒数而是距离1970年1月1日过了多少毫秒数
//1.通过valueOf() getTime()
var date=new Date();
console.log(date.valueOf()); //现在时间距离1970.1.1总的毫秒数
console.log(date.getTime());
//2.简单的写法(最常用的写法)
var date1= +new Date(); // +new Date() 返回的是总的毫秒数
console.log(date1);
//3.H5新增的 获得总的毫秒数
console.log(date.now());
12.5 数组对象
12.5.1 创建数组对象的两种方式
- 字面量方式
var arr=[1,2,3];
console.log(arr[0]);
- new Array()
//var arr1=new Array(); //创建了一个空数组
//var arr1=new Array(2); //这个2表示数组长度为2里面有2个空的数组元素
var arr1=new Array(); //等价于[2,3]这样写表示里面有2个数组元素是2和3
console.log(arr1);
12.5.2 检测是否为数组
- instanceof 运算符 它可以用来检测是否为数组
console.log(arr instanceof Array);
console.log(obj instanceof Array);
- Array.isArray(参数);H5新增的方法 ie9以上版本支持
console.log(Array.isArray(arr));
console.log(Array.isArray(obj));
12.5.3 添加删除数组元素的方法
方法名 | 说明 | 返回值 |
---|---|---|
push(参数1…) | 末尾添加一个或多个元素,注意修改原数组 | 并返回新的长度 |
pop() | 删除数组最后一个元素,把数组长度减1无参数、修改原数组 | 返回它删除的元素的值 |
unshift(参数1…) | 向数组的开头添加一个或多个元素,注意修改原数组 | 并返回新的长度 |
shift() | 删除数组第一个元素,数组长度减1无参数、修改原数组 | 并返回第一个元素的值 |
12.5.4 数组排序
方法名 | 说明 | 是否修改原数组 |
---|---|---|
reverse() | 颠倒数组中元素的顺序,无参数 | 该方法会改变原来的数组 返回新数组 |
sort() | 对数组的元素进行排序 | 该方法会改变原来的数组返回新数组 |
//1.翻转数组
var arr=['blue','red','green'];
arr.reverse();
console.log(arr);
//2.数组排序(冒泡排序)
var arr1=[3,4,7,1];
arr1.sort(function(a,b){
//return a-b; 升序的顺序排列
return b-a;//降序的顺序排列
});
console.log(arr1);
12.5.5 数组索引方法
方法名 | 说明 | 返回值 |
---|---|---|
indexOf() | 数组中查找给定元素的第一个索引 | 如果存在返回索引号如果不存在,则返回-1 |
lastlndexOf() | 在数组中的最后一个的索引 | 如果存在返回索引号如果不存在,则返回-1 |
var arr=['blue','red','green'];
console.log(arr.indexOf('blue'));
console.log(arr.lastindexOf('blue'));
12.5.6 数组转换为字符串
方法名 | 说明 | 返回值 |
---|---|---|
toString() | 把数组转换成字符串,逗号分隔每一项 | 返回一个字符串 |
join(‘分隔符’) | 方法用于把数组中的所有元素转换为一个字符串 | 返回一个字符串 |
12.6 字符串对象
12.6.1 基本包装类型
为了方便操作基本数据类型,JavaScript还提供了三个特殊的引用类型:String、Number和Boolean。
基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。
//下面代码有什么问题
var str='andy';
console.log(str.length);
按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可执行,这是因为js会把基本数据类型包装为复杂数据类型,其执行过程如下:
//1.生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
//2.赋值给我们声明的字符变量
str = temp;
//3.销毁临时变量
temp = null;
12.6.2 字符串的不可变
指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。
var str = 'abc';
str = 'hello';
//当重新给str赋值的时候,常量'abc'不会被修改,依然在内存中
//重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
//由于字符串的不可变,在大量拼接字符串的时候会有效率问题
var str = '';
for (var i = 0; i < 100000; i++) {
str += i;
}
console.log(str); //这个结果需要花费大量时间来显示,因此需要不断的开辟新的空间
12.6.3 根据字符返回位置
字符串所有的方法,都不会被修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
var str='12345634';
console.log(str.indexOf('3')); //从索引号是3的位置开始往后查找
12.6.4 根据位置返回字符
方法名 | 说明 | 使用 |
---|---|---|
charAt(index) | 返回指定位置的字符(index 字符串的索引号) | str.charAt(0) |
charCodeAt(index) | 获取指定位置处字符的ASCII码(index索引号) | str.charCodeAt(0) |
str[index] | 获取指定位置处字符 | HTML5,IE8+支持 和charAt()等效 |
12.6.5 字符串操作方法
方法名 | 说明 |
---|---|
concat(str1,str2,str3…) | concat()方法用于连接两个或多个字符串。拼接字符串,等效于+,+更常用 |
substr(start,length) | 从start位置开始(索引号),length取的个数 重点记 |
slice(start,end) | 从start位置开始截取到end位置,end取不到(他们俩都是索引号) |
substring(start,end) | 从start位置开始,截取到end位置,end取不到 基本和slice相同但是不接受负值 |
第十三章 JavaScript简单类型与复杂类型
13.1 简单类型与复杂类型
简单数据类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
- 值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型
string,number,boolean,undefined,null - 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型
通过new关键字创建的对象(系统对象、自定义对象),如Object、Array、Date等
13.2 堆和栈
堆栈空间分配区别:
- 栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;
简单数据类型存放到栈里面 - 堆(操作系统):存储复杂类型(对象),一般由程序员不释放,由垃圾回收机制回收。
复杂数据类型存放到堆里面
注意:JavaScript中没有堆栈的概念、通过堆栈的方式,可以让我们更容易理解代码的一些执行方式。
13.3 简单类型的内存分配
- 值类型(简单数据类型):string,number,boolean,undefined,null
- 值类型变量的数据直接存放在变量(栈空间)中
13.4 复杂类型的内存分配
- 引用类型(复杂数据类型):通过new关键字创建的对象(系统对象、自定义对象),如Object、Array、Date等
- 引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
13.5简单类型传参
函数的形参也可以看作是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。
function fn(a) {
a++;
console.log(a);
}
var x = 10;
fn(x);
console.log(x);
13.6 复杂类型传参
函数的形参也可以看作是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。
function Person(name) {
this.name = name;
}
function f1(x) {
console.log(x.name);
x.name = "张三";
console.log(x.name);
}
var p = new Person("张三");
console.log(p.name);
f1(p);
console.log(p.name);
第十三章 Web APIs
13.1 Web APIs和JS基础关联性
13.1.1 JavaScript基础阶段以及Web APIs阶段
JavaScript基础阶段
- 学习的是ECMAScript标准规定的基本语法
- 要求掌握js基础语法
- 只学习基本语法,做不了常用的网页交互效果
- 目的是为了js后面的课程打基础、做铺垫
Web APIs阶段
Web APIs是W3C组织的标准
Web APIs主要学习DOM和BOM
Web APIs是我们js所独有的部分
主要学习页面交互功能
需要使用js基础的课程内容做基础
JS基础学习 ECMAScript基础语法为后面做铺垫,Web APIs是JS的应用,大量使用JS基础语法做交互兄效果
13.2 API和Web API
13.2.1 API
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
简单理解:API是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
13.2.2 Web API
Web APIs是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)
现阶段我们主要针对于浏览器讲解常用的API,主要针对浏览器做交互效果
比如我们想要浏览器弹出一个警示框,直接使用alert(‘弹出’)
MDN详细API:https://developer.mozilla.org/zh-CN/docs/Web/API
因为Web API很多,所以我们将这个阶段称为Web APIs
第十四章 DOM
14.1 DOM简介\
14.1.1 什么是DOM
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理器可扩展标记语言(HTML或者XML)的标准编程接口
W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。
14.1.2 DOM树
- 文档:一个页面就是一个文档,DOM中使用document表示
- 元素:页面中的所有标签都是元素,DOM中使用element表示
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示
DOM把以上内容都看作是对象
14.2 获取元素
14.2.1 如何获取页面元素
DOM在我们实际开发中主要用来操作元素
获取页面中的元素可以使用一下几种方式:
- 根据ID获取
- 根据标签名获取
- 通过HTML5新增的方法获取
- 特殊元素获取
14.2.2 根据ID获取
使用getElementByld()方法可以获取带有ID的元素对象
14.2.3 根据标签名获取
使用getElementsByTagName()方法可以返回带有指定标签名的对象的集合
var lis=document.getElementsByTagName('li');
console.log(lis);
注意:
- 因此得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历。
- 得到元素对象是动态的
还可以获取某个元素(父元素)内部所有指定标签名的子元素
element.getElementsByTagName('标签名');
注意:
3. 父元素必须是单个对象(必须指明是哪一个元素对象).获取的时候不包括父元素自己。
14.2.4 通过HTML5新增的方法获取
document.getElementsByClassName('类名');//根据类名返回元素对象集合
document.querySelector('选择器');//根据指定选择器返回第一个元素对象
document.querySelectorAll('选择器');//根据指定选择器返回
14.2.5 获取特殊元素(body,html)
获取body元素
document.body //返回body元素对象
获取html元素
document.documentElement //返回html元素对象
14.3 事件基础
14.3.1 事件概述
JavaScript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为。
简单理解:触发—响应机制
网页中的每个元素都可以产生某些可以触发JavaScript的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作
14.3.2 执行事件的步骤
- 获取事件源
- 注册事件(绑定事件)
- 添加事件处理程序(采取函数赋值形式)
14.3.3 常见的鼠标事件
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
14.4 操作系统
JavaScript的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等。
14.4.1 改变元素内容
element.innerText
从起始位置到终止位置的内容,但他去除html标签,同时空格和换行也会去掉
element.innerHTML
起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行
14.4.2 常用元素的属性操作
- InnerText、innerHTML改变元素内容
- src、href
- id、alt、title
14.4.3 表单元素的属性操作
利用DOM可以操作如下表单元素的属性:
type、value、checked、selected、disabled
14.4.4 样式属性操作
可以通过js修改元素的大小、颜色、位置等样式。
- element.style 行内样式操作
- element.className 类名样式操作
注意: - js里面的样式采取驼峰命名法比如 fontSize、backgroundColor
- js修改style样式操作,产生的是行内样式,css权重比较高
我们可以通过js修改元素的大小、颜色、位置等样式。
- element.style 行内样式操作
- element.className 类名样式操作
注意: - 如果样式修改较多,可以采取操作类名方式更改元素样式。
- class因为是个保留字,因此使用className来操作元素类名属性。
- className会直接更改元素的类名,会覆盖原先的类名。
14.4.5 自定义属性的操作
- 获取属性值
element.属性 获取属性值。
element.getAttribute('属性 ');
区别:
elemrnt.属性 获取内置属性值(元素本身自带的属性)
element.getAttribute(‘属性’);主要获得自定义的属性(标准) - 设置属性值
element.属性=‘值’设置内置属性值。
element.setAttribute(‘属性’,‘值’); - 移除属性
element.removeAttribute(‘属性’);
14.4.6 H5自定义属性
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute(‘属性’)获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
H5新增了自定义属性:
- 设置H5自定义属性data-开头作为属性名并且赋值
比如
element.setAttribute(‘data-index’,2) - 获取H5自定义属性
- 兼容性获取 element.getAttribute(‘data-index’);
- H5新增element,dataset.index 或者element.dataset[‘index’] ie11才开始支持
14.5 节点操作
14.5.1 为什么学节点操作
获取元素通常使用两种方式:
- 利用DOM提供的方法获取元素
- document.getElementById()
- document.getElementByTagName()
- document.querySelector等
- 逻辑性不强、繁琐
- 利用节点层级关系获取元素
- 利用父子兄节点关系获取元素
- 逻辑性强,但是兼容性稍差
这两种方式都可以获取元素节点
14.5.2 节点概述
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,借点使用node来表示
HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有node Type(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性
- 元素节点 nodeType 为1
- 属性节点 nodeType 为2
- 文本节点 nodeType 为3(文本节点包含文字、空格、换行等)
在实际开发中,节点操作主要操作的是元素节点
14.5.3 节点层级
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
- 父级节点
node.parentNode
- parentNode属性可返回某节点的父节点,注意是最近的一个父节点
- 如果指定的节点没有父节点则返回null
- 子节点
- parentNode.childNodes(标准)
parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合
注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。
如果只想要获得里面的元素节点,则需要专门处理。一般不提倡使用childNodes
var ul = document.querySelector('ul');
for (var i = 0; i < ul.childNodes.length; i++) {
if (ul.childNodes[i].nodeType == 1) {
//ul.childNodes[i]是元素节点
console.log(ul.childNodes);
}
}
- parentNode.children(非标准)
paeentNode.children是一个只读属性,返回所有的子元素节点。他只返回子元素节点,其余节点不返回。
虽然children是一个非标准,但是得到了各个浏览器的支持。
3.parentNode.firstChild
firstChild返回第一个子节点,找不到则返回null。同样,也包含所有的节点。
4.parentNode.lastChild
5.parentNode.firstElementChild
firstElementChild返回第一个子元素节点,找不到则返回null
6.parentNode.lastElementChild
lastElementChild 返回最后一个子元素节点,找不到则返回null
注意:这两个方法有兼容性问题,IE9以上才支持
3. 兄弟节点
- node.nextSibling
nextSibling返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。
- node.previousSibling
previousSibling返回当前元素的上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。
- node.nextElementSibling
node.nextElementSibling返回当前元素下一个兄弟元素节点,找不到则返回null
注意:这两个方法有兼容性问题,IE9以上才支持。
14.5.4 创建节点
document.createElement(‘tagName’)
document.createElement()方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。
14.5.5 添加节点
node.appendChild(child)
node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾。类似于scc里面的after伪元素。
node.insertBefore(child,指定元素)
node.insertBefore()方法将一个节点添加到父节点的指定子节点前面。类似于css里面的before伪元素。
14.5.6 删除节点
node.removeChild(child)
node.removeChild()方法从DOM中删除一个子节点,返回删除的节点
14.5.7 复制节点(克隆节点)
node.cloneNode()
node.cloneNode()方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点
注意:
- 如果括号参数为空或者为false,则是浅拷贝,即只科隆复制节点本身,不克隆里面的子节点。
- 如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点
14.6 DOM重点核心
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。
W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。
- 对于JavaScript,为了能够是JavaScript操作HTML,JavaScript就有了一套自己的dom编程接口。
- 对于HTML、DOM使得html形成一颗dom树、包含文档、元素、节点
关于DOM操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。
14.6.1 创建
- document.write
- innreHTML
- createElement
14.6.2 增
- appendChild
- insertBefore
14.6.3 删
- removeChild
14.6.4 改
主要修改dom的元素属性,dom元素的内容、属性、表单的值等
- 修改元素属性:src、href、title等
- 修改普通元素内容:innerHTML、innerText
- 修改表单元素:value、type、disabled等
- 修改元素样式:style、className
14.6.5 查
主要获取查询dom的元素
- DOM提供的API方法:getElementById、getElementsTagName古老用法不推荐
- H5提供的新方法:querySelector、querySelectorAll提倡
- 利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling) 提倡
第十五章 事件高级
15.1 注册事件(绑定事件)
15.1.1 注册事件概述
给元素添加事件,称为注册事件或者绑定事件。
注册事件有两种方式:传统方式和方法监听注册方式
传统注册方式
- 利用on开头的事件onclick
- btn.οnclick=function(){}\
- 特点:注册事件的唯一性
- 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
方法监听注册方式
15.1.2 addEventListener 事件监听方式
eventTarget.addEventListener(type,listener[,useCapture])
eventTarget.addEventListener()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。
该方法接收三个参数:
- type:事件类型字符串,比如click、mouseover,注意这里不要带on
- listener:事件处理函数,事件发生时,会调用该监听函数
- useCapture:可选参数,是同一个布尔值,默认是false。
eventTarget.attachEvent(eventNameWithOn,callback)
eventTarget.attachEvent()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定的回调函数就会被执行。
该方法接收两个参数:
- eventNameWithOn:事件类型字符串,比如onclick、onmouseover,这里要带on
- callback:事件处理函数,当目标触发事件时回调函数被调用
15.2 删除事件(解绑事件)
15.2.1 删除事件的方式
- 传统注册方式
evenTarget.οnclick=null; - 方法监听注册方式
evenTarget.removeEventListener(type,listener[,useCapture]);
evenTarget.detachEvent(eventNameWithOn,callback);
15.3 DOM事件流
事件流描述的是从页面接收事件的顺序
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
DOM事件流分为3个阶段:
- 捕获阶段
- 当前目标阶段
- 冒泡阶段
- 事件冒泡:IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程
- 事件捕获:网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到到最具体的元素接收的过程。
注意:
- js代码中只能执行捕获或者冒泡其中的一个阶段。
- onclick和attachEvent只能得到冒泡阶段。
- addEventListener(type,listener[,useCapture])第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认是false),表示在事件冒泡阶段用事件处理程序。
- 实际开发中很少使用事件捕获,我们更关注事件冒泡
- 有些事件没有冒泡,比如 onblur、onfocus、onmouseenter、onmouseleave
- 事件冒泡有时会带来一些麻烦,有时候又会帮助很巧妙的做某些事件
15.4 事件对象
15.4.1 什么是事件对象
event对象代表事件状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态
15.4.2 事件对象的使用语法
eventTarget.onclick=function(event){
//这个event就是事件对象,我们还可以写成e或evt
}
eventTarget.addEventListener('click',function(event){
//这个event就是事件对象,可以写成e或evt
})
event是形参,系统帮我们设定为事件对象,不需要传递实参过去
当我们注册事件时,event对象就会被系统自动创建,并依次传递给事件监听器(事件处理函数)
15.4.3 事件对象的常见属性和方法
事件对象属性方法 | 说明 |
---|---|
e.target | 返回触发事件的对象 标准 |
e.srcElement | 返回触发事件的对象 非标准 ie6-8使用 |
e.type | 返回事件的类型 比如click mouseover 不带on |
e.cancelBubble | 该属性组织冒泡 非标准 ie6-8使用 |
e.returnValue | 该属性阻止默认事件(默认行为) 非标准ie6-8使用 比如不让链接跳转 |
e.preventDefault() | 该方法阻止默认事件(默认行为) 标准 比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡 标准 |
15.5 阻止事件冒泡
15.5.1 阻止事件冒泡的两种方式
事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
事件冒泡本身的特性,会带来坏处,也会带来好处。
阻止事件冒泡
- 标准写法:利用事件对象里面的stopPropagation()方法
e.stopPropagation() - 非标准写法:IE6-8利用事件对象cancelBubble
15.6 常用的键盘事件
15.6.1 常用键盘事件
事件除了使用鼠标触发,还可以使用键盘触发
键盘事件 | 触发条件 |
---|---|
onkeyup | 某个键盘按键被松开时触发 |
onkeydown | 某个键盘按键被按下时触发 |
onkeypress | 某个键盘按键被按下时触发 但是他不识别功能按键 比如Ctrl shift 箭头等 |
注意:
- 如果使用addEventListener不需要加on
- onkeypress和前面2个区别是,他不识别功能键,比如左右箭头,shift等
- 三个事件的执行顺序是keydown–keypress–keyup
15.6.2 键盘事件对象
键盘事件对象 | 说明 |
---|---|
keyCode | 返回该键的ASCII值 |
注意:onkeydown和inkeyup不区分字母大小写 ,onkeypress区分字母大小写
在实际开发中,更多使用keydown和keyup,它能识别所有的键(包括功能键)
keypress不识别功能键,但是keyCode属性能区分大小写,返回不同的ASCII值