2010-12-02 15 views
2

Suis-je une programmation mal ou de se pencher en arrière trop pour IE par des gestionnaires d'événements assigne comme:Devrais-je attribuer directement des événements JavaScript juste pour unifier le code?

element.someEvent = someFunction; 

au lieu de:

element.attachEventListener("someEvent", someFunction, false); 
  • Quelles seraient les inconvénients et les avantages à cette idée?
  • Que suis-je en train de rater ou de ne pas me contenter de tester et de choisir la bonne méthode?
+0

Je vous remercie tous les commentaires au sujet jAuery :) – Babiker

Répondre

3

Si vous utilisez le style element.onclick = xxx;, vous vous limiter (et tous les autres scripts que vous utilisez sur la page) à un seul gestionnaire d'événementpour l'événement sur cet élément (tout gestionnaire précédent pour ce l'événement est matraqué). Avec le mécanisme addEventListener/attachEvent, vous pouvez attacher et supprimer des gestionnaires d'événements indépendamment les uns des autres, sans interférence.

Ainsi par exemple, si vous faites:

document.getElementById('foo').onclick = function() { 
}; 

... puis tout gestionnaire click précédent sur l'élément foo époustouflé et obtient non plus appelé quand foo cliquez dessus. En revanche:

document.getElementById('foo').addEventListener('click', function() { 
}); 

Maintenant, votre gestionnaire click est appelé, mais toutes les autres click gestionnaires qui ont déjà été attachés à l'élément également obtenir appelé. Tu joues bien avec les autres. :-)

Il est facile de créer une fonction qui fers ces choses pour vous:

function hookEvent(element, eventName, handler) { 
    if (element.attachEvent) { 
     element.attachEvent("on" + eventName, handler); 
    } 
    else if (element.addEventListener) { 
     element.addEventListener(eventName, handler, false); 
    } 
    else { 
     element["on" + eventName] = handler; 
    } 
} 

... ou si vous vraiment veulent aller à la ville:

var hookEvent = (function() { 

    function hookViaAttach(element, eventName, handler) { 
     element.attachEvent("on" + eventName, handler); 
    } 
    function hookViaAdd(element, eventName, handler) { 
     element.addEventListener(eventName, handler, false); 
    } 
    function hookDOM0(element, eventName, handler) { 
     element["on" + eventName] = handler; 
    } 

    if (document.attachEvent) { 
     return hookViaAttach; 
    } 
    if (document.addEventListener) { 
     return hookViaAdd; 
    } 
    return hookDOM0; 
})(); 

... qui crée une fonction qui détecte fois quel type de gestionnaire à utiliser, puis utilise tout au long.

Franchement, bien que, pour ce genre de choses, il est utile de tirer parti du travail des autres et utiliser une bibliothèque comme jQuery, Prototype, YUI, Closure ou any of several others.

+0

Oui, mais ne peux pas que je fais, element.onclick = function() {}; et faire tout ce que je veux dans la fonction anonyme? – Babiker

+0

@Babiker: Oui, vous pouvez - et vous matraque n'importe quel gestionnaire d'événement précédent sur l'élément. –

+0

Cependant, dans une application Web assez simple, un seul gestionnaire d'événements peut être parfaitement acceptable. La solution * correcte * dépend des besoins de l'application. –

0

Dans IE, vous devez utiliser attachEvent. (Le mécanisme DOM standard est addEventListener.) Je recommande fortement d'utiliser une bibliothèque comme jQuery qui prend soin de ces différences de navigateur pour vous. Des frameworks comme jQuery se chargent également d'aplanir les différences entre les modèles d'événements dans différents navigateurs.

+0

@James Kovacs, Oh croyez-moi, je suis un débutant et je suis dans ce long terme, je ne voudrais pas utiliser jQuery pour sauver ma vie: D – Babiker

+1

@Babiker: Si vous avez un problème avec jQuery, fair 'nuff, mais regardez dans vos autres options (je vous ai donné une liste, et un lien vers un plus long). Il y a un ** lot ** de solutions de contournement spécifiques au navigateur et d'autres «pièges» que d'autres personnes ont déjà rencontrés, débogués et qui ont fonctionné. Il est dans votre intérêt de tirer parti de ce travail plutôt que de le répéter. –

+1

@Babiker Je ne sais pas pourquoi être un débutant/dans le long terme vous fait dire cela. Cela dépend de ce que vous voulez faire. Si votre objectif est de créer des sites Web fonctionnels, alors jQuery est beaucoup plus pratique et vous permet de vous concentrer sur la création de vos fonctionnalités. –

1

Si vous avez un contrôle total sur la page et que vous êtes sûr que toutes les liaisons d'événements se produisent au même endroit, alors .onevent est le moyen le plus simple et le plus supporté.

Si vous êtes inquiet sur le remplacement d'un gestionnaire d'événement précédent, vous pouvez toujours faire:

var oldOnclick = el.onclick; 
el.onclick = function() { 
    // blah blah 
    if (oldOnclick) oldOnclick(); 
}; 
0

De nos jours, il y a beaucoup javascript bibliothèque là-bas qui prendra soin des navigateurs croix compatibilité pour vous et également codage en javascript amusant. L'un des plus populaires est le Jquery.

Vous pouvez enregistrer des événements avec Jquery comme ceci:

 
$(elem).click(function() { 
    alert('Event handler'); 
}); 

or 

$(elem).bind('click', function() { 
    alert('Event handler'); 
});