Javascript 中的 MSIE 和 addEventListener 问题?

IT技术 javascript internet-explorer addeventlistener
2021-02-07 21:40:38
document.getElementById('container').addEventListener('copy',beforecopy,false );

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

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

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

** 任何能告诉我第三个参数“False”有什么好处的人都会加分。

6个回答

在 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');
});

您可以在此处运行上述代码的示例

的第三个参数addEventListeneruseCapture; 如果为 true,则表示用户希望启动事件捕获

为什么微软自己的文档显示使用addEventListenerthen?msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx
2021-03-13 21:40:38
@wmarbut addEventListener 被添加到,我相信,IE9。attachEvent 在 IE 11 中被删除。最初的问题是从 2009 年开始的。CMS 提供了正确、强大的方法,即使在 IE 11 中也能继续工作。
2021-03-16 21:40:38
刮掉那个评论。我刚刚隔离并尝试了您发送的内容,并将点击更改为复制确实有效。再次感谢。
2021-03-23 21:40:38
这解释了为什么它可以在 Internet 上运行,但对我来说不能在 Intranet 上运行,因为我将 Intranet 站点的设置设置为兼容模式。
2021-03-28 21:40:38
我很感激你的回应。我刚刚尝试了您发布的内容,并且有效。现在让我失望的是“复制”事件不起作用,但“onclick”事件起作用。具体来说,这很奇怪,因为 quirksmode 声明它应该可以工作: quirksmode.org/dom/events/cutcopypaste.html 有 什么想法吗?
2021-04-02 21:40:38

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

<html>
   <head>
      <meta http-equiv="X-UA-Compatible" content="IE=edge;" />
   </head>
   <body>
    ...
   </body>
</html>

这对我有用。

对于那些运行 IE 版本 <= 8 的用户,这不会解决问题。
2021-03-15 21:40:38

尝试添加

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

就在开头标签之后

对于那些运行 IE 版本 <= 8 的用户,这不会解决问题。
2021-04-08 21:40:38

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 框架(例如jQueryDojoMooToolsYUIPrototype等)并避免自己为此创建修复程序。

顺便说一下,W3C 事件模型中的第三个参数与冒泡和捕获事件之间区别有关在几乎所有情况下,您都希望在事件冒泡时处理事件,而不是在它们被捕获时处理。在诸如文本框的“焦点”事件(不会冒泡)上使用事件委托时,它很有用

从 IE11 开始,您需要使用addEventListener. attachEvent已弃用并引发错误。