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