事件绑定的执行次序在 W3C 的标准下,事件绑定使用的是 addEventLisenter。但微软这家伙常常不按常理出牌.它提供的事件绑定方法是 attachEvent。关于 attachEvent 的种种不足,先不一一列举。或许我们已经忍受着用 attachEvent 来绑定事件。//object.attachEvent(event, function);el。attachEvent(’onclick', method);但当在同一元素上绑定多次,你就会知道,微软的这个私人的方法又是多么“不可理喻”.el。attachEvent(”onclick”, method1);el。attachEvent("onclick", method2);el。attachEvent("onclick", method3);el.attachEvent(”onclick”, method4);在各个 IE 下运行,点击 el 后,各个方法的执行次序是: IE6/IE7: method2 —> method4 -〉 method3 —〉 method1 IE8: method4 —〉 method3 -> method2 -〉 method1 IE9: method1 —> method2 -〉 method3 —〉 method4IE6/7 是一种看不出规律的随机执行,IE8 是逆序执行,IE9 是顺序执行。无论常识还是 W3C 标准,这种同一个事件绑定了多个方法的情况,方法的执行次序都应该是先绑定先执行。从 IE6-IE9的演变,可以看得出微软还是有在不断改进的.但毕竟各个版本的 IE 存在,使得我们不得不注意绑定在同一事件上的多个方法之间不要有顺序依赖。 YUI2 的事件绑定并没有对执行次序做兼容,假如有些场景的确需要绑定多个方法且方法间需要顺序执行。那我们就只能自己实现了,大致思路是:在先推断绑定的 el 对象上是否已经同一个事件类型的 handlers,假如有则不会重复绑定而是把该对象的 handler 合并到 handlers 中成为一个方法,相当于这样 function c() { a(); b(); },根据顺序的压入方法实现在 IE 下不会出现绑定多个方法时能顺序执行。function addEvent(el, type, handler) { if (el。attachEvent) { // IE // 为元素的事件类型创建一个哈希表 el._events = el._events || {}; if (!handler) { return; } // 取得事件处理函数的数组的引用 var handlers = el._events[type]; if (handlers) { if(typeof handler._index === ’undefined' || handlers[handler._index] !== handler) { // 将事件处理函数存入数组 handlers。push(handler); // 为事件处理函数增加索引 handler._index = handlers。length - 1; } }...