JavaScript: Ajout d'un gestionnaire onClick sans écraser l'existant
Je suis en train de modifier tous les liens sur une page pour leur permettre d'effectuer un travail supplémentaire lorsqu'ils sont cliqués.
Trivial approche pourrait être quelque chose comme ceci:
function adaptLinks()
{
var links = document.getElementsByTagName('a');
for(i = 0; i != links.length; i++)
{
links[i].onclick = function (e)
{
<do some work>
return true;
}
}
}
Mais certains liens ont déjà un onClick gestionnaire qui doit être préservé. J'ai essayé le suivant:
function adaptLinks()
{
var links = document.getElementsByTagName('a');
for(i = 0; i != links.length; i++)
{
var oldOnClick = links[i].onclick;
links[i].onclick = function (e)
{
if(oldOnClick != null && !oldOnClick())
{
return false;
}
<do some work>
return true;
}
}
}
Mais cela ne fonctionne pas parce que oldOnClick n'est évaluée que lorsque le gestionnaire est appelé (il contient la valeur de la dernier le lien sous ce point).
- J'ai vu que beaucoup de tâches similaires autour d'ici sont résolus à l'aide de jQuery. Je suis actuellement à la recherche en elle, comme il semble à l'aise dans plusieurs autres tâches.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour créer une fermeture de conserver l'original
onclick
valeur de chaque lien:Noter que cette mise en œuvre n'effectue de la nouvelle onclick manipulation si l'original onclick gestionnaire renvoie la valeur true. C'est bien si c'est ce que vous voulez, mais gardez à l'esprit que vous aurez à modifier le code légèrement si vous souhaitez effectuer la nouvelle onclick de la manipulation, même si le gestionnaire d'origine renvoie la valeur false.
Plus sur les fermetures à la comp.lang.FAQ javascript et de Douglas Crockford.
À ne pas attribuer à un gestionnaire d'événement directement: utilisation de l'souscrire modèle addEventListener /attachEvent à la place (qui ont également supprimer des paires!).
Bonne introduction ici.
this
et c'est vraiment rien à voir avec MS, et c'est exactement pourquoi j'ai un problème avec la fonction "utiliser jquery" réponse, parce que les gens ne comprennent pas vraiment ce qu'il se passe.Utiliser un wrapper autour de la méthode addEventListener (DOM soutenir les navigateurs) ou attachEvent (IE).
Noter que si jamais vous voulez stocker une valeur dans une variable sans écraser l'ancienne valeur, vous pouvez utiliser fermetures.
Dans La Programmation Orientée Aspects, ce qui est connu comme "conseils".
comment sur la définition de
oldClick = links[i].onclick or an empty function
. CommeOu vous pouvez utiliser
attachEvent
etaddEventListener
comme d'autres l'ont recommandéet de l'utiliser comme
À l'aide de JQuery, le code suivant fonctionne:
Cela nécessite l'utilisation d'une bibliothèque, mais évite certains problèmes qui existent avec la méthode addEventListener/attachEvent (comme le dernier problème avec ceci références).
Il y a juste un inconvénient: si l'original onClick gestionnaire est affectée à l'aide "normal" de JavaScript, la ligne
toujours résoudre à vrai, même dans le cas où le gestionnaire d'origine annulé l'événement, en retournant false. Pour résoudre ce problème, le gestionnaire d'origine a utiliser JQuery ainsi.
Cette fonction devrait être utilisable (écouteurs d'événement approche):
ou vous pouvez enregistrer un peu plus de code de l'ajout de cette fonction (si vous avez besoin d'ajouter le même écouteur d'événement à de nombreux éléments):
J'ai eu des problèmes avec la surcharge de la manière la plus simple - cette page a été une grande ressource
http://www.quirksmode.org/js/events_advanced.html