4. 事件冒泡与事件捕获应用:事件代理4.1 案例在实际的开发当中,利用事件流的特性,我们可以使用一种叫做事件代理的方法 。
<ul id="color-list"> <li>red</li> <li>yellow</li> <li>blue</li> <li>green</li> <li>black</li> <li>white</li></ul>如果点击页面中的li元素,然后输出li当中的颜色,我们通常会这样写:
(function(){ var color_list = document.getElementById('color-list'); var colors = color_list.getElementsByTagName('li'); for(var i=0;i<colors.length;i++){ colors[i].addEventListener('click',showColor,false); }; function showColor(e){ var x = e.target; console.log("The color is " + x.innerHTML); };})();利用事件流的特性,我们只绑定一个事件处理函数也可以完成:
(function(){var color_list =document.getElementById('color-list');color_list.addEventListener('click',showColor,false);function showColor(e){var x = e.target;if(x.nodeName.toLowerCase() === 'li'){console.log('The color is ' + x.innerHTML);} }})();使用事件代理的好处不仅在于将多个事件处理函数减为一个,而且对于不同的元素可以有不同的处理方法 。假如上述列表元素当中添加了其他的元素(如:a、span等),我们不必再一次循环给每一个元素绑定事件,直接修改事件代理的事件处理函数即可 。
5. 冒泡还是捕获?对于事件代理来说,在事件捕获或者事件冒泡阶段处理并没有明显的优劣之分,但是由于事件冒泡的事件流模型被所有主流的浏览器兼容,从兼容性角度来说还是建议大家使用事件冒泡模型 。
5.1 IE浏览器兼容IE浏览器对addEventListener兼容性并不算太好,只有IE9以上可以使用 。
要兼容旧版本的IE浏览器,可以使用IE的attachEvent函数
object.attachEvent(event, function)两个参数与addEventListener相似,分别是事件和处理函数,默认是事件冒泡阶段调用处理函数,要注意的是,写事件名时候要加上"on"前缀("onload"、"onclick"等) 。
6. 事件注意点
- 事件分为三个阶段: 事件捕获 --> 事件目标 --> 事件冒泡
- 事件捕获:事件发生时(onclick,onmouseover……)首先发生在document上,然后依次传递给body、……最后到达目的节点(即事件目标) 。
- 事件冒泡:事件到达事件目标之后不会结束,会逐层向上冒泡,直至document对象,跟事件捕获相反
ele.onclik = null;//解绑单击事件,将onlick属性设为null即可2、addEventListener(event.type, handle, boolean); IE8及以下不支持,属于DOM2级的方法,可添加多个方法不被覆盖//事件类型没有on,false 表示在事件第三阶段(冒泡)触发,true表示在事件第一阶段(捕获)触发 。如果handle是同一个方法,只执行一次 。ele.addEventListener('click', function(){ }, false);//解绑事件,参数和绑定一样ele.removeEventListener(event.type, handle, boolean);3、attachEvent(event.type, handle ); IE特有,兼容IE8及以下,可添加多个事件处理程序,只支持冒泡阶段//如果handle是同一个方法,绑定几次执行几次,这点和addEventListener不同,事件类型要加on,例如onclick而不是clickele.attachEvent('onclick', function(){ }); //解绑事件,参数和绑定一样ele.detachEvent("onclick", function(){ });4、默认事件行为:href=https://www.isolves.com/it/cxkf/yy/js/2020-06-11/""链接,submit表单提交等 阻止默认事件: (1)return false; 阻止独享属性(通过on这种方式)绑定的事件的默认事件ele.onclick = function() {……//你的代码return false;//通过返回false值阻止默认事件行为};(2)event.preventDefault( ); 阻止通过 addEventListener( ) 添加的事件的默认事件element.addEventListener("click", function(e){var event = e || window.event;……event.preventDefault( );//阻止默认事件},false);(3)event.returnValue = https://www.isolves.com/it/cxkf/yy/js/2020-06-11/false; 阻止通过 attachEvent( ) 添加的事件的默认事件element.attachEvent("onclick", function(e){var event = e || window.event;……event.returnValue = https://www.isolves.com/it/cxkf/yy/js/2020-06-11/false;//阻止默认事件},false);5、接下来我们把事件绑定以及事件解绑封装成为一个函数,兼容浏览器,包括IE6及以上推荐阅读
- 黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解
- 赤白二黄茶功效及介绍,黄虎白牛公英茶清热利湿解毒止带功效
- 除了男戴观音女带佛,你知道其他玉饰怎么带吗?
- 风衣后面的腰带怎么系?
- 带孩子出国旅游去哪?
- 带苦涩感的茶好吗,香茅桂圆茶的做法
- 国产处理器龙芯地址空间详解
- 宽带已升级到200M,为什么网络还是那么慢?教你一招突破网速限制
- window10自带的3d画图 windows10画图3d工具
- 汽车“正时皮带”与“正时链条”如何判断更换或保养?老司机教你
