2010-10-16 8 views
1

Comme de nombreux navigateurs ne montrent pas d'info-bulles sur les éléments de formulaire désactivés (comme le fait Opera), j'ai décidé d'émuler le bouton désactivé avec jQuery. Lorsque je désactive la classe de contrôle, je la désactive et pour les boutons/soumettre les contrôles, j'ajoute un gestionnaire d'événements click(function(){return false;}) et je peux le désactiver plus tard lors de la réactivation du contrôle. Maintenant, le problème est - Je dois supprimer tous les gestionnaires d'événements (click, enter key) du contrôle désactivé, sauf 'mouseenter' et 'mouseleave' car j'utilise une info-bulle personnalisée basée sur jQuery qui nécessite ces événements. Et après avoir réactivé le bouton, j'ai besoin de restaurer tous les gestionnaires.Comment trouver certains gestionnaires d'événements avec jQuery?

Je sais que je peux stocker les gestionnaires d'événements attachés dans $.data() mais je n'ai aucune idée, comment rassembler tous les gestionnaires d'événements sauf 'mouseenter' et 'mouseleave'.

Pouvez-vous m'aider?

Répondre

2

essayez ceci:

<script> 

$(function() { 

//Lets attach 2 event handlers to the div 
$("#el").click(function(){ alert("click"); }); 
$("#el").mouseover(function(){ alert("mouseover"); }); 


//We iterate on the div node and find the events attached to it 

$.each($("#el").data("events"), function(i, event) { 
    output(i); 
    $.each(event, function(j, h) { 
     output(h.handler); 
     //DO your unbind here if its not a mouse-enter or a mouseleave 
    }); 
    }); 
}); 

function output(text) { 
    $("#output").html(function(i, h) { 
     return h + text + "<br />"; 
    }); 
} 

</script> 

<div id="el" style="width: 200px; height: 200px; border: solid 1px red;">Test</div> 
<span id="output"></output> 
+0

Merci, votre code avec l'analyse événement.type a fait l'affaire. – JustAMartin

1

Je ne viendrais pas tout ce travail.

Puisque vous avez une classe .disabled sur les éléments handicapés, je venais de l'utiliser comme un drapeau pour handicapés/activer la fonctionnalité en testant pour cette classe dans une déclaration if() et retourner false si l'élément a la classe disabled .

Donc, en utilisant le gestionnaire click que vous avez donné, au lieu de:

$('someElement').click(function(){return false;}); 

Je ferais ceci:

$('someElement').click(function() { 
    if($(this).hasClass('disabled')) { 
     return false; 
    } else { 
     // run your code 
    } 
}); 

Maintenant, lorsque vous supprimez la classe .disabled, l'entrée fonctionnera à nouveau. Non unbind/bind ou le suivi en utilisant .data(). Beaucoup plus simple.

+0

Oui, ce serait la solution la plus efficace, mais cela forcera les autres développeurs qui pourraient écrire des gestionnaires d'événements, à se rappeler de vérifier l'état désactivé. Je voudrais que la solution Enabler/Disabler soit comme un morceau de code séparé, très probablement, le plugin jQuery. – JustAMartin

Questions connexes