在IE中模拟W3C事件捕获模型

时间:2010-09-03 17:34:39

标签: internet-explorer events dom javascript-events event-handling

是否可以在Internet Explorer中模拟event capturing

一个例子:

<a>one</a>
<a>two</a>
<a>three3</a>

<script>
var links = document.getElementsByTagName("A");
for (var i=0; i < links.length; i++) {
  links[i].onclick = function(){
    alert("clicked");
  };
}
</script>

我想阻止触发所有这些点击事件。我可以用一个事件观察者来做到这一点:

document.addEventListener("click", function(e) {
    e.stopPropagation();
    e.preventDefault();
}, true);

我如何在IE中执行相同的操作? IE&lt; 9不支持addEventListener。它确实支持attachEvent,但它没有useCapture选项。

我找到setCapture method,但它看起来与W3捕获模型无关。

6 个答案:

答案 0 :(得分:5)

一般情况下,由于event order,你不能。在IE中,事件将从目标元素开始冒泡而没有捕获阶段,因此您无法事先捕获它们。

您只能执行一项操作,如果您管理所有事件处理程序,则可能。

  1. 使用捕获参数
  2. addEvent写一个包装器
  3. 如果需要捕获,请执行以下操作

    1. 使用
    2. 功能注册一个简单的冒泡事件
    3. 一直到父链,保存所有元素到Array
    4. 向后移动这个Array调用每个元素上的原始事件处理程序

答案 1 :(得分:3)

JavaScript实验室的Uniform Event Model项目似乎模拟了捕获阶段。转到the download page for the JSLab DOM Correction library并选择所有内容并选择注释格式。然后下载代码并搜索“捕获”一词。我没有测试过该库或读过很多代码。

答案 2 :(得分:2)

setCapture用于在浏览器窗口之外保留一些与鼠标相关的操作

它用于实现某种拖放

如果您丢失了一个元素,并且您将使用指针移出浏览器窗口,则mousemove事件将停止工作

如果你setCapture(),mousemove事件将继续在浏览器窗口之外工作

https://developer.mozilla.org/en/DOM/element.setCapture

以及释放捕获的相关方法

https://developer.mozilla.org/en/DOM/document.releaseCapture

所以,它与捕获事件模型没有任何共同之处 并且,没有已知方法以标准方式在Internet Explorer中模拟它!

希望这有帮助!

答案 3 :(得分:1)

IE有一个你可能觉得有用的Element.setCapture()方法http://msdn.microsoft.com/en-us/library/ms536742(v=vs.85).aspx它允许你将所有鼠标事件路由到调用setCapture()的元素

答案 4 :(得分:0)

function myFunction(e) {
   if (!e) var e = window.object;//legacy event object
   if (e.preventDefault) e.preventDefault();//prevent firing in W3C model
   return false; //exit event, no firing, listener must registered to anchor tag
}    
var x = document.getElementsByTagName("A");

if (x.item(0).addEventListener) { 
    for (var i = 0, l = x.length; i < l; i++) {
        x.item(i).addEventListener("click",myFunction,false);
    }
}//W3C model
else if (x.item(0).attachEvent) {
    for (var i = 0, l = x.length; i < l; i++) {
        x.item(i).attachEvent("onclick",myFunction);
        }
    }// legacy browsers

答案 5 :(得分:0)

如果您仅使用冒泡进行点击,那么这是最佳方式:

if (document.addEventListener) document.addEventListener("click", function(e){e.preventDefault();},false);
else if (document.attachEvent) document.attachEvent("onclick", function(){window.event.returnValue = false;});