3

J'ai besoin d'une fonction de navigateur croisé pour enregistrer les gestionnaires d'événements et une expérience de gestionnaire (pour la plupart) cohérente. Je n'ai pas besoin du poids ou des fonctionnalités d'une bibliothèque comme jQuery, j'ai donc écrit la mienne. Je crois que j'ai atteint mes objectifs avec le code ci-dessous, et jusqu'à présent mes tests ont été couronnés de succès, mais je l'ai regardé trop longtemps. Y a-t-il des failles dans ma logique ou des pièges qui me manquent?Gestion des événements inter-navigateurs

EDIT 1: A commenté chaque bloc avec l'intention du navigateur pour plus de clarté. Bloc IE mis à jour pour ne pas appeler func tout de suite (merci à Andy E's keen eyes).

EDIT 2: Mise à jour bloc IE pour appeler func.call() avec this au lieu de elem.

EDIT 3: Mis à jour pour passer le JSLint avec "les bonnes pièces".

function hookEvent(elem, evt, func) 
{ 
    if (typeof elem === "string") 
    { 
     elem = document.getElementById(elem); 
    } 
    if (!elem) 
    { 
     return null; 
    } 
    var old, r; 
    if (elem.addEventListener) //w3c 
    { 
     elem.addEventListener(evt, func, false); 
     r = true; 
    } 
    else if (elem.attachEvent) //ie 
    { 
     elem[evt + func] = function() 
     { 
      func.call(this, window.event); 
     }; 
     r = elem.attachEvent("on" + evt, elem[evt + func]); 
    } 
    else      //old 
    { 
     old = elem["on" + evt] ? elem["on" + evt] : function (e) { }; 
     elem["on" + evt] = function (e) 
     { 
      if (!e) 
      { 
       e = window.event; 
      } 
      old.call(this, e); 
      func.call(this, e); 
     }; 
     r = true; 
    } 
    return r; 
} 
+1

jQuery est une bibliothèque très légère. Quel est le problème avec l'utilisation? Quelqu'un a déjà fait tout le travail pour vous. Ou n'êtes-vous pas intéressé à l'apprendre? –

+2

@Bears va vous manger - 66K plus, par rapport à cela, est loin d'être léger. Surtout si c'est tout ce dont il a besoin. @Bill Ayakatubby - Par "navigateur croisé", vous voulez vraiment dire "des choses standard que IE ne gère pas correctement". – Rob

+2

@Bears: À ce stade, le seul problème que j'ai avec mon navigateur est l'enregistrement d'événements, je n'ai donc pas besoin de jQuery ou d'une autre bibliothèque. Si ma situation change, je réévaluerai la nécessité d'une bibliothèque. –

Répondre

3

Il y a un problème sur cette ligne:

r = elem.attachEvent("on" + evt, func.call(elem, window.event)); 

Cela exécutera func() immédiatement, au lieu de l'attacher comme gestionnaire pour l'événement. Au lieu de cela, la valeur de retour de func() sera affectée à l'événement, ce qui provoquera une erreur si le type n'est pas "function".

Je peux comprendre que vous ne voulez pas utiliser un framework, mais beaucoup (beaucoup d'autres) ont des écritures de gestion d'événements inter-navigateurs. John Resig a une version, Google pour "javascript addEvent" pour beaucoup plus.

http://www.google.com/search?q=javascript+addevent

+0

Merci pour les commentaires, Andy. J'ai mis à jour mon code pour refléter votre recherche. –