如果它们附加到IE8中的同一元素,如何使用纯javascript 停止执行其他事件处理程序?
我可以使用Event.stopImmediatePropagation方法停止事件传播,但 IE8不支持。
// document.getElementById('my-elem').attachEvent('click', firstHandler);
document.getElementById('my-elem').addEventListener('click', firstHandler);
// document.getElementById('my-elem').attachEvent('click', secondHandler);
document.getElementById('my-elem').addEventListener('click', secondHandler);
function firstHandler(ev){
ev.stopPropagation();
alert('1');
}
function secondHandler(ev){
ev.stopPropagation();
alert('2');
}

<div id="my-elem">
How to stop propagation ?
</div>
&#13;
答案 0 :(得分:2)
非常简化(可能容易出错)的polyfill /垫片。捕获原始的attachEvent / detachEvent方法,并创建将检查标志的新方法。
此外,它只会阻止在调用stopImmediatePropagation之前附加的事件。
if (!Event.prototype.stopImmediatePropagation) {
(function() {
var attachEvent = Element.prototype.attachEvent,
detachEvent = Element.prototype.detachEvent;
Element.prototype.attachEvent = function(type, callback) {
attachEvent.call(this, "on"+type, function(event) {
if (!event.immediatePropagationStopped) {
callback(event);
}
});
};
Element.prototype.detachEvent = function(type, callback) {
detachEvent.call(this, type, callback);
};
}());
Event.prototype.stopImmediatePropagation = function() {
this.immediatePropagationStopped = true;
};
}
document.getElementById("test").attachEvent("click",function(e){
console.log("hi");
});
document.getElementById("test").attachEvent("click",function(e){
e.stopImmediatePropagation();
console.log("hi2");
});
document.getElementById("test").attachEvent("click",function(e){
console.log("hi3");
});
<div id="test">Click me</div>
虽然这在我的IE 11浏览器中的IE 8仿真模式下工作,但正如我之前提到的,这是简化的。所以它没有做太多的错误检查和其他必要的检查。如果您想要生产可用的代码,请为add / removeEventListener,preventDefault,stopPropagation,stopImmediatePropagation找到合适的polyfill。
Modernizr将ES5 DOM SHIM列为具有stopImmediatePropagation的polyfill,因此可能为其他人填充polyfill