DOM的事件

来源:互联网 发布:网络管理零基础知乎 编辑:程序博客网 时间:2024/06/05 06:34

一、事件绑定

要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称。它是事件驱动编程模式的主要编程方式

在JavaScript中,有三种常用的绑定事件的方法:

  1. 在DOM元素中直接绑定;
  2. Element节点的事件属性; //DOM0级事件处理程序
  3. 绑定事件监听函; //DOM2级事件处理程序

在DOM元素中直接绑定(HTML的on-属性)

在HTML中,我们可以在DOM元素上绑定onclick、onmouseover、onmouseout、onmousedown、onmouseup、ondblclick、onkeydown、onkeypress、onkeyup等

<div onclick="test()"><script>fucntion test(){    alert("Hello World");}</script>

使用这个方法,只会在冒泡阶段触发。

使用这种方法时,on-属性的值是将会执行的代码,而不是一个函数。

Element节点的事件属性(在JavaScript代码中绑定事件)

在JavaScript代码中(即script标签内)绑定事件可以使JavaScript代码与HTML标签分离,文档结构清晰,便于管理和开发。

<div id="test"><script>var div = document.getElementById("test");div.onclick = function(){  console.log('Hello World');};</script>

使用这个方法,只会在冒泡阶段触发。

使用事件监听绑定事件(addEventListener方法)

3个事件阶段

关于事件监听,W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段。

  1. 第一阶段:从window对象传导到目标节点,称为“捕获阶段”(capture phase)。
  2. 第二阶段:在目标节点上触发,称为“目标阶段”(target phase)。
  3. 第三阶段:从目标节点传导回window对象,称为“冒泡阶段”(bubbling phase)。

EventTarget接口

DOM的事件操作(监听和触发),都定义在EventTarget接口。Element节点、document节点和window对象,都部署了这个接口。

该接口定义了三个方法:

  1. addEventListener:绑定事件的监听函数
  2. removeEventListener:移除事件的监听函数
  3. dispatchEvent:触发事件

addEventListener:

用于在当前节点或对象上,定义一个特定事件的监听函数。(同一节点可以绑定多个事件)

element.addEventListener(event, function, useCapture)
  • event : (必需)事件名,支持所有 DOM事件 。
  • function:(必需)指定要事件触发时执行的函数
  • useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false。

    function test() {  console.log('Hello world');}var div = document.getElementById('test');div.addEventListener('click', test, false);

removeEventListener:

用来移除addEventListener方法添加的事件监听函数。(可以解除相应的绑定)

div.addEventListener('click', listener, false);div.removeEventListener('click', listener, false);

dispatchEvent:

在当前节点上触发指定事件,从而触发监听函数的执行。(后面会细讲)

二、事件委托

事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。

1.可提高JavaScript性能

<ul id="list">  <li id="item1" >item1</li> <li id="item2" >item2</li> <li id="item3" >item3</li></ul><script>var item1 = document.getElementById("item1");var item2 = document.getElementById("item2");var item3 = document.getElementById("item3");document.addEventListener("click",function(event){ var target = event.target; if(target == item1){  alert("hello item1"); }else if(target == item2){  alert("hello item2"); }else if(target == item3){  alert("hello item3"); }})</script>

2.事件委托可用于对动态添加的元素动态的添加事件:

<ul id="list"> <li id="item1" >item1</li> <li id="item2" >item2</li> <li id="item3" >item3</li></ul><script>var list = document.getElementById("list");document.addEventListener("click",function(event){ var target = event.target; if(target.nodeName == "LI"){  alert(target.innerHTML); }})var node = document.createElement("li");node.id = "item4";var textnode = document.createTextNode("item4");node.appendChild(textnode);list.appendChild(node);</script>

三、自定义事件

通常情况下,事件的触发都是由用户的行为如点击、刷新等操作实现,但是,其实有的情况下,事件的触发必须又程序来实现。

dispatchEvent是作为高级浏览器(如chrome、Firfox等)的事件触发器来使用的。

document.createEvent();// 创建event.initEvent();// 初始化element.dispatchEvent();// 触发

createEvent参数:HTMLEvents,MouseEvents,UIEvents

initEvent(eventName, canBubble, preventDefault)。分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作。

dispatchEvent()就是触发执行了,dom.dispatchEvent(eventObject), 参数eventObject表示事件对象,是createEvent()方法返回的创建的Event对象。

例子:$(dom).addEvent("alert", function() {    alert("Holle World");});var evt = document.createEvent("HTMLEvents");evt.initEvent("alert", false, false);dom.dispatchEvent(evt);
原创粉丝点击