JavaScript中事件绑定

HTML把结构搭建了起来,CSS使结构变得更好看了,JavaScript当做了行为交互的必需品,然而,在这必需品中,最主要的应该就是交互,交互的就是事件了。

        浏览器的事件系统相对比较复杂,尽管所有主要浏览器已经实现了"DOM2级事件",但这个规范本身并没有涵盖所有的事件类型。浏览器对象模型(BOM)也支持一些事件,这些事件与文档对象模型(DOM)事件之间的关系并不十分清晰,因为BOM事件长期没有规范可以遵循。但是随着DOM3的出现,增强的DOM事件API变得更加的繁琐。


事件流

事件流是从页面中接收事件的顺序。IE事件流是事件冒泡。
事件冒泡:即事件开始时有具体的元素(文档中嵌套层次最深的那个节点)接受,然后逐级向上传播到较为不具体的节点(文档)。
事件捕获:不太具体的节点应该更早接收到事件,而最具体的节点应该最后接受到事件。事件捕获的用意在于在事件到达预定目标之前捕获它。
DOM2级事件流包括三个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。首先发生的是事件捕获,为截获事件提供机会,然后是实际的目标接受到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
  <title>点击</title>
</head>
<body>
  <div id="myDiv">点击</div>
</body>
</html>
下面的图就是捕获和冒泡的过程:
从该图就可以看出捕获阶段:document->Element html->Element body->Element div,到这里已经就是具体的元素了,就是处于处理阶段,之后就是冒泡阶段,Element div->Element body->Element html->Document。

事件处理程序

DOM0级事件处理程序:
通过JavaScript传统的事件处理程序的传统方式,就是将一个函数赋值给一个事件处理程序事件。
如下所示:
var btn = document.getElementById("myBtn");
  btn.onclick = function(){
    alert("Clicked");
  }
DOM2级事件处理程序:
“DOM2级事件”定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener()。
所有的DOM节点中都包含这两个方法,并且他们都接受三个参数:事件名、处理的事件程序的函数、一个布尔值。最后一个布尔值如果是true,表示在捕获阶段用事件处理程序;如果是false,表示冒泡阶段调用事件处理程序。
接下来解释了绑定事件和移除事件:
var btn = document.getElementById("myBtn");
  btn.addEventListener("click",function(){
     alert(this.id);
  },false);
  btn.addEventListener("click",function(){
     alert("Hello world");
  },false);
  btn.removeEventListener("click",function(){
     alert("Hello world");
  },false);

通过addEventListener()可以为一个元素同时添加两个事件。

IE事件处理程序

IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。这两个方法接受相同的两个参数:事件处理程序名称、事件处理程序函数。由于IE8及更早版本只支持事件冒泡,所以attachEvent()添加的事件处理程序都会被添加到冒泡程序。
  btn.attachEvent("click",function(){
     alert("Hello world");
  },false);
  btn.detachEvent("click",function(){
     alert("Hello world");
  },false);

在DOM0级方法的情况下,事件处理程序会在其所属元素的作用域内运行;在使用attachEvent()方法的情况下,事件处理程序会在全局作用域,里面的this可能指向window。


合并:

    function fn1(){
        alert(this);
    }
    function fn2(){
        alert(2);
    }
        
    function bind(obj,evname,fn){
        if(obj.addEventListener){
          obj.addEventListener(evname,fn,false);
        }else{
          obj.attachEvent('on'+evname,function(){
             fn.call(obj);
          });
        }
     }
    bind(document,'click',fn1);
    bind(document,'click',fn2);
这个就是两者的合并版。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值