是否可以在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捕获模型无关。
答案 0 :(得分:5)
一般情况下,由于event order,你不能。在IE中,事件将从目标元素开始冒泡而没有捕获阶段,因此您无法事先捕获它们。
您只能执行一项操作,如果您管理所有事件处理程序,则仅可能。
addEvent
写一个包装器
如果需要捕获,请执行以下操作
Array
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;});