当eventListener附加到IE 8中的相同元素时,如何停止事件传播?

时间:2016-01-28 14:48:40

标签: javascript events stoppropagation

如果它们附加到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;
&#13;
&#13;

1 个答案:

答案 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