78 votes

Comment écraser les gestionnaires d'événements de Jquery ?

Je vais essayer d'expliquer le problème avec un code simple.

var fireClick = function() { alert('Wuala!!!') };

$('#clickme').click(fireclick);
$('#clickme').click(fireclick);

Donc maintenant, il va évidemment alerter 2 fois mais j'ai besoin qu'il n'alerte qu'une fois. J'ai essayé de nombreuses façons, mais sans résultat.

Merci.

0 votes

Pouvez-vous nous expliquer comment l'appel pour lier l'événement se produit deux fois ? Peut-être pouvez-vous empêcher le deuxième appel en modifiant un peu le fonctionnement de votre code.

1 votes

22 votes

C'est "Voila". :)

142voto

tvanfosson Points 268301

À partir de jQuery 1.7, vous devez utiliser off pour supprimer les gestionnaires d'événements et sur pour les ajouter, bien que vous puissiez toujours utiliser la fonction click en abrégé.

$('#clickme').off('click').on('click', fireclick);
$('#clickme').off().on('click', fireclick);

Réponse originale :

Si vous voulez remplacer tous les gestionnaires de clics, appelez délier d'abord sans argument de fonction. Si vous voulez remplacer tous les gestionnaires d'événements, ne spécifiez pas le type d'événement.

$('#clickme').unbind('click').click(fireclick);
$('#clickme').unbind().click(fireclick);

1 votes

Bah ! Tu gagnes pour le chaînage de l'appel, mais peut-être que tu pourrais affiner ta réponse pour qu'elle ne supprime que le gestionnaire spécifique qui est ajouté à nouveau ? Donc : $('#clickme').unbind('click', fireclick).click(fireclick)

4 votes

La question était "écraser les gestionnaires d'événements jquery" - je supposais qu'il voulait les remplacer tous. Pour ce faire, il doit appeler unbind à chaque fois (c'est pourquoi j'ai répété l'appel sur les deux) et ne pas spécifier un argument de fonction.

3 votes

C'était définitivement la bonne façon de faire quand vous avez répondu à la question, donc j'ai upvoted. Cela dit, je crois que la façon "nouvelle et améliorée" est avec les méthodes on() et off(). Comme cette réponse est le premier résultat de Google pour la recherche "jquery replace event handler", il pourrait être utile de l'ajouter à votre réponse. $('#clickme').off('click').on('click', fireclick); ou simplement $('#clickme').off('click').click(fireclick); .

25voto

Neil Stevens Points 61

Utilisez un espace de noms pour vous assurer que vous ne supprimez pas d'autres listeners :

$('#clickme').off('click.XXX').on('click.XXX', fireclick);

Tant qu'aucun autre code n'utilise XXX vous pouvez être sûr que vous n'avez pas perturbé un autre comportement dont vous n'étiez pas conscient.

18voto

moff Points 4713

Vous pouvez utiliser la fonction jQuery délier pour supprimer le premier événement :

var fireClick = function() { alert('Wuala!!!') };

$('#clickme').click(fireclick);
$('#clickme').unbind('click', fireClick); // fireClick won't fire anymore...
$('#clickme').click(fireclick); // ...but now it will

3voto

Mark Renouf Points 13128

J'essaierais d'éliminer les appels supplémentaires, mais à défaut, vous pourriez vous assurer d'appeler les deux à chaque fois :

$('#clickme').unbind('click', fireclick);
$('#clickme').click(fireclick);

1voto

Hassan Ejaz Points 133
$(document).off('click', '#clickme').on('click', '#clickme', fireclick);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X