addEventListener Polyfill

// addEventListener polyfill 1.0 / Eirik Backer / MIT Licence
(function(win, doc){
	if(win.addEventListener)return;		//No need to polyfill

	function docHijack(p){var old = doc[p];doc[p] = function(v){return addListen(old(v))}}
	function addEvent(on, fn, self){
		return (self = this).attachEvent('on' + on, function(e){
			var e = e || win.event;
			e.preventDefault  = e.preventDefault  || function(){e.returnValue = false}
			e.stopPropagation = e.stopPropagation || function(){e.cancelBubble = true}, e);
	function addListen(obj, i){
		if(i = obj.length)while(i--)obj[i].addEventListener = addEvent;
		else obj.addEventListener = addEvent;
		return obj;

	addListen([doc, win]);
	if('Element' in win)win.Element.prototype.addEventListener = addEvent;			//IE8
	else{																			//IE < 8
		doc.attachEvent('onreadystatechange', function(){addListen(doc.all)});		//Make sure we also init at domReady
})(window, document);


  1. User Avatar

    It doesn’t work – “unsupported removeEventListener”.

  2. User Avatar
    Permalink to comment#

    I guess it is only a polyfill for addEventListener, not for removeEventListener ;

    But you should be able to add this feature in this example pretty easily I guess !

  3. User Avatar
    Lski (Lee)
    Permalink to comment#

    I thought I would give my to pennies, for those looking for a polyfill for both add and remove EventListener, try the MDN website:$revision/650019#Compatibility

  4. User Avatar
    Permalink to comment#

    what about this?
    is more simple but i think it will work on ie8+

    (function on(w,d) {  // 
                a   = "addEventListener"
                n   = a in w,
                c   = "Event"+(n?"Listener":""),
                nc  = "Event"+(!n?"Listener":""),
                u   = n?"add":"attach",
                nu  = !n?"add":"attach",
                r   = n?"remove":"detach",
                nr  = !n?"remove":"detach"
            w[nu + nc] = Element.prototype[nu + nc] = function(evnt,func,c){
                return this[u+c]((n?evnt.split("on")[1]:"on"+evnt),function(e){if(!e)e = event;else event = e;func(e)},c)
            w[nr + nc] = Element.prototype[nr + nc] = function(evnt,func,c){
                return this[r+c]((n?evnt.split("on")[1]:"on"+evnt),function(e){if(!e)e = event;else event = e;func(e)},c)

Leave a Comment

Posting Code!

You may write comments in Markdown. This makes code easy to post, as you can write inline code like `<div>this</div>` or multiline blocks of code in triple backtick fences (```) with double new lines before and after.

Code of Conduct

Absolutely anyone is welcome to submit a comment here. But not all comments will be posted. Think of it like writing a letter to the editor. All submitted comments will be read, but not all published. Published comments will be on-topic, helpful, and further the discussion or debate.

Want to tell us something privately?

Feel free to use our contact form. That's a great place to let us know about typos or anything off-topic.