Javascript中的MSIE和addEventListener问题?

时间:2009-11-08 04:35:21

标签: javascript internet-explorer addeventlistener

document.getElementById('container').addEventListener('copy',beforecopy,false );

在Chrome / Safari中,当复制页面上的内容时,上面将运行“beforecopy”功能。 MSIE也应该支持这个功能,但出于某种原因我收到了这个错误:

  

“对象不支持此属性或方法”

现在,我的理解是Internet Explorer不会使用body节点,但我认为通过ID提供节点可以正常工作。有没有人对我做错了什么有任何想法?提前谢谢。

**任何可以告诉我第三个参数“False”有用的人的奖励积分。

8 个答案:

答案 0 :(得分:181)

在IE中,您必须使用attachEvent而不是标准addEventListener

通常的做法是检查addEventListener方法是否可用并使用它,否则使用attachEvent

if (el.addEventListener){
  el.addEventListener('click', modifyText, false); 
} else if (el.attachEvent){
  el.attachEvent('onclick', modifyText);
}

你可以做一个功能:

function bindEvent(el, eventName, eventHandler) {
  if (el.addEventListener){
    el.addEventListener(eventName, eventHandler, false); 
  } else if (el.attachEvent){
    el.attachEvent('on'+eventName, eventHandler);
  }
}
// ...
bindEvent(document.getElementById('myElement'), 'click', function () {
  alert('element clicked');
});

您可以运行上述代码here的示例。

addEventListener的第三个参数是useCapture;如果为true,则表示用户希望启动event capturing

答案 1 :(得分:28)

如果您使用的是JQuery 2.x,请在

中添加以下内容
<html>
   <head>
      <meta http-equiv="X-UA-Compatible" content="IE=edge;" />
   </head>
   <body>
    ...
   </body>
</html>

这对我有用。

答案 2 :(得分:4)

Internet Explorer(IE8及更低版本)不支持addEventListener(...)。它使用attachEvent方法拥有自己的事件模型。你可以使用这样的代码:

var element = document.getElementById('container');
if (document.addEventListener){
    element .addEventListener('copy', beforeCopy, false); 
} else if (el.attachEvent){
    element .attachEvent('oncopy', beforeCopy);
}

虽然我建议避免编写自己的事件处理包装,而是使用JavaScript框架(例如jQueryDojoMooToolsYUI,{{3}等等,并避免必须自己创建此修复程序。

顺便说一句,W3C事件模型中的第三个参数与Prototype有关。几乎在每种情况下,你都会想要在泡沫时处理事件,而不是在它们被捕获时处理。当对文本框的“焦点”事件使用difference between bubbling and capturing events时,它非常有用,它不会冒泡。

答案 3 :(得分:4)

尝试添加

<meta http-equiv="X-UA-Compatible" content="IE=edge"> 

在开头标记

之后

答案 4 :(得分:1)

从IE11开始,您需要使用addEventListener。不推荐使用attachEvent并抛出错误。

答案 5 :(得分:0)

问题是IE没有标准的addEventListener方法。 IE使用自己的attachEvent,它几​​乎一样。

可以找到差异的良好解释,以及第3个参数at quirksmode

答案 6 :(得分:0)

正如PPK指出here,在IE中你也可以使用

e.cancelBubble = true;

答案 7 :(得分:0)

使用<meta http-equiv="X-UA-Compatible" content="IE=9">,IE9 +支持addEventListener,删除事件名称中的“on”,如下所示:

 var btn1 = document.getElementById('btn1');
 btn1.addEventListener('mousedown', function() {
   console.log('mousedown');
 });