事件
事件流描述的是从页面中接收事件的顺序,主要分为两种,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>