代码之家  ›  专栏  ›  技术社区  ›  NVI

IE中W3C事件捕获模型的仿真

  •  15
  • NVI  · 技术社区  · 14 年前

    有没有可能效仿 event capturing 在Internet Explorer中?

    例如:

    <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<9不支持 addEventListener . 它确实支持 attachEvent ,但它没有 useCapture 选择。

    我发现了 setCapture method ,但它看起来与W3捕获模型无关。

    6 回复  |  直到 14 年前
        1
  •  5
  •   gblazex    14 年前

    通常你不能因为 event order . 在IE中,事件将在没有捕获阶段的情况下从目标元素开始冒泡,因此您无法预先捕获它们。

    你只能做一件事 只有 如果你能做到 全部的 事件处理程序。

    1. 写一个 包装 对于 addEvent 带捕获参数
    2. 如果需要捕获,请执行以下操作

      1. 注册一个简单的 冒泡 事件,具有
      2. 一直向上延伸到父链, 节约 所有元素 Array
      3. 向后移动 阵列 在每个元素上调用原始事件处理程序
        2
  •  3
  •   Tom Elam    12 年前

    这个 Uniform Event Model 来自JavaScript实验室的项目似乎模拟了捕获阶段。去 the download page for the JSLab DOM Correction library 然后选择所有内容并选择注释格式。然后下载代码并搜索单词“capture”。我没有测试过这个库,也没有读过它的很多代码。

        3
  •  2
  •   user652649user652649    13 年前

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

    它用于实现某种拖放

    如果您将鼠标移到某个元素上,并将指针移到浏览器窗口外,则mousemove事件将停止工作

    如果您设置capture(),mousemove事件将继续在浏览器窗口之外工作

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

    以及释放捕获的相关方法

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

    因此,它与捕获事件模型没有任何共同之处 而且,没有已知的方法可以在internet explorer中以标准方式模拟它!

    希望这有帮助!

        4
  •  1
  •   Ruan Mendes    14 年前

    IE有一个Element.setCapture()方法,您可能会发现它很有用 http://msdn.microsoft.com/en-us/library/ms536742(v=vs.85).aspx 它允许您将所有鼠标事件路由到名为setCapture()的元素

        5
  •  0
  •   Gel    9 年前
    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
    
        6
  •  0
  •   Gel    9 年前

    如果只对单击使用冒泡,最好的方法是:

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