JavaScript的事件

一、事件绑定

要想让 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);
posted @ 2017-08-24 10:32  ZpandaZ  阅读(155)  评论(0编辑  收藏  举报