You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
HTML 与 JavaScript 强耦合:JavaScript 代码脚本与 HTML 标签属性强绑定,如果修改事件处理程序,必须在 HTML 和 JavaScript 两个地方修改代码。这也是开发者不使用 HTML 事件处理程序,转而使用 JavaScript 指定事件处理程序的主要原因。
DOM0 事件处理程序
DOM0 事件处理程序支持在 JavaScript 中指定事件处理程序:把一个函数赋值给 DOM 元素的一个事件处理程序属性。
// 先取得操作对象的 DOM 引用letbtn=document.getElementById("myBtn");// 再对 DOM 对象的事件处理程序属性赋值回调函数btn.onclick=function(){console.log("Clicked");}// 通过将事件处理程序属性赋值为 null,可以移除 DOM0 或 HTML 方式添加的事件处理程序btn.onclick=null;
作为事件处理程序的函数可以访问全局作用域中的一切变量
事件处理程序会被传入一个 event 对象
this 值被指向所在的目标元素 (符合 this 的隐式绑定)
DOM0 事件处理程序解决了 HTML 事件处理程序中 HTML 与 JavaScript 强耦合的问题。此外,DOM0 方式在元素渲染完成后,事件处理程序赋值前,用户交互不会报错但没有反应。
DOM2 事件处理程序
DOM2 Events 规范为事件处理程序的赋值和移除定义了两个方法:
addEventListener(type, handler, useCapture)
removeEventLIstener(type, handler, useCapture)
// 先取得操作对象的 DOM 引用letbtn=document.getElementById("myBtn");// 定义事件处理程序的回调函数functionprint(){console.log("Clicked");}// DOM2 方式添加事件处理程序btn.addEventListener("click",print,false)// DOM2 方式移除事件处理程序btn.removeEventListener("click",print,false)
HTML 事件处理程序
HTML 事件处理程序支持在 HTML 标签的特定元素中,使用事件处理程序的名字以 HTML 属性的形式来指定响应事件的调用函数。
在 HTML 属性中定义的事件处理程序可以包含精确的动作指令(如上),也可以调用页面其他地方定义的脚本:
HTML 事件处理程序的缺点
DOM0 事件处理程序
DOM0 事件处理程序支持在 JavaScript 中指定事件处理程序:把一个函数赋值给 DOM 元素的一个事件处理程序属性。
DOM2 事件处理程序
DOM2 Events 规范为事件处理程序的赋值和移除定义了两个方法:
addEventListener(type, handler, useCapture)
removeEventLIstener(type, handler, useCapture)
这两个方法暴露在 所有 DOM 节点上,并接收 3 个参数:
同 DOM0 方式类似,DOM2 方式绑定的事件处理程序同样在目标元素的作用域中执行,即 this 指向目标元素。
通过
addEventListener()
添加的事件处理程序只能使用removeEventListener()
并传入与添加时同样的参数来移除,这意味着 addEventListener 添加的匿名函数是无法移除的。DOM0 与 DOM2 的差异
IE 事件处理程序
IE 为事件处理程序的赋值和移除定义了两个方法:
attachEvent(name, handler)
detackEvent(name, handler)
方法接受两个参数:
IE 与 DOM0 / DOM2 异同
事件处理程序的作用域
IE 添加的事件处理程序作用域是在全局作用域中运行,this 指向 window 对象。
DOM 级方式添加的事件处理程序作用域是目标元素的作用,this 指向目标元素对象。
事件流
IE 和 DOM0 方式添加的事件处理程序都被添加到事件的冒泡阶段进行。
DOM2 可自定义事件流处理方式,默认在冒泡阶段执行事件处理程序。
重复事件处理程序处理方式
DOM0 不支持重复事件的连续触发,重复事件会覆盖上一次的事件定义,从而只会响应最后一次定义的事件处理程序。
DOM2 可以为同一事件添加多个事件处理程序,并按照添加顺序触发事件处理程序。
IE 可以为同一事件添加多个事件处理程序,但按照添加的顺序反向触发。
The text was updated successfully, but these errors were encountered: