addEventListener в Internet Explorer - PullRequest
       34

addEventListener в Internet Explorer

62 голосов
/ 03 августа 2011

Что эквивалентно объекту Element в Internet Explorer 9?

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

Как это работает в Internet Explorer?

Если есть функция, равная addEventListener и Iне знаю, объясни пожалуйста.

Любая помощь будет оценена.Не стесняйтесь предложить совершенно другой способ решения проблемы.

Ответы [ 8 ]

141 голосов
/ 03 августа 2011

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;
   }
}
16 голосов
/ 17 июня 2014

Джон Резиг, автор jQuery, представил свою версию кросс-браузерной реализации addEvent и removeEvent, чтобы обойти проблемы совместимости с неправильным или несуществующим 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/

14 голосов
/ 05 сентября 2014

Я использую это решение и работает в 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 и т. Д.

2 голосов
/ 11 января 2016

Вот кое-что для тех, кто любит красивый код.

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

Бесстыдно украденный у Iframe-Resizer .

2 голосов
/ 03 августа 2011

Как сказал Делан, вы хотите использовать комбинацию addEventListener для более новых версий и attachEvent для более старых.

Более подробную информацию о прослушивателях событий вы найдете на MDN .(Обратите внимание, что в вашем слушателе есть несколько предостережений со значением 'this').

Вы также можете использовать такую ​​среду, как jQuery , чтобы полностью абстрагировать обработку событий.

$("#someelementid").bind("click", function (event) {
   // etc... $(this) is whetver caused the event
});
1 голос
/ 24 января 2015

EDIT

Я написал фрагмент, который эмулирует интерфейс EventListener и ie8, может вызываться даже на простых объектах: https://github.com/antcolag/iEventListener/blob/master/iEventListener.js

OLD ANSWER

способ эмулировать 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)
1 голос
/ 03 августа 2011

addEventListener поддерживается начиная с версии 9; для более старых версий используйте похожую функцию attachEvent.

0 голосов
/ 04 августа 2015

Я бы использовал эти полифиллы https://github.com/WebReflection/ie8

<!--[if IE 8]><script
  src="//cdnjs.cloudflare.com/ajax/libs/ie8/0.2.6/ie8.js"
></script><![endif]-->
...