Javascript events fixes

Javascript events with support on older Internet Explorer, and add support for mouseenter and mouseleave events

See demo and code
Demo and code on jsfiddle.

Here is a fix for Javascript event that fixed two important problems.

  • Fix the scope of event handlers added with Internet Explorer's attachEvent method (code taken from Yui Library)
  • Add support to mouseenter and mouseleave events

function addEvent(obj, evnt, fn, useCapture){

    if(typeof obj.attachEvent != 'undefined'){ // ie7 ie8 fix

        // utils for attachEvent

        function getEvent(e, boundEl){

            var e = e || window.event;

            if(!e){

                var c = this.getEvent.caller;

                while(c){

                    e = c.arguments[0];

                    if(e && Event == e.constructor){

                        break;

                    }

                    c = c.caller;

                }

            }

            return e;

        }

        var wrappedFn = function(e){

            return fn.call(obj, getEvent(e, obj));

        }

        // core for attachEvent

        obj.detachEvent("on"+evnt, wrappedFn); 

        obj.attachEvent("on"+evnt, wrappedFn);

    }else{

        // utils for addEventListener

        function mouseEnter(fn){

            return function(evnt){

                var relTarget = evnt.relatedTarget;

                if(this == relTarget || isAChildOf(this, relTarget)){

                    return;

                }

                fn.call(obj, evnt);

            }

        }

        function isAChildOf(parent, child){

            if(parent == child){

                return false;

            }

            while(child && child !== parent){

                child = child.parentNode;

            }

            return child == parent;

        }

        // core for addEventListener

        if(evnt == 'mouseenter'){

            obj.removeEventListener('mouseover', mouseEnter(fn), useCapture);

            obj.addEventListener('mouseover', mouseEnter(fn), useCapture);

        }else if(evnt == 'mouseleave'){

            obj.removeEventListener('mouseout', mouseEnter(fn), useCapture);

            obj.addEventListener('mouseout', mouseEnter(fn), useCapture);

        }else{

            obj.removeEventListener(evnt, fn, useCapture);

            obj.addEventListener(evnt, fn, useCapture);

        }

    }

};



// usage

addEvent(document, "mouseenter", function(e){

    alert(e.type);

}, false);

P. Iva +00 000 000 0000 Italiano
Copyright © 2026 Riccardo Caroli