attachEvent 与addEventListener到底有什么区别呢?总结以下: javascript
1、适应的浏览器版本不一样 java
attachEvent方法适用于IE addEventListener方法适用于FF 浏览器
2、针对的事件不一样 函数
attachEvent中的事件带on 而addEventListener中的事件不带on 测试
3、参数的个数不一样 this
attachEvent方法两个参数:第一个参数为事件名称,第二个参数为接收事件处理的函数; addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click");第二个参数表示要接收事件处理的函数;第三个参数是一个bool值,通常为false spa
第三个参数叫作useCapture,是一个boolean值,就是true or false,若是送出true的话就是瀏览器会使用Capture方式,false的话是Bubbling,只有在特定情况下才会有影响,一般建议是false,而会有影响的情形是目标元素(target element)有祖先元素(ancestor element),并且也有一样的事件对应函数,我想,看图会比较清楚。 prototype
像这张图所显示的,个人范例有两层div元素,并且都设定有click事件,通常来讲,若是我在内层蓝色的元素上click不仅会触发蓝色元素的click事件,还会同时触发红色元素的click事件,而useCapture这个参数就是在控制这时候两个click事件的前后顺序。若是是false,那就会使用bubbling,他是从内而外的流程,因此会先执行蓝色元素的click事件再执行红色元素的click事件,若是是true,那就是capture,和bubbling相反是由外而内,会先执行红色元素的click事件才执行蓝色元素的click事件。附上两个范例,capture和bubbling,两个档案只有差在此一参数不一样,能够发现事件的发生顺序不同了。 事件
那若是不一样层的元素使用的useCapture不一样呢?就是会先从最外层元素往目标元素寻找设定为capture的事件,到达目标元素执行目标元素的事件后,再寻原路往外寻找设定为bubbling的事件。 ip
4、执行事件的优先级不一样
<div id="outDiv">
<div id="middleDiv">
<div id="inDiv">请在此点击鼠标。</div>
</div>
</div>
<div id="info"></div>
var outDiv = document.getElementById("outDiv");
var middleDiv = document.getElementById("middleDiv");
var inDiv = document.getElementById("inDiv");
var info = document.getElementById("info");
outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, false);
上述是咱们测试的代码,根据 info 的显示来肯定触发的顺序,有三个 addEventListener,而 useCapture 可选值为 true 和 false,因此 2*2*2,能够得出 8 段不一样的程序。
全为 false 时,触发顺序为:inDiv、middleDiv、outDiv;
全为 true 时,触发顺序为:outDiv、middleDiv、inDiv;
outDiv 为 true,其余为 false 时,触发顺序为:outDiv、inDiv、middleDiv;
middleDiv 为 true,其余为 false 时,触发顺序为:middleDiv、inDiv、outDiv;
……
最终得出以下结论:
true 的触发顺序老是在 false 以前;
若是多个均为 true,则外层的触发先于内层;
若是多个均为 false,则内层的触发先于外层。
下面提供所有代码,您能够更改其中的 true、false 值,来进行测试。注意,不适用于 IE
5、对this的引用不一样
attachEvent绑定的函数,没有绑定this引用
通过这种处理以后,doIt方法中的this不表明button,可是使用
document.getElementById("btn4").onclick = doIt时this指向的就是btn表明的button了,
还有就是
document.getElementById("btn4").addEventListener('click',doSomething,false);这样也能够把this绑定进去
最后写一个兼容全部浏览器的监听事件方法以下:
//兼容全部浏览器的attachEvent方法
if(!window.attachEvent && window.addEventListener)
{
Window.prototype.attachEvent = HTMLDocument.prototype.attachEvent=
HTMLElement.prototype.attachEvent=function(en, func, cancelBubble)
{
var cb = cancelBubble ? true : false;
this.addEventListener(en.toLowerCase().substr(2), func, cb);
};
}