2014-10-13 4 views
3

У меня есть много кода, которые используют addEventListener в уменьшенной библиотек, файлы ..., но мне нужно, чтобы сделать работу этого код в IE8, поэтому замену addEventListener с addEvent:Заменить addEventListener

/* 
    * Register the specified handler function to handle events of the specified 
    * type on the specified target. Ensure that the handler will always be 
    * invoked as a method of the target. 
    */ 
function addEvent(type, handler) { 
    if (this.addEventListener) 
     this.addEventListener(type, handler, false); 
    else { 
     this.attachEvent("on" + type, 
      function(event) { 
       return handler.call(this, event); 
      }); 
    } 
} 

I может «переопределить» window.addEventListener, но как я могу переопределить этот метод в других объектах?

Заранее спасибо С уважением

+0

Вы можете определить window.addEventListener в IE, чтобы работать как W3, так что весь код использует тот же код, а новые браузеры используют встроенную команду, а не forking каждый раз. – dandavis

+0

window.addEventListener = window.addEventListener || функция addEvent (тип, обработчик) { this.attachEvent ("on" + type, функция (событие) { return handler.call (это событие); }); } – dandavis

+0

Если я использую код выше, добавьте addEventListener в окно? Мне нужно все объекты – Diomedes

ответ

4

Чтобы получить доступ к этому так же, как вы бы в современных браузерах, вы хотите, чтобы добавить метод к Window, HTMLDocument и Element прототипов.

(function(){ 
    if (!("addEventListener" in window)) { 
     function addEventListener(type, handler) { 
      var _this = this;    
      this.attachEvent("on" + type, function(){ 
       handler.call(_this, window.event); 
      }); 
     } 
     Window.prototype.addEventListener = addEventListener; 
     HTMLDocument.prototype.addEventListener = addEventListener; 
     Element.prototype.addEventListener = addEventListener; 
    } 
})(); 

Примечание: в то время как мы в нормированный доступ к функции и обратился к this вопрос, мы не нормализованы событие w3c стандартам. Таким образом, у него будут отсутствовать такие свойства, как event. target, event. relatedTarget и т. Д.

Проверьте прокладку Mozilla addEventListener().

+0

вы можете изменить protos, чтобы вести себя как другие браузеры, не рискуя создавать собственные собственные имена свойств, ожидающих конфликта в один прекрасный день. поскольку это имя уже принято, вам не нужно беспокоиться. IE8 поддерживает Object.defineProperty на прототипе Элемента (речь идет о единственном месте, на котором он фактически работает), поэтому вы также можете избежать назойливых «вы нарушили мои вступительные» жалобы, которые уже давно связаны с модификацией прототипов собственных объектов. – dandavis

+0

Большое спасибо! Полезный код и пояснения – Diomedes