js 事件模型

说到事件,就要追溯到网景与微软的“浏览器大战”了。当时,事件模型还没有标准,两家公司的实现就是事实标准。网景在Navigator中实现了“事件捕获”的事件系统,而微软则在IE中实现了一个基本上相反的事件系统,叫做“事件冒泡”。这两种系统的区别在于当事件发生时,相关元素处理(响应)事件的优先权不同。

下面举例说明这两种事件机制的区别。假设文档中有如下结构:

<div>
    <span>
        <a>...</a>
    </span>
</div>

因为这三个元素是嵌套的,所以单击了a,实际上也就单击了span和div。换句话说,这三个元素都应该有处理单击事件的机会。在事件捕获机制下,处理这个单击事件的优先次序是:div > span > a;而在事件冒泡机制下,处理这个单击事件的优先次序则是:a > span > div。

后来,W3C的规范要求浏览器同时支持捕获和冒泡机制,并允许开发人员选择把事件注册到哪个阶段。于是就有了下面这个注册事件的标准方法:

target.addEventListener(type, listener, useCapture Optional );

其中:

  • type:字符串,表示监听的事件类型
  • listener:监听器对象(JavaScript函数),在指定事件发生时可以收到通知
  • useCapture:布尔值,是否注册到捕获阶段

在实际应用开发中,为了确保与IE(因为它不支持捕获)兼容,useCapture一般都指定为false(默认值也是false)。换句话说,只把事件注册到冒泡阶段;对于上面那个简单的例子来说,响应顺序就是:a > span > div。

一、事件冒泡( Event Bubbling
           IE 的事件流叫做事件冒泡,即事件开始时由最躯体的元素接收,然后逐级向上传播到较为不具体的节点。
           IE9 FF、 ChromeSafari 将事件一直冒泡到 <window>对象。
                    
二、事件捕获( Event Capturing
           事件捕获的思想是不太具体的节点应该更早接收到事件,二最具体的节点应该最后接收到事件。
                    
           IE9 FF、 ChromeOpera Safari都支持这种事件流模型,“ DOM2级事件”规范要求应该从 document对象开始传播,但是这些浏览器都是从 window对象开始捕获事件的。
 
 
利用jquery  阻止事件冒泡和元素事件的默认行为
 
 
$(function(){
       $("#id1").on("click",function(event){
                    console.log('id1');
                    //阻止冒泡
                    //event.stopPropagation();
                    //阻止元素事件的默认行为例如表单提交
                    //event.preventDefault();
                    //或者返回false   阻止冒泡和默认行为
                    return false;
       });
                
                $("#id2").on("click",function(event){
                    console.log('id2');
                    event.stopPropagation();
                });
                
            });


<div id="id1" style="200px; height:200px; position:absolute; top:100px; left:100px; z-index:4">
          <div id="id2" style="200px; height:200px; position:absolute; top:20px; left:70px; z-index:1"></div>
        </div>

 给div元素下class =sound 的未来元素绑定click事件

$("#msg-list").on("click","div.sound",function(event){
    msgItemTap(this, event);
});
原文地址:https://www.cnblogs.com/jentary/p/6265192.html