Internet Explorer中的addEventListener

70

在Internet Explorer 9中,相当于Element Object的是什么?

if (!Element.prototype.addEventListener) {
    Element.prototype.addEventListener = function() { .. } 
} 

它在Internet Explorer中是如何工作的?

如果有一个等同于addEventListener的函数,而我不知道,请解释一下。

任何帮助都将不胜感激。请随意建议完全不同的解决问题的方法。


1
浏览器是否实现了其DOM对象的原型继承方案与其是否支持W3C EventTarget接口无关。如果您想要测试支持性,请直接进行测试:if(element.addEventListener) {/*支持*/} else {/*不支持*/}在所有浏览器中都是有效的,并且独立于实现方式。 - RobG
8个回答

149

addEventListener 是附加事件处理程序的正确 DOM 方法。

Internet Explorer(版本 8 之前)使用了另一种 attachEvent 方法。

Internet Explorer 9 支持正确的 addEventListener 方法。

以下是尝试编写跨浏览器 addEvent 函数的示例。

function addEvent(evnt, elem, func) {
   if (elem.addEventListener)  // W3C DOM
      elem.addEventListener(evnt,func,false);
   else if (elem.attachEvent) { // IE DOM
      elem.attachEvent("on"+evnt, func);
   }
   else { // No much to do
      elem["on"+evnt] = func;
   }
}

19
最后一个条件也应包括 "on"+ - Marcel Korpel
76
对于IE9和addEventListener,您需要使用HTML5的<!DOCTYPE html>。 - pcunite
1
@pcunite 希望我能给那条评论更多的赞。非常重要的观点。 - Okeydoke
5
由于IE9在兼容视图下使用IE7呈现模式,因此只有attachEvent函数有效。因此,重要的是进行此检查而不是依赖于addEventListener函数。 - g13n

16

jQuery的作者John Resig提交了他版本的跨浏览器实现addEventremoveEvent,以绕过IE中存在的不正确或不存在的addEventListener兼容性问题。

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}

来源: http://ejohn.org/projects/flexible-javascript-events/


这段代码试图将回调函数fn绑定到obj上,除了添加事件监听器之外,但这是多余的,因为每个使用JS的人都应该已经知道this - Ali Shakiba
3
如果你在介绍jQuery的作者时提到了John Resig,你本可以得到更多的选票。 - Sanghyun Lee
这个实现并不完整,缺少了 useCapture 参数。 - magritte

14

我正在使用这个解决方案,它适用于IE8或更高版本。

if (typeof Element.prototype.addEventListener === 'undefined') {
    Element.prototype.addEventListener = function (e, callback) {
      e = 'on' + e;
      return this.attachEvent(e, callback);
    };
  }

接着:

<button class="click-me">Say Hello</button>

<script>
  document.querySelectorAll('.click-me')[0].addEventListener('click', function () {
    console.log('Hello');
  });
</script>

这将适用于IE8、Chrome、Firefox等浏览器。


我遇到了Element的问题(类型未定义)。 - zchpit
检查您的文档类型版本,应该是HTML5文档类型声明。 - RTeobaldo

2
正如Delan所说,你需要同时使用addEventListener来支持新版本和attachEvent来支持旧版本。
你可以在MDN上找到更多有关事件监听器的信息。(注意,在监听器中'this'的值可能存在一些陷阱)。
你也可以使用像jQuery这样的框架来完全抽象化事件处理。
$("#someelementid").bind("click", function (event) {
   // etc... $(this) is whetver caused the event
});

2

对于喜欢优美代码的人来说,这里有些内容可能会对你有所帮助。

function addEventListener(obj,evt,func){
    if ('addEventListener' in window){
        obj.addEventListener(evt,func, false);
    } else if ('attachEvent' in window){//IE
        obj.attachEvent('on'+evt,func);
    }
}

以下内容 shamelessly 从 Iframe-Resizer 偷来。


1

addEventListener从版本9开始支持;对于旧版本,请使用类似的attachEvent函数。


1

编辑

我编写了一个代码片段,模拟了EventListener接口和ie8接口,可在普通对象上调用: https://github.com/antcolag/iEventListener/blob/master/iEventListener.js

旧回答

这是一种在不支持addEventListener或attachEvent的浏览器上模拟它们的方法
希望能有所帮助

(function (w,d) {  // 
    var
        nc  = "", nu    = "", nr    = "", t,
        a   = "addEventListener",
        n   = a in w,
        c   = (nc = "Event")+(n?(nc+= "", "Listener") : (nc+="Listener","") ),
        u   = n?(nu = "attach", "add"):(nu = "add","attach"),
        r   = n?(nr = "detach","remove"):(nr = "remove","detach")
/*
 * the evtf function, when invoked, return "attach" or "detach" "Event" functions if we are on a new browser, otherwise add "add" or "remove" "EventListener"
 */
    function evtf(whoe){return function(evnt,func,capt){return this[whoe]((n?((t = evnt.split("on"))[1] || t[0]) : ("on"+evnt)),func, (!n && capt? (whoe.indexOf("detach") < 0 ? this.setCapture() : this.removeCapture() ) : capt  ))}}
    w[nu + nc] = Element.prototype[nu + nc] = document[nu + nc] = evtf(u+c) // (add | attach)Event[Listener]
    w[nr + nc] = Element.prototype[nr + nc] = document[nr + nc] = evtf(r+c) // (remove | detach)Event[Listener]

})(window, document)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接