2011-04-06 2 views
0

J'affecte un gestionnaire onclick à une case à cocher. Parfois javascript qui fait la liaison de l'événement s'exécute plus d'une fois (sur les postbacks partiels) et le gestionnaire est assigné deux fois. Comment puis-je empêcher l'assignation multiple du gestionnaire?jQuery/javascript - Câbler le gestionnaire d'événements uniquement lorsque ce n'est pas déjà attribué

Bon merci pour les réponses. J'ai écrit quelque chose pour savoir si l'élément a une hanlder:

$.fn.hasHandler = function(eventName, handler) 
{ 
    var _hasHandler = false; 

    if(handler != undefined && this.data("events") !== null && this.data("events") !== undefined) 
    { 
     $.each(this.data("events"), function(name, handlers) 
     { 
      if(name === eventName)  
      { 
       $.each(handlers, function(index, value) 
       { 
        if(value.handler === handler) 
        { 
         _hasHandler = true; 
        } 
       }); 
      } 
     }); 
    } 

    return _hasHandler; 
} 
+0

Si vous recherchez des publications partielles, réattribuez-vous le gestionnaire parce que l'élément a été recréé? – StuperUser

+0

IMO vous devez améliorer votre structure un peu comme l'attribution d'événements dans le code JS qui est rendu sur des publications partielles n'est pas vraiment une bonne idée. J'aimerais savoir votre cas d'utilisation pourquoi vous ne pouvez pas tirer le code de l'événement à javascript large applicaton? – neebz

Répondre

1

En supposant que vous avez:

<input type="checkbox" id="myCheck" /> 

Votre javascript est peut-être:

var clickFound = false; 
$.each($("#myCheck").data('events'), function(i, e) { 
    if(i === 'click') { 
     clickFound = true; 
    } 
}); 
if(!clickFound) { 
    $("#myCheck").click(function() { 
     // ... 
    }); 
} 

Voir plus sur les tests pour les événements liés via jQuery at this question.

Y at-il une raison, cependant, vous ne pouvez pas utiliser delegate ou l'ancien live pour permettre à votre gestionnaire d'être lié une fois, puis de persister pour tous les éléments correspondants?

+0

fyi pour les personnes qui lisent ceci, j'ai mis à jour la question avec ma solution finale. –

1

Vous pouvez ajouter une classe à votre case à cocher lorsque vous ajoutez le gestionnaire de clic, puis vérifiez plus tard pour l'existence de la classe.

Vous pouvez également unbind le gestionnaire de clic avant d'en ajouter un comme alternative. Ou, probablement la chose la plus propre à faire serait d'empêcher votre code de s'exécuter deux fois.

4

Vous pouvez vous désolidariser en premier.

$ ('# foo'). Unbind ('click'). Bind ('click', function() {... faire des trucs ici ...});

+1

Bien que 'unbind (eventName)' déconnecte TOUS les gestionnaires d'événements de clic. Si la fonction est stockée dans une variable, elle peut être non liée individuellement. – StuperUser

+0

cela pourrait être une solution plus facile, mais cela ne répond pas à ma question initiale. Merci quand même. –

Questions connexes