Skip to content

Instantly share code, notes, and snippets.

@bryanforbes
Created December 15, 2010 19:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bryanforbes/742453 to your computer and use it in GitHub Desktop.
Save bryanforbes/742453 to your computer and use it in GitHub Desktop.
A simple event disptacher to prevent leaks
var eventData = {};
(function(global){
function createDispatcher(id){
function dispatcher(){
if(id in _evtData){
_evtData[id].handler.apply(this, arguments);
}
}
return dispatcher;
}
var _nextId = 0;
function connectEvent(obj, evt, handler){
var id = _nextId++;
var dispatcher = createDispatcher(id);
eventData[id] = {
eventName: evt,
handler: handler,
dispatcher: dispatcher,
element: obj
};
obj.attachEvent(evt, dispatcher);
return id;
}
function disconnectEvent(id){
if(!(id in eventData)){
return;
}
var data = eventData[id];
data.element.detachEvent(data.eventName, data.dispatcher);
delete eventData[id];
}
global.connectEvent = connectEvent;
global.disconnectEvent = disconnectEvent;
})(this);
// to test if it leaks
(function(){
var i =-1, l = 1000, container = document.getElementById("container");
while (++i < l){
var e = document.createElement("div");
(function(elem){
function LeakFunc(){
elem.innerHTML = "foo";
}
connectEvent(elem, "onclick", LeakFunc);
container.appendChild(elem);
})(e);
}
container.innerHTML = "";
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment