JS
代码不要紧),当咱们去操做元素的时候会触发元素的不少事件DOM0 事件绑定javascript
element.onclick=function(e){ //=>this:element e=e||window.event; element.onmouseenter=function(){}
null
,若是咱们给赋值一个函数,至关于绑定了一个方法)DOM
元素和赋值的函数创建关联,以及创建 DOM
元素行为操做的监听,当某一个行为被用户触发,浏览器会把相关行为赋值的函数执行null
便可btn.onclick = function() { console.log("this is a click event"); };
click
事件并无像其余函数同样,必需要调用才能够执行,click 事件并不肯定何时发生,而当浏览器发现用户点击该按钮时,浏览器就检测 btn.onclick
是否有值,若是有,就会执行 btn.onclick.call(btn,event)
,此时函数执行,call()
方法接收两个参数,第一个指向调用当前方法的对象,也就是 this
。html
须要注意的是,指定的 this
值并不必定是该函数执行时真正的 this
值,若是这个函数处于非严格模式下,则指定为 null
和 undefined
的 this
值会自动指向全局对象(浏览器中就是 window
对象),同时值为原始值(数字,字符串,布尔值)的 this
会指向该原始值的自动包装对象。java
另外一个参数则是事件对象 event
,该对象也能够经过 arguments[0]
来访问,它包含了事件相关的全部信息,如本例子中,则包含了点击事件的所有信息。能够经过给函数传参来获取事件信息。node
btn.onclick = function(e) { console.log("this is a click event"); console.log(e); // 事件对象 };
在 DOM0 级中,若是想要实现一个对象绑定多个函数,能够这样实现。git
function fn1() { // do something } function fn2() { // do something } btn.onclick = function(e) { fn1.call(this, xxx); fn2.call(this, yyy); };
https://github.com/HarleyWang...
当前这个实例 document.body
之因此能用 addEventListener
这个方法,说明这个方法确定在它的原型上出现。github
能够用 instanceof
检测浏览器
DOM2
级事件定义了两个方法,用于处理指定和删除事件处理程序的操做,addEventListener()
和 removeEventListener()
,全部的 DOM
节点中都包含这两个方法,它们都接收 3
个参数dom
true
表明在捕获阶段调用事件处理程序,false
表示在冒泡阶段调用事件处理程序,默认为 false
。btn.addEventListener("click", function() { // do something }); btn.addEventListener("click", function() { // do something else });
element.addEventListener( "click", function(event) { // 只执行一次的代码 }, { once: true } );
DOM2
事件绑定使用的 addEventListener/attachEvent
都是在 EventTarget
这个内置类的原型上定义的,调取使用的时候,首先经过原型链找到这个方法,而后执行完成事件绑定的效果DOM0
是私有属性赋值,DOM2
是事件池的事件机制编辑器
DOM0
支持的事件行为,DOM2 均可以使用,不只如此,DOM2 还支持一些 DOM0
没有的事件行为:DOMContentLoaded...
DOM2
事件绑定的移除比较麻烦一些,须要和绑定的时候:事件类型、绑定的方法、传播阶段,三个彻底一致才能够移除掉DOM3 级事件在 DOM2 级事件的基础上添加了更多的事件类型,所有类型以下函数
事件类型 | 说明 | 举例 |
---|---|---|
UI 事件 | 当用户与页面上的元素交互时触发 | {load、scroll |
焦点事件 | 当元素得到或失去焦点时触发 | blur、focus |
鼠标事件 | 当用户经过鼠标在页面执行操做时触发 | dbclick、mouseup |
滚轮事件 | 当使用鼠标滚轮或相似设备时触发 | mousewheel |
文本事件 | 当在文档中输入文本时触发 | textInput |
键盘事件 | 当用户经过键盘在页面上执行操做时触发 | keydown、keypress |
合成事件 | 当为 IME(输入法编辑器)输入字符时触发 | compositionstart |
变更事件 | 当底层 DOM 结构发生变化时触发 | DOMsubtreeModified |
同时 DOM3
级事件也容许开发人员自定义一些事件。
var event = new Event('build'); // Listen for the event. elem.addEventListener('build', function (e) { ... }, false); // Dispatch the event. elem.dispatchEvent(event);
添加自定义数据 – CustomEvent()
var event = new CustomEvent("build", { detail: elem.dataset.time });
因为事件会在冒泡阶段向上传播到父节点,所以能够把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫作事件的代理(delegation
)
。
那么利用事件冒泡或捕获的机制,能够对事件绑定作一些优化。 在 JS 中,若是咱们注册的事件愈来愈多,页面的性能就愈来愈差,由于:
<ul id="list"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> // 给父层元素绑定事件 document.getElementById('list').addEventListener('click', function (e) { // 兼容性处理 var event = e || window.event; var target = event.target || event.srcElement; // 判断是否匹配目标元素 if (target.nodeName.toLocaleLowerCase() === 'li') { console.log('the content is: ', target.innerHTML); } }); </script>
DOM
的事件操做(监听和触发),都定义在 EventTarget
接口。全部节点对象都部署了这个接口,其余一些须要事件通讯的浏览器内置对象(好比,XMLHttpRequest
、AudioNode
、AudioContext
)也部署了这个接口
该接口主要提供三个实例方法。
https://juejin.im/post/5be643...https://www.w3.org/TR/DOM-Lev...