/** * Add a mouseenter event to an element. * Event is fired once when cursor enter over the element or one of its children * * @param {element} el Element to attach event * @param {Function} fn Function to execute when event is fired * @param {object} obj Object passed as second argument to fn * @param {object/boolean} overrideContext Scope of fn. If overrideContext == true, obj become the scope * */ YAHOO.util.Event.onMouseEnter = function(el, fn, obj, overrideContext) { YAHOO.util.Event._mouseEnterLeave(el, fn, obj, overrideContext, 'mouseover'); }; /** * Add a mouseleave event to an element. * Event is fired once when cursor leave from the element or one of its children * * @param {element} el Element to attach event * @param {Function} fn Function to execute when event is fired * @param {object} obj Object passed as second argument to fn * @param {object/boolean} overrideContext Scope of fn. If overrideContext == true, obj become the scope * */ YAHOO.util.Event.onMouseLeave = function(el, fn, obj, overrideContext) { YAHOO.util.Event._mouseEnterLeave(el, fn, obj, overrideContext, 'mouseout'); }; YAHOO.util.Event._mouseEnterLeave = function(el, fn, obj, overrideContext, eventtype) { YAHOO.util.Event.on( el, eventtype, function(e, obj) { if (e.relatedTarget != this && !YAHOO.util.Dom.isAncestor( this, e.relatedTarget )) { if (!obj.overrideContext) { obj.overrideContext = this; } if (!obj.obj) { obj.obj = {}; } if (obj.overrideContext === true) { obj.fn.apply(obj.obj); } else { obj.fn.apply(obj.overrideContext, obj.obj); } } }, { fn: fn, obj: obj, overrideContext: overrideContext } ); }; // On assigne un évenement de la sorte : YAHOO.util.Event.onMouseEnter( element, function(e, obj) { // Do something }, params, overrideContext ); YAHOO.util.Event.onMouseLeave( element, function(e, obj) { // Do something }, params, overrideContext );
Bon, je ne suis pas vraiment satisfait de cette version mais ça semble fonctionner. Je suis à votre écoute pour toute modification. Proposez moi vos idées en commentaire ou par mail.
Edit : Voilà, je l'ai modifié. Elle est plus propre. Quoique pas assez testée. Vous pouvez voir un exemple ici. Je suis toujours ouvert à vos propositions.
Edit : Une 3° version mieux optimisée et qui marche pour de vrai :)
Edit : Une 4° pour que ça marche avec l'handicapé IE6 -_-,
Commentaires