Utiliser jQuery, je voudrais, sans modifier l'attribut code> désactivé code> d'un bouton donné, désactivez tous les événements de clic pour cela. P>
Je pensais récupérer les gestionnaires de l'événement de clic, les entrer et les stocker (disons, en utilisant Ensuite, je peux les réentraîner une fois que le bouton est activé à nouveau. p> data () code>). p>
8 Réponses :
C'est la voie à suivre. Si vous avez onclick spécifié en tant qu'attribut, vous pouvez changer l'attribut Busing
$(button_element).attr('click', 'do_the_regular_action()');
Supposons que je ne connais pas tous les gestionnaires d'événements attribués à l'élément. Et il pourrait y avoir plus d'un.
Vous pouvez utiliser et p>
Unbind code> et lier code> p>
$ ('# contrôle'). UNBIND ("Cliquez sur"); CODE> P>
$ ('# contrôle'). Bind ("Cliquez sur", Nomoffunckscallall); CODE> P>
Je ne pense pas que cela réponde à la question de l'OP (bien que je puisse me tromper). Dans les sons, il peut y avoir plusieurs gestionnaires de clic, et il ne peut pas être en mesure d'obtenir une référence au gestionnaire pour une liaison (par exemple, une fonction anonyme ou une autre portée).
Voici encore une autre solution:
$("#myButton").attr("temp_disable", "disabled");
window.setTimeout(function() { $("#myButton").attr("temp_disable", ""); }, 10000);
C'est une sorte de ce que j'ai fini par faire. Mais le problème est que cela doit être ajouté à chaque gestionnaire défini. D'un point de vue de conception, ce n'est pas une bonne solution, car certains événements peuvent être ajoutés par code qui n'est pas dans mon contrôle.
@OVESH La seule façon de le faire "globalement" à part de vraiment désactiver le bouton est la modifier en quelque chose d'autre par exemple. div code> qui ne ressemble à un bouton seulement, puis changez-le sur le bouton lorsque l'heure expire - Espérons que les gestionnaires d'événements seront préservés, doivent le vérifier en premier.
C'est en fait une très bonne idée. Vous pouvez le remplacer par un bouton compatible avec style (sans événements clic ci-joints) et conservez le bouton d'origine à l'aide de DATA () CODE>. Puis remplacez le bouton d'origine.
Pas difficile à faire depuis que JQuery stocke déjà tous ses gestionnaires d'événements sous forme de données Vous pouvez également enregistrer une référence aux gestionnaires avec: p> () code> sur l'élément lui-même. Vous pouvez obtenir (et modifier) cet objet via .data (). Événements code>. events._click = events.click;
events.click = null;
// Block .live() and .delegate()
$("#el").click(function (e) {
e.stopPropagation();
});
Ce type d'approche pourrait être problématique. Pour un, je pense avoir lu quelque part que ce comportement n'est pas pris en charge dans de nouvelles versions de JQuery. Mais même si ce n'est pas vrai, ce n'est pas un comportement documenté, je ne peux donc pas y fier aux futures versions de JQuery.
@OVESH, comme de côté, je pense que JavaScript est l'une des langues, éventuellement en raison de sa nature dynamique, de «source ouverte» de facto (jamais compilée, uniquement parfois minifiée) et une histoire des incompatibilités du navigateur, où il y a moins d'un intérêt pour cacher / protéger les détails de la mise en œuvre. Tant que les risques sont compris et que aucune meilleure alternative n'existe, n'hésitez pas à plonger, à modifier les prototypes, aux fonctions de remplacement et en général ..)
D'accord. Je vais accepter la réponse, car il n'y a probablement aucune meilleure solution.
Il semble que cela ne fonctionne plus (à partir de JQuery 1.10, au moins).
Je vais développer la réponse proposée par Barry et Thariama ... que je pense satisfaire aux objections d'Ovesh:
Vous pouvez ajouter un espace de noms à votre reliure d'événement. Cela vous permet de faire référence à cet événement spécifique contraignant plus tard, sans collision avec d'autres liaisons. Je pense que c'est plus propre que la réponse acceptée ... (Pour être juste, cela n'a peut-être pas été disponible à JQuery au moment de la question initiale). P>
// A generic click handler:
$('.myButton').click(function() { ... });
// A namespaced click handler:
$('.myButton').bind('click.someSituation', function() { ... });
// Later you can unbind only the handler you want by using the namespace:
$('.myButton').unbind('click.someSituation');
// The default click handler still works.
Je suppose que j'aurais dû le rendre plus clair dans la question. Il pourrait y avoir plusieurs événements de clic, qui n'étaient pas tous liés par mon code. Cette solution n'est pas assez générique.
Dans mon exemple, le générique .Click () est un événement lié par un autre code. Le nom de noms de noms (cliquez sur ...) est dans votre code. Vous pouvez engager votre gestionnaire de clicsPached Click, sans affecter d'autres gestionnaires de clic.
Ah, mais la question dit, je veux désactiver tous i> cliquez sur les événements sur celui-ci.
Au lieu de faire cette chose, utilisez Core JavaScript pour faire cette tâche par exemple. Regardez l'exemple suivant.
function MakeSaveDisabled(flg) {
if (flg != null) {
$(".btnpost").each(function () {
this.removeAttribute("disabled");
if (this.hasAttribute("oclickevt")) {
this.setAttribute("onclick", this.getAttribute("oclickevt"));
}
});
}
else {
$(".btnpost").each(function () {
this.setAttribute("disabled", "true");
if (this.getAttribute("onclick") != null) {
this.setAttribute("oclickevt", this.getAttribute("onclick"));
}
this.removeAttribute("onclick");
});
}
}
Toutes les réponses ici sont maintenant obsolètes - à partir de jQuery 1.7, vous devez utiliser p> .off () code> comme expliqué sur le site officiel de jQuery <!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>off demo</title>
<style>
button {
margin: 5px;
}
button#theone {
color: red;
background: yellow;
}
</style>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<button id="theone">Does nothing...</button>
<button id="bind">Add Click</button>
<button id="unbind">Remove Click</button>
<div style="display:none;">Click!</div>
<script>
function flash() {
$( "div" ).show().fadeOut( "slow" );
}
$( "#bind" ).click(function() {
$( "body" )
.on( "click", "#theone", flash )
.find( "#theone" )
.text( "Can Click!" );
});
$( "#unbind" ).click(function() {
$( "body" )
.off( "click", "#theone", flash )
.find( "#theone" )
.text( "Does nothing..." );
});
</script>
</body>
</html>
J'accepterais cela, mais j'aimerais que l'exemple d'abord édité d'appeler () sans argument, pour montrer comment il supprime tous les événements ci-joints (sans avoir à conserver une référence). Cela traiterait de plus près la question initiale.
Vous pouvez enregistrer les événements, puis les restaurer, cela semble fonctionner (notez que le _ peut être omis à être omis en fonction de la version de jQuery).
Cet exemple empêche le déclenchement de l'événement de basculement de basculement, Ensuite, déclenche la bascule puis réinitialise les événements à tout ce qui y était précédemment. Vous pouvez faire la même chose avec Click, etc. P>
var events;
// Save change events associated with this control
events = $._data($(this)[0], "events").change;
$._data($(this)[0], "events").change = null;
// Do your stuff here
$(this).bootstrapToggle("off");
// Reset change events
$._data($(this)[0], "events").change = events;
Vous voudrez peut-être reconsidérer votre approche - si vous voulez un bouton de ne pas fonctionner, désactivez-le. Cela des drapeaux à l'utilisateur clairement que le bouton est désactivé. C'est loin Natre, plus simple et plus cohérent que de travailler autour du comportement par défaut. Pourquoi voulez-vous éviter de désactiver le bouton?