事件模型
JavaScript事件使得网页具备互动和交互性,我们应该对其深入了解以便开发工作,在各式各样的浏览器中,JavaScript事件模型主要分为3种:原始事件模型、DOM2事件模型、IE事件模型。
观察者模式又叫做发布订阅者模式(Publish/Subscribe),它可以让多个观察者对象同时监听某一个主题对象,这个主题对象的状态变化时会通知所有的订阅者,使得它们能够做出反应。
JS的事件模型就是一种观察者模式的体现,当对应的事件被触发时,监听该事件的所有监听函数都会被调用。
原始事件模型(DOM0级)
又称为原始事件模型,在该模型中,事件不会传播,即没有事件流的概念。事件绑定监听函数比较简单, 有两种方式:
-
HTML代码中直接绑定:
<input type="button" onclick="fun()">
-
通过JS代码指定属性值:
var btn = document.getElementById('.btn'); btn.onclick = fun;
移除监听函数:
btn.onclick = null;
这种方式所有浏览器都兼容,但是逻辑与显示并没有分离。
DOM2事件模型
属于W3C标准模型,现代浏览器(除IE6-8之外的浏览器)都支持该模型。在该事件模型中,一次事件共有三个过程:
- 事件捕获阶段(capturing phase)。事件从document一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。
- 事件处理阶段(target phase)。事件到达目标元素, 触发目标元素的监听函数。
- 事件冒泡阶段(bubbling phase)。事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。
事件绑定监听函数的方式如下:
addEventListener(eventType, handler, useCapture)
事件移除监听函数的方式如下:
removeEventListener(eventType, handler, useCapture)
Example:
var btn = document.getElementById('.btn');
btn.addEventListener(‘click’, showMessage, false);
btn.removeEventListener(‘click’, showMessage, false);
参数说明:
- eventType指定事件类型(不要加on)
- handler是事件处理函数
- useCapture是一个boolean用于指定是否在捕获阶段进行处理,一般设置为false与IE浏览器保持一致。
IE事件模型
IE事件模型共有两个过程:
- 事件处理阶段(target phase)。事件到达目标元素, 触发目标元素的监听函数。
- 事件冒泡阶段(bubbling phase)。事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。
事件绑定监听函数的方式如下:
attachEvent(eventType, handler)
事件移除监听函数的方式如下:
detachEvent(eventType, handler)
参数说明:
- eventType指定事件类型(注意加on)
- handler是事件处理函数
Example:
var btn = document.getElementById('.btn');
btn.attachEvent(‘onclick’, showMessage);
btn.detachEvent(‘onclick’, showMessage);
事件监听
JavaScript HTML DOM 事件监听器
事件监听的定义
在Javascript中,浏览器一般分为两大类:
① 基于IE内核的浏览器(版本号小于9的IE浏览器)
② 基于W3C内核的浏览器(版本号大于9的IE浏览器、Firefox、Google等浏览器)
基于IE内核浏览器
dom对象.attachEvent(type,callback,capture) :为元素绑定事件监听程序
参数说明:
type:绑定的事件类型,如onclick、onmouseover、onmouseout
callback:事件的处理程序,通常是一个匿名函数
capture:使用的浏览器模型,冒泡模型与捕获模型,默认IE8以下的浏览器只支持冒泡模型!
基于W3C内核的事件监听
dom对象.addEventListener(type,callback) :为W3C内核浏览器绑定事件监听
参数说明:
type:绑定事件类型,不带’on’前缀,如click,mouseover,mouseout
callback:事件的处理程序,通常是一个匿名函数
总结事件监听的区别
IE内核的监听方式与W3C内核的监听方式:
①方式不同
IE内核的浏览器使用attachEvent进行绑定
W3C内核的浏览器使用addEventListener进行绑定
②参数不同
IE内核浏览器,其绑定方式一共有三个参数type,callback,capture(使用的浏览器模型)
W3C内核浏览器,其绑定方式一共有二个参数,type和callback
③type参数不同
IE内核的浏览器,type是需要添加’on’前缀的,如onclick
W3C内核浏览器,type是不需要添加’on’前缀的,如click
④触发顺序不同
IE内核的浏览器,其事件监听是先绑定后触发,后绑定的先触发
W3C内核的浏览器,其事件监听是先绑定先触发,后绑定的后触发
addEventListener() 方法
添加当用户点击按钮时触发的事件监听器:
document.getElementById("myBtn").addEventListener("click", displayDate);
addEventListener() 方法为指定元素指定事件处理程序。
addEventListener() 方法为元素附加事件处理程序而不会覆盖已有的事件处理程序。
您能够向一个元素添加多个事件处理程序。
您能够向一个元素添加多个相同类型的事件处理程序,例如两个 “click” 事件。
您能够向任何 DOM 对象添加事件处理程序而非仅仅 HTML 元素,例如 window 对象。
addEventListener() 方法使我们更容易控制事件如何对冒泡作出反应。
当使用 addEventListener() 方法时,JavaScript 与 HTML 标记是分隔的,已达到更佳的可读性;即使在不控制 HTML 标记时也允许您添加事件监听器。
您能够通过使用 removeEventListener() 方法轻松地删除事件监听器。
语法
element.addEventListener(event, function, useCapture);
第一个参数是事件的类型(比如 “click” 或 “mousedown”)。
第二个参数是当事件发生时我们需要调用的函数。
第三个参数是布尔值,指定使用事件冒泡还是事件捕获。此参数是可选的。
**注意:**请勿对事件使用 “on” 前缀;请使用 “click” 代替 “onclick”。
addEventListener() 方法允许您向相同元素添加多个事件,同时不覆盖已有事件:
向元素添加事件处理程序
实例:s
当用户点击某个元素时提示 “Hello World!”:
element.addEventListener("click", function(){ alert("Hello World!"); });
向相同元素添加多个事件处理程序
实例:
element.addEventListener("click", myFunction);
element.addEventListener("click", mySecondFunction);
向 Window 对象添加事件处理程序
addEventListener() 允许您将事件监听器添加到任何 HTML DOM 对象上,比如 HTML 元素、HTML 对象、window 对象或其他支持事件的对象,比如 xmlHttpRequest 对象。