addEventListener в Internet Explorer
Что эквивалентно элементу объекта в Internet Explorer 9?
if (!Element.prototype.addEventListener) {
Element.prototype.addEventListener = function() { .. }
}
Как это работает в Internet Explorer?
Если есть функция, равная addEventListener
и я не знаю, объясните пожалуйста.
Любая помощь будет оценена. Не стесняйтесь предложить совершенно другой способ решения проблемы.
9 ответов
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;
}
}
Джон Резиг, автор 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/
Я использую это решение и работает в 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 и т. Д.
Как сказал Делан, вы хотите использовать комбинацию addEventListener для более новых версий и attachEvent для более старых.
Вы найдете больше информации о слушателях событий на MDN. (Обратите внимание, что в вашем слушателе есть несколько предостережений со значением 'this').
Вы также можете использовать фреймворк, такой как jQuery, чтобы полностью абстрагировать обработку событий.
$("#someelementid").bind("click", function (event) {
// etc... $(this) is whetver caused the event
});
Вот кое-что для тех, кто любит красивый код.
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);
}
}
Бесстыдно украден у Ифраме-Ресайзер.
РЕДАКТИРОВАТЬ
Я написал фрагмент, который эмулирует интерфейс 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)
addEventListener
поддерживается начиная с версии 9; для более старых версий используйте несколько похожий attachEvent
функция.
Я бы использовал эти полифиллы https://github.com/WebReflection/ie8
<!--[if IE 8]><script
src="//cdnjs.cloudflare.com/ajax/libs/ie8/0.2.6/ie8.js"
></script><![endif]-->
Я также сталкиваюсь с аналогичной проблемой в IE10 и IE11, я слушаю события, используя приведенный ниже код, который отлично работает с chrome / firefox / Edge, но не работает с IE.
<script>
window.addEventListener("message", (event) => {
console.log("============ "+event.data)
updatepaymentStatus(event.data);
console.log("============origin "+event.origin)
}, false);
</script>