17.8.05 # DOM Event registered multiple times

According to the W3C DOM an event must not be registered more than once on the same object.

Now there is an issue with crossbrowser events using the DOM and Microsoft event registration model, which I am describing in detail here.

As a workaround we can extend the IE event target by an event list in order to store the registered event types by itself.

function addListener(obj, type, listener, capture) {
   if (obj.addEventListener)   // W3C DOM registering ..
      obj.addEventListener(type, listener, capture);
   else if (obj.attachEvent) { // IE 5/6 registering ..

      if (!obj.eventListeners)
         obj.eventListeners = [];
      if (!obj.eventListeners[type]) {
         obj.eventListeners[type] = true;
         obj.attachEvent("on"+type, listener);
      }
   }
}
function removeListener(obj, type, listener, capture) {
   if (obj.removeEventListener) // W3C DOM unregistering ..

      obj.removeEventListener(type, listener, capture);
   else if (obj.detachEvent) {  // IE 5/6 unregistering ..
      if (obj.eventListeners && obj.eventListeners[type]) {
         obj.eventListeners[type] = false;
         obj.detachEvent("on"+type, listener);
      }
   }
}

Using this and avoiding anonymous functions as event handlers resolves this issue with IE 6.

0 comments