JavaScript事件流及事件代理

64 阅读1分钟

事件

事件流描述的是从页面中接收事件的顺序,主要分为两种,IE的事件流是事件冒泡流,而Netspace Communicator的事件流是事件捕获流。

事件冒泡

指事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点,这样由底及上的行为,称为事件冒泡 以下代码示例:

<body>
  <div id="box">click me</div>
</body>

当点击了div元素,那么这个点击事件将在以下顺序中传播,div-body-html-document

事件捕获

事件捕获的传播顺序与事件冒泡相反,以上例为例,传播顺序是document-html-body-div

事件代理

1.什么是事件代理?

js红宝书上是这样说的,事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件;

用一个生活中的例子理解,平时我们在公司收快递,收取快递的方式有两种,一种是每个同事各自跟配送员对接,另一种是前台代收(代理),然后根据快递上的信息给到每个同事。

事件代理的原理

利用事件冒泡,将各个子元素的时间冒泡到父元素上,使用父元素来触发时间; 这就是事件委托,委托它们父级代为执行事件

事件委托实践

先来看一个非事件委托的给每个li元素绑定相同的点击事件;

<ul id="ul">
    <li>hello</li>
    <li>world</li>
    <li>dell</li>
    <li>lee</li>
</ul>
<script>
    var oUl = document.getElementById("ul");
    var aLi = oUl.getElementsByTagName('li');
    for(var i=0;i<aLi.length;i++){
        aLi[i].onclick = function(){
            alert(123);
        }
    }
</script>

那么怎么用事件委托实现呢?

<script>
	var oUl = document.getElementById("ul");
  oUl.onclick = function(ev){
    var ev = ev || window.event;                 
    var target = ev.target || ev.srcElement;     //处理兼容
    if(target.nodeName.toLowerCase() == 'li'){   //事件源为子元素li时才触发点击事件
         alert(123);
         alert(target.innerHTML);
    }
  }
</script>