当 eventListener 附加到 IE 8 中的相同元素时如何停止事件传播?
How to stop event propagation when eventListener attached to same elements in IE 8?
如何停止执行其他事件处理程序 纯 javascript 以防它们附加到 IE8 中的同一元素?
我可以用 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>
一个非常简化的(并且可能容易出错)polyfill/shim。捕获原始 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
如何停止执行其他事件处理程序 纯 javascript 以防它们附加到 IE8 中的同一元素?
我可以用 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>
一个非常简化的(并且可能容易出错)polyfill/shim。捕获原始 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