DOM
Posted fengzi759
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DOM相关的知识,希望对你有一定的参考价值。
-
-
1.1什么是DOM:
-
文档对象模型(简称DOM),是W3C组织推荐的处理可扩展标记语言(html或XML)的标准编程接口
-
W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式
-
-
1.2DOM树
-
文档:一个页面就是一个文档,DOM中使用document表示
-
元素: 页面中的所有标签都是元素,DOM中使用element表示
-
节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示
-
-
-
获取元素
-
2.1如何获取页面元素
-
DOM在我们实际开发中主要用来操作元素
-
获取页面中的元素可以使用以下几种方式
-
根据ID获取
-
根据标签名获取
-
通过HTML5新增的方法获取
-
特殊元素获取
-
-
-
2.2根据ID获取
-
使用document.getElementById()方法可以获取带有ID的元素对象
-
+ < div id =‘time‘>2019-9-9< /div> + < script> + 1.//因为我们文档页面从上往下加载,所以先得有标签,所以我们script写到标签的下面 + 2.//get 获取 element 元素 by通过 驼峰命名法 + 3.参数id 是大小写敏感的字符串 + 4.返回的是一个元素对象 + 5console.dir 打印我们返回的元素对象,更好的查看里面的属性和方法 + var timer = document.getElementById(‘time‘) + console.dir(timer) + < /script>
-
-
-
2.3根据标签名获取
-
使用document.getElementsByTagName()方法可以返回带有指定标签名的对象的集合
-
+ 1.//返回的是 获取过来元素对象的集合,以伪元素的形式存储的 + var lis= document.getElementsByTagName(‘li‘) + 2.//打印里面的元素对象我们可以采取遍历的方式 得到元素对象是动态的 + for (var i = 0;i<lis.length;i++){ + console.log(lis[i]) + } + 3.element.getElementsByTagName() 可以得到这个元素里面的某些标签 + < ul id = ‘nav‘> + < li>aaa< /li> + < li>aaa< /li> + < li>aaa< /li> + < /ul> + 我们可以先获取ul元素 在获取ul里面的li元素 + var nav = document.getElementById(‘nav‘) //这个获得nav元素 + var navLis = nav.getElementByTagName(‘li‘) //获取ul里面的li标签
-
-
-
2.4通过HTML5新增的方法获取
-
+ 1.document.getElementsByClassName(‘类名‘);//根据类名返回元素对象集合 + 返回的也是一个伪数组 + 2.document.querySelector(‘选择器‘) ;//根据指定选择器返回第一个元素对象 + 里面的选择器需要加符号 .box #nav + document.querySelector(‘.box‘); 选择class名为box的选择器 第一个元素 + 3.document.querySelectorAll(‘选择器‘) //根据指定选择器返回所有元素对象集合 + document.querySelectorAll(‘#nav‘)
-
-
2.5获取特殊元素(body,html)
-
+ 1.获取body元素 + var bodyEle = document.body + console.log(bodyEle) + 2.获取html元素 + var htmlEle = document.documentElement + console.log(htmlEle )
-
-
-
事件基础
-
3.1事件概述
-
javascript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为
-
简单理解: 触发--响应机制
-
网页中的每个元素都可以产生某些可以触发JS的事件。例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作
-
1.事件是有三部分组成 事件源 事件类型 事件处理程序 我们也称为事件三要素
-
1 + < button id = ‘btn‘> 唐伯虎< /button> 2 + 1.1事件源 事件被触发的对象 谁 3 + var btn = document.getElementById(‘btn‘); 4 + 2.1事件类型 如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过,还是键盘按下 5 + 3.1事件处理程序 通过一个函数赋值的方式 完成 6 + btn.onclick = function(){ 7 + alert(‘点秋香‘) 8 + }
-
-
-
3.2执行事件步骤
-
+ < div>123< /div> + 1.获取事件源 + var div = document.getElementsByTagName(‘div‘)[0] + 2.注册事件(绑定事件) + 3.添加事件处理程序(采取函数赋值形式) + div.onclick = function(){ + console.log(‘我被选中了‘) + }
-
-
3.3常见的鼠标事件
-
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获取鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
-
操作元素
-
-
-
-
3.4操作元素
-
JS的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等。注意以下都是属性
-
1.改变元素内容
-
element.innerText
?+ 从起始位置到终止位置的内容,但它除去html标签,同时空格和换行也会去掉 + 示例代码如下 + < button> 显示当前系统时间< /button> + < div>某个时间 < /div> + //当我们点击了按钮,div里面的文字会发生变化 + //1.获取元素 + var btn = document.querySelector(‘button‘) + var div = document.querySelector(‘div‘) + //2.注册事件 + //3.添加事件处理 程序 + btn.onclick = function (){ + div.innerText = new Date() + }
-
element.innerHTML
-
起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行
-
-
innerText 和 innerHTML的区别:
-
1.innerText 不识别html标签 非标签 去除空格和换行
-
2.innerHTML 识别html标签 W3C标签 保留空格和换行的
-
这两个属性是可读写的,可以获取元素里面的内容
-
-
2常用元素的属性操作
-
修改元素属性 src href alt title
-
+ < button id = "ldh"> 刘德华< /button> + < button id = "zxy"> 张学友< /button> + <img src = "images/ldh.jpg" > + 1.获取元素 + var ldh = document.getElementById(‘ldh‘) + var zxy= document.getElementById(‘zxy‘) + var img = document.quertSelector(‘img‘) + 2.注册事件 处理程序 + zxy.onclick = function(){ + img.src = ‘images/zxy.jpg‘ + } + ldh .onclick = function(){ + img.src = ‘images/ldh.jpg‘ + }
-
-
3.表单元素的属性操作
-
利用DOM可以操作如下表单元素的属性:
-
type、value、checked、selected、disabled
-
示例如下
-
+ < button> 按钮< buttom> + < input type="text" value = "输入内容"> + 1.获取元素 + var btn = document.querySelector(‘button‘) + var input = document.querySelector(‘input‘) + 2.注册事件 处理程序 + btn.onclick = function(){ + input.value = ‘被点击了‘ + //如果想要某个表单被禁用,不能再点击 disabled 我们想要button禁用 + btn.disabled = true; 等价于 + this.disabled = true; //this指向的是事件函数的调用者 btn + }
-
-
-
4.样式属性操作
-
我们可以通过JS修改元素的大小、颜色、位置等
-
1.element.style 行内样式操作 如果样式比较少 或者功能简单的情况下使用
-
2.element.className 类名样式操作
-
示例如下
-
+ < div> </ div> + //1.获取元素 + var div = document.querySelector(‘div‘) + //2.注册事件 处理程序 + div.onclick = function(){ + //div.style 里面的属性采取驼峰命名法 + this.style.backgroundColor = ‘purple‘ + this.style.width = ‘250px‘ + }
-
-
注意:
-
JS里面的样式采取驼峰命名法 比如fontSize, backgroundColor
-
JS修改 style样式操作 产生的是行内样式,css权重比较高
-
-
2.element.className 的用法
-
+ .change{ + color : #ccc; + } + < div> 123< / div> + #想要div拥有颜色为#ccc这个属性,我们可以通过className修改div的类名从而获得#ccc这个属性 + var div = document.querySelector(‘div‘) + div.onclick = function(){ + this.className = ‘change‘ + }
-
-
注意:
-
1.如果样式修改较多,可以采取操作类型方法更改元素样式
-
2.class因为是个保留字,因此使用className来操作元素类名属性
-
3.className 会直接更改元素的类名,会覆盖原先的类名
-
4.如果想要保留 原先的类名,我们可以这么做 多类名选择器
-
this.className = ‘first change‘
-
-
-
-
-
排他思想
-
如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:
-
1.所有元素全部清除样式(干掉其他人)
-
2.给当前元素设置样式(留下我们自己)
-
3.注意顺序不能颠倒,首先干掉其他人,再设置自己
-
示例代码如下
-
+ < button>按钮1 </ button> + < button>按钮2 </ button> + < button>按钮3 </ button> + < button>按钮4 </ button> + < button>按钮5 </ button> + //1.获取所有元素 + var btns = document.getElementsByTagName = (‘button‘) + //btns得到是伪数组, 里面的每一个元素 btns[i] + for(var i = 0;i<btns.length;i++){ + btns[i].onclick = function(){ + • //(1)我们先把所有的按钮背景颜色去掉 + • for(var i = 0;i<btns.length;i++){ + • btns[i].style.backgroundColor = ‘‘; + } + • //(2) 然后才让当前的元素背景颜色为pink 留下我自己 + • this.style.backgroundColor = ‘pink‘ + } + } + //2. 首先先排除其他人,然后才设置自己的样式,这种排除其他人的思想我们称为排他思想
-
-
-
自定义属性的操作
-
1.获取属性值
-
+ element.属性 获取属性值 + element.getAttribute(‘属性‘) + 示例代码 + < div id = ‘demo‘> < /demo> + 获取id属性里面的值 + var div = document.querySelector(‘div‘) + div.getAttribute(‘id‘) //返回demo
-
区别:
-
element.属性 获取内置属性值(元素本身自带的属性)
-
element.getAttribute(‘属性‘); //注意获得自定义的属性(标准) 我们程序员自定义的属性
-
2.设置属性值
-
element.属性 = ‘值’ 设置内置属性值
-
element.setAttribute(‘属性‘,‘值‘); 主要针对于自定义属性
-
示例代码
-
+ < div id = ‘demo‘ index = ‘2‘> < /demo> + 改变div里面index属性的值 + var div = document.querySelector(‘div‘) + div.setAttribute(‘index‘,2)
-
-
区别:
-
element.属性 设置内置属性值
-
element.setAttribute(‘属性‘,‘值‘); 主要设置自定义的属性(标准)
-
-
3.移除属性
-
element.removeAttribute(‘属性‘)
-
示例代码
-
+ < div id = ‘demo‘ index = ‘2‘> < /div> + 移除div里面index属性的值 + var div = document.querySelector(‘div‘) + div.removeAttribute(‘index‘)
-
-
-
H5自定义属性
-
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中
-
自定义属性获取是通过getAttribute(‘属性‘) 获取。
-
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性
-
H5给我们新增了自定义属性:
-
1.设置H5自定义属性:
-
H5规定自定义属性data-开头做为属性名并且赋值
-
比如< div data-index = "1"> < /div>
-
或者通过JS设置
-
element.setAttribute(‘data-index‘,2)
-
-
-
-
2.获取H5自定义属性:
-
1.兼容性获取 element.getAttribute(‘data-index‘)
-
2.H5新增 element.dataset.index或者 element.dataset[‘index‘] ie11才支持
-
只能获取 data-开头的
-
dataset是一个集合里面存放了所有以data开头的自定义属性
-
示例代码
-
+ 比如< div data-index-name = "1"> < /div> + var div = document.querySelector(‘div‘) + //如果自定义属性里面有多个-链接的单词,我们获取的时候采取驼峰命名法 + div.dataset.indexName //返回1 + 或者 div.dataset[‘indexName‘] //返回1
-
-
-
-
-
-
节点操作
-
-
1.为什么学节点操作
-
获取元素通常使用两种方式
-
1.利用DOM提供的方法获取元素
-
document.getElementById()等
-
逻辑性不强 、繁琐
-
-
2.利用节点层级关系获取元素
-
利用父子兄节点关系获取元素
-
逻辑性强,但是兼容性稍差
-
-
节点概述
-
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示,HTML DOM树中的所有节点均可通过JS进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除
-
一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性
-
元素节点 nodeType 为1
-
属性节点 nodeType 为2
-
文本节点 nodeType 为3 (文本节点包含文字、空格、换行等)
-
我们在实际开发中,节点操作主要操作的是元素节点
-
-
-
节点操作
-
1.节点层级
-
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系
-
-
-
-
-
1父节点 parentNode
-
示例代码如下
-
< div class=‘box‘> + < span class = ‘erweima‘>x < /span> + < /div> + var erweima = document.querySelect(‘.erweima‘) + 获取box var box = document.querySelector(‘.box‘) 等价于 + erweima.parentNode 得到的是离元素最近的父节点 如果找不到父节点就返回Null
-
2子节点 parentNode.childNodes(标准)
-
parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合
-
示例代码如下
-
< ul> + < li>132< /li> + < /ul> + var ul = document.querySelector(‘ul‘) + ul.childNodes// 得到ul里面的li + 但是childNodes 包含所有的节点,包含元素节点 文本节点等等 + 如果只想要获得里面的元素节点,则需要专门处理,所以我们一般不提倡使用childNodes
-
parentNode.children(非标准)
-
parentNode.children 是一个只读属性,返回所有的子元素节点,它只返回子元素节点,其余节点不返回(这个是我们重点掌握的)
-
虽然children 人是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用 示例代码如下
-
+ < ul> + < li>132< /li> + < /ul> + var ul = document.querySelector(‘ul‘) + ul.children 获取所有的子元素节点li,也是我们实际开发常用的
-
parentNode.firstChild
-
firstChild返回第一个子节点,找不到则返回null。同样,也是包含所有的节点
-
不管是文本节点还是元素节点
parentNode.lastChild
-
lastChild返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.firstElementChild
-
firstElementChild返回第一个子元素节点,找不到返回null
parentNode.lastElementChild
-
lastElementChild返回第一个子元素节点,找不到返回null
-
这两个方法有兼容性问题,IE9以上才支持
实际开发的写法 既没有兼容性问题又返回第一个子元素 示例代码如下
-
-
+ < ul> + < li>132< /li> + < li>132< /li> + < li>132< /li> + < /ul> + var ul = document.querySelector(‘ul‘) + #获取第一个li + ul.children[0] + 获取最后一个li + ul.children[ul.children.length -1]
-
-
.兄弟节点
-
1.node.nextSibling
-
nextSibling 返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点
-
示例如下
-
< div>我是div< /div> + < span> 我是span < /span> + var div = document.querySelector(‘div‘) + console.log(div.nextSibling) #返回的是文本节点
-
-
2.node.previousSibling
-
previousSibling返回当前元素的上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点 元素节点或者文本节点等
-
3.node.nextElementSibling
-
nextElementSibling 返回当前元素的下一个兄弟节点,找不到则返回null
-
示例代码如下
-
+ < div>我是div< /div> + < span> 我是span < /span> + var div = document.querySelector(‘div‘) + console.log(div.nextSibling) #返回的是span标签
-
-
4.node.previousElementSibling
-
previousElementSibling返回当前元素的上一个兄弟节点,找不到则返回null。
-
4.创建节点
-
+ document.createElement(‘tagName‘) + document.createElement()方法创建由tagName指定的HTML元素,因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点 + //创建一个li + var li = document.createElement(‘li‘)
-
5.添加节点
-
1.node.appendChild(child)
-
node.appendChild()方法将一个节点添加到指定父节点的子节点列表的末尾,后面追加元素,类似于css里面after伪元素
-
示例代码如下
-
< ul>< /ul> + 1.#创建节点 + var li = document.createElement(‘li‘) + 2.添加节点 node.appendChild(child) node父级 child 是子级 + var ul = document.querySelector(‘ul‘) + ul.appendChild(li)
-
-
2.node.insertBefore(child,指定元素)
-
node.insertBefore()方法将一个节点添加到指定父节点的子节点列表的前面。类似于css里面的before元素 示例代码如下
-
+ < ul> + < li>123< /li> + < /ul> + 1.#创建节点 + var li = document.createElement(‘li‘) + 2.添加节点 node.insertBefore(child,指定元素) + ul.insertBefore(li,ul.children[0]) 在li的前面添加元素
-
-
3.我们想要页面添加一个新的元素:
-
1.创建元素 2.添加元素
-
-
-
6删除节点
-
node.removeChild(child)
-
node.removeChild()方法从DOM中删除一个子节点,返回删除的节点
-
< ul> + < li>123< /li> + < li>234< /li> + < /ul> + //1.获取元素 + var ul = document.querySelector(‘ul‘) + //2.删除元素 + ul.removeChild(ul.children[0]) #将第一个li删除了
-
7.复制节点(克隆节点)
-
node.cloneNode() 方法返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点
-
+ 示例代码如下 + < ul> + < li>123< /li> + < li>234< /li> + < /ul> + //1.获取元素 + var ul = document.querySelector(‘ul‘) + //2.克隆节点 + var li = ul.children[0].cloneNode() + //3.添加节点 + ul.appendChild(li)
-
注意:
-
如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点(内容)
-
如果node.cloneNode(true) 则是深拷贝,会复制节点本身以及里面所有的子节点(内容)
-
-
-
8.三种动态创建元素区别
-
+ document.write()
+ 用法:document.write(‘< div>123< /div>‘) 如果页面文档流加载完毕,再调用这句话会导致页面重绘
+ document.innerHTML
+ document.createElement() -
区别:
-
1.document.write是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
-
2.innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
-
3.innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结果稍微复杂
-
4.createElement()创建多个元素效率稍低一点点,但是结构更清晰
-
-
总结:不同浏览器下,innerHTML效率要比createElement高
-
-
-
DOM重点核心
-
-
关于dom操作,我们注意针对于元素的操作,主要有创建,增、删、改、查、属性操作、事件操作
-
1.创建
-
document.write()
-
document.innerHTML
-
document.createElement()
-
-
2.增
-
appendChild
-
insertBefore
-
-
3.删
-
removeChild
-
-
4.改
-
主要修改dom的元素属性,dom元素的内容、属性,表单的值等
-
1.修改元素的属性: src、href、title等
-
2.修改普通元素内容:innerHTML、innerText
-
3.修改表单元素:value、type、disabled等
-
4.修改元素样式:style、className
-
-
查
-
主要获取查询dom的元素
-
1.DOM提供的API方法:getElementById,getElementsByTagName 古老不太推荐
-
2.H5新增的新方法:querySelector、querySelectorAll提倡
-
3.利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling)提倡
-
-
属性操作
-
主要针对于自定义属性
-
1.setAttribute:设置dom的属性值
-
2.getAttribute:得到dom的属性值
-
3.removeAttribute移除属性
-
-
事件操作
-
给元素注册事件、采取 事件源.事件类型 = 事件处理程序
-
-
-
事件高级
-
-
1.注册事件(绑定事件)
-
注册事件概述
-
给元素添加事件,称为注册事件或者绑定事件
-
注册事件有两种方法: 传统方式和方法监听注册方式
-
传统注册方式
-
利用on开头的事件 onclick
-
< button onclick = ‘alert(hi~)‘>< /button>
-
btn.onclick = function(){}
-
特定:注册事件的唯一性
-
同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
-
方法监听注册方式
-
w3c标准 推荐方式
-
addEventListener()它是一个方法
-
IE9之前的IE不支持此方法,可使用attachEvent()代替
-
特点:同一个元素同一个事件可以注册多个监听器
-
addEventListener事件监听方式
-
eventTarget.addEventListener(type,listener[,userCapture])
-
eventTarget.addEventListener() 方法将指定的监听器注册到eventTarget(目标对象上),当该对象触发指定的事件时,就会执行事件处理函数
-
该方法接受三个参数:
-
type: 事件类型字符串,比如click、mouseover,注意这里不要带on
-
listener:事件处理函数,事件发生时,会调用该监听函数
-
userCapture: 可选参数,是一个布尔值,默认是false。学完DOM事件流后,我们再进一步学习
-
-
示例代码如下
-
+ < button>方法监听注册< /button> + var btns = document.querySelector(‘button‘) + btns.addEventListener(‘click‘,function(){ 里面的事件类型是字符串要加引号 + alert(22) + }) + btns.addEventListener(‘click‘,function(){ + alert(33) + }) + 会弹出22和33 + 第二种写法 + fucntion fn(){ + alert(22) + } + btns.addEventListener(‘click‘,fn)
-
-
-
attachEvent事件监听方式(了解) IE9以前的版本支持 其他浏览器不支持
-
eventTarget.attachEvent(eventNameWithOn,callback)
-
eventTarget.attachEvent()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定的回调函数就会被执行
-
该方法接受两个参数:
-
eventNameWithOn:事件类型字符串,比如onclick,onmouseover,这里要带on
-
callback:事件处理函数,当目标触发事件时回调函数被调用
-
-
示例代码如下
-
+ < button>方法监听注册< /button> + var btns = document.querySelector(‘button‘) + btns.attachEvent(‘onclick‘,function(){ + alert(11) + })
-
-
-
-
2.删除事件(解绑事件)
-
删除事件的方式
-
1.传统删除方式
-
eventTarget.onclick = null;
-
-
2.方法监听删除方式
-
2.1eventTarget.removeEventListener(type,listener[,userCapture])
-
示例代码如下
-
+ fucntion fn(){ + alert(22) + btns.removeEventListener(‘click‘,fn) + } + btns.addEventListener(‘click‘,fn)
-
-
2.2 eventTarget.detachEvent(eventNameWithOn,callback)
-
示例代码如下
-
+ fucntion fn(){ + alert(22) + btns.detachEvent(‘onclick‘,fn) + } + btns.attachEvent(‘onclick‘,fn)
-
-
-
-
3.DOM事件流
-
事件流描述的是从页面中接受事件的顺序
-
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
-
DOM事件流分为3个阶段
-
1.捕获阶段
-
2.当前目标阶段
-
3.冒泡阶段
-
事件冒泡:IE最早提倡,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程
-
事件捕获:网景最早提出,由DOM最顶层节点开始,然后逐渐向下传播到最具体的元素接收的过程
-
注意:
-
1.JS代码中只能执行捕获或者冒泡其中的一个阶段
-
2.onclick和attachEvent只能得到冒泡阶段
-
3.eventTarget.addEventListener(type,listener[,userCapture])第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序
-
4.实际开发中我们很少使用事件捕获,我们更关注事件冒泡
-
5.有些事件是没有冒泡的,比如onblur,onfocus,onmouseenter,onmouseleave
-
6.事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事情
-
-
4.事件对象(重点)
-
事件对象概述
-
div.onclick = function(event){
-
//1.event 就是一个事件对象,写到我们监听函数里面的,小括号里面,当形参来看
-
//2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
-
//3.事件对象 是我们事件的一系列相关数据的集合,跟事件相关的,它有很多属性和方法,比如鼠标点击里面就包含了鼠标的信息,鼠标坐标啊,如果是键盘事件里面就包含的键盘事件的信息,比如判断用户按下了那个键
-
//4. 这个事件对象我们可以自己命名 比如event、evt、e
-
//5.事件对象也有兼容性问题 ie678 通过window.event 兼容性写法 e = e||window.event
-
}
-
事件对象的常见属性和方法
-
-
-
事件对象属性方法 | 说明 |
---|---|
e.target | 返回触发事件的对象 标准 |
e.srcElement | 返回触发事件的对象 非标准 ie6-8使用 |
e.type | 返回事件的类型 比如click mouseover 不带on |
e.canceIBubble | 该属性阻止冒泡 非标准 ie6-8使用 |
e.returnValue | 该属性阻止默认事件(默认行为), 非标准 ie6-8使用 比如不让链接跳转 |
e.preventDefault() | 该方法阻止默认事件(默认行为) 标准 比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡 标准 |
-
-
-
-
e.target返回的是触发事件的对象(元素),this返回的是绑定事件的对象(元素)
-
区别:e.target点击了哪个元素,就返回那个元素, this哪个元素绑定了这个点击事件,那么就返回谁
-
了解, 跟this有个非常相似的属性 e.currentTarget ie678不认识
-
-
我们可以利用return false 也能阻止默认行为 没有兼容性问题 特点: return 后面的代码不执行了,而且只限于传统的注册方式
-
-
-
5.阻止事件冒泡
-
1.阻止事件冒泡的两种方式
-
事件冒泡: 开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
-
事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要我们灵活掌握
-
1.标准写法:利用事件对象里面的stopPropagation()方法
-
2.非标准写法 ie6-8使用 e.cancelBubble
-
-
-
6.事件委托(代理、委派)重点
-
事件委托也称为事件代理,在jQuery里面称为事件委派
-
事件委托的原理(重点)
-
不是每个子节点单独设置事件监听器,而是事件监听器设置在父节点上,然后利用冒泡原理影响设置每个子节点
-
以上案例:给ul注册点击事件,然后利用事件对象的target来找到当前点击的li,因为点击li,事件会冒泡到ul上,ul有注册事件,就会触发事件监听器
-
-
-
事件委托的作用
-
我们只操作了一次DOM,提高了程序的性能
-
-
-
7.常用的鼠标事件
-
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获取鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
-
-
-
1.禁止鼠标右键菜单
-
contextmenu主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单
? + document.addEventListener(‘contextmenu‘,function(e){ + e.preventDefault() + })
-
-
2.禁止鼠标选中(selectstart 开始选中)
-
+ document.addEventListener(‘selectstart‘,function(e){ + e.preventDefault() + })
-
-
鼠标事件对象
-
event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent和键盘事件对象KeyboardEvent
-
-
-
鼠标事件对象 | 说明 |
---|---|
e.clientX | 返回鼠标相对于浏览器窗口可视区的X坐标 |
e.clientY | 返回鼠标相对于浏览器窗口可视区的Y坐标 |
e.pageX | 返回鼠标相对于文档页面的X坐标 IE9+ 支持 |
e.pageY | 返回鼠标相对于文档页面的Y坐标 IE9+ 支持 |
e.screenX | 返回鼠标相对于电脑屏幕的X坐标 |
e.screenY | 返回鼠标相对于电脑屏幕的Y坐标 |
-
-
8常用键盘事件
-
事件除了使用鼠标触发,还可以使用键盘触发
-
-
键盘事件 | 触发事件 |
---|---|
onkeyup | 某个键盘按键被松开时触发 |
onkeydown | 某个键盘按键被按下时触发 |
onkeypress | 某个键盘按键被按下时 触发 但是它不识别功能键 比如 ctrl shift箭头 |
-
-
-
三个事件的执行顺序 keydown ---keypress --- keyup
-
键盘事件对象
-
-
键盘事件对象属性性 | 说明 |
---|---|
keyCode | 返回该键的ASCII值 |
-
-
-
-
注意:
-
onkeydown和onkeyup 不区分字母大小写,a和A得到的都是65
-
onkeypress区分字母大小写
-
我们可以利用keycode返回的ASCII码值来判断用户按下了哪个键
-
-
-
-
-
以上是关于DOM的主要内容,如果未能解决你的问题,请参考以下文章