108 votes

lier l'événement une seule fois

J'ai le code suivant:

 function someMethod()
{
  $(obj).click(function {});
}
 

someMethod est appelé deux fois et l'événement click est donc lié deux fois. Comment puis-je le lier une seule fois?

195voto

pna Points 2120

si vous pouvez l'appliquer, vous voudrez probablement jeter un coup d'œil à event.preventDefaultt et à event.stopPropagation OU à annuler la liaison et la liaison à chaque fois, dans la méthode

 function someMethod()
{
  $(obj).off('click').on('click', function {});
}
 

97voto

Iain Points 1016

En plus de la réponse de pna, vous voudrez peut-être réfléchir à l'espacement des noms de votre événement afin de ne pas débloquer tous les événements de clic accidentellement.

function someMethod () {
    $ (obj) .unbind ('click.namespace'). bind ('click.namespace', function () {});
}

http://docs.jquery.com/Namespaced_Events

20voto

Matt Paxton Points 131

Il n'y a pas de méthode intégrée pour déterminer si vous avez déjà lié cette fonction particulière. Vous pouvez lier plusieurs fonctions de clic à un objet. Par exemple:

 $('#id').bind('click', function(){
alert('hello');
});


$('#id').bind('click', function(){
alert('goodbuy');
});
 

si vous faites ce qui précède lorsque vous cliquez sur l'objet, il vous alerte bonjour alors au revoir. Pour vous assurer qu'une seule fonction est liée à l'événement click, dissociez le gestionnaire d'événements click, puis liez la fonction souhaitée de la manière suivante:

 $(obj).unbind('click').bind('click', function(){... });
 

12voto

jfriend00 Points 152127

La solution évidente est de ne pas appeler someMethod() deux fois. Si vous ne pouvez pas corriger cela, alors vous pouvez garder une variable d'état donc il ne se lie jamais une seule fois, comme ceci:

function someMethod()
{
    if (!someMethod.bound) {
        $(obj).click(function() {});
        someMethod.bound = true;
    }
}

Remarque: cette méthode utilise une propriété de la fonction elle-même plutôt que de l'introduction d'une variable globale pour garder une trace de savoir si c'est lié. Vous pouvez également utiliser une propriété sur l'objet lui-même.

Vous pouvez la voir à l'œuvre ici: http://jsfiddle.net/jfriend00/VHkxu/.

5voto

Esailija Points 74052

jQuery permet d'appeler une fonction une seule fois très facilement:

 function someMethod()
{

     $(obj).click(function() {});
      this.someMethod = jQuery.noop;
}
 

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