Meilleure façon de supprimer un gestionnaire d'événement en jQuery?

j'ai un input type="image" . Cela agit comme les notes de cellule dans Microsoft Excel. Si quelqu'un entre un nombre dans la zone de texte où ce input-image est jumelé, j'installe un gestionnaire d'événements pour le input-image . Ensuite, lorsque l'utilisateur clique sur le image , il obtient un petit popup pour ajouter quelques notes aux données.

mon problème est que lorsqu'un utilisateur entre un zéro dans la zone de texte, je dois désactiver le gestionnaire d'événements de input-image . J'ai essayé ce qui suit, mais en vain.

$('#myimage').click(function { return false; });
978
demandé sur Konrad Borowski 2008-10-16 19:28:47

18 réponses

jQuery ≥ 1,7

avec jQuery 1.7 onward L'API event a été mise à jour, .bind() / .unbind() sont toujours disponibles pour la compatibilité ascendante, mais la méthode préférée est d'utiliser les fonctions on() / off() . Le dessous serait maintenant,

$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

jQuery < 1.7

dans votre exemple de code vous ajoutez simplement un autre clic événement à l'image, ne dépassant pas le précédent:

$('#myimage').click(function() { return false; }); // Adds another click event

les deux événements de clic seront alors renvoyés.

comme les gens ont dit que vous pouvez utiliser unbind pour supprimer tous les événements de clic:

$('#myimage').unbind('click');

si vous voulez ajouter un seul événement et ensuite le supprimer (sans en supprimer d'autres qui auraient pu être ajoutés), vous pouvez utiliser l'event namespacing:

$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });

et de supprimer votre événement:

$('#myimage').unbind('click.mynamespace');
1503
répondu samjudson 2016-09-18 13:16:19

ce n'était pas disponible lorsque cette question a été répondue, mais vous pouvez également utiliser la méthode live () pour activer/désactiver les événements.

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

ce qui se passera avec ce code est que lorsque vous cliquerez sur #mydisabblebutton, il ajoutera la classe désactivée à l'élément #myimage. Cela permettra au sélecteur de ne plus correspondre à l'élément et l'événement ne sera pas déclenché tant que la classe 'disabled' n'aura pas été retirée, ce qui rendra le .sélecteur live () valide à nouveau.

ceci a d'autres avantages en ajoutant le style basé sur cette classe aussi bien.

59
répondu MacAnthony 2010-10-07 14:14:12

cela peut être fait en utilisant la fonction unbind.

$('#myimage').unbind('click');

vous pouvez ajouter plusieurs gestionnaires d'événements au même objet et événement dans jquery. Cela signifie l'ajout d'un nouveau ne pas remplacer les anciennes.

il existe plusieurs stratégies pour changer les gestionnaires d'événements, comme les espaces de noms d'événements. Il y a quelques pages à ce sujet dans les documents en ligne.

Regardez cette question (c'est comme ça que j'ai appris l'unbind). Il y a quelques description utile de ces stratégies dans les réponses.

Comment lire lié placez les fonctions de rappel en jquery

37
répondu Mnebuerquo 2017-05-23 11:33:32

si vous voulez répondre à un événement une seule fois , la syntaxe suivante devrait être vraiment utile:

 $('.myLink').bind('click', function() {
   //do some things

   $(this).unbind('click', arguments.callee); //unbind *just this handler*
 });

utilisant les arguments .appelé , nous pouvons nous assurer que le gestionnaire de fonction anonyme est supprimé, et donc avoir un seul gestionnaire de temps pour un événement donné. Espérons que cela aide les autres.

34
répondu ghayes 2011-08-05 07:29:01

peut-être que la méthode unbind fonctionnera pour vous

$("#myimage").unbind("click");
29
répondu John Boker 2008-10-16 15:31:02

j'ai dû régler l'événement à null en utilisant l'hélice et l'attr. Je ne pouvais pas le faire avec l'un ou l'autre. Je n'arrivais pas à obtenir .unbind de travail. Je travaille sur un élément TD.

.prop("onclick", null).attr("onclick", null)
29
répondu dwhittenburg 2012-03-28 14:44:31

vous pouvez ajouter le onclick handler comme inline markup:

<input id="addreport" type="button" value="Add New Report" onclick="openAdd()" />

si c'est le cas, le jquery .off() ou .unbind() ne fonctionnera pas. Vous devez ajouter le gestionnaire d'événement original dans jquery aussi bien:

$("#addreport").on("click", "", function (e) {
   openAdd();
});

alors le jquery a une référence au gestionnaire d'événements et peut la supprimer:

$("#addreport").off("click")

VoidKing mentionne cela un peu plus obliquement dans un commentaire ci-dessus.

10
répondu davaus 2015-08-07 08:07:30

si l'événement est attaché de cette façon , et la cible doit être détachée:

$('#container').on('click','span',function(eo){
    alert(1);

    $(this).off(); //seams easy, but does not work

    $('#container').off('click','span'); //clears click event for every span

    $(this).on("click",function(){return false;}); //this works.

});​
9
répondu 2013-11-01 14:02:53

mis à jour pour 2014

en utilisant la dernière version de jQuery, vous êtes maintenant en mesure de débiner tous les événements sur un espace de noms en faisant simplement $( "#foo" ).off( ".myNamespace" );

9
répondu alexpls 2014-05-05 02:32:24

Merci pour l'information. très utile je l'ai utilisé pour verrouiller l'interaction de page pendant que dans le mode d'édition par un autre utilisateur. Je l'ai utilisé en conjonction avec ajaxComplete. Pas nécessairement le même comportement, mais quelque peu similaire.

function userPageLock(){
    $("body").bind("ajaxComplete.lockpage", function(){
        $("body").unbind("ajaxComplete.lockpage");
        executePageLock();      
    });
};  

function executePageLock(){
    //do something
}
6
répondu jquery_user 2011-03-11 16:09:31

la meilleure façon de supprimer l'événement onclick en ligne est $(element).prop('onclick', null);

6
répondu Shahrukh Azeem 2015-01-02 14:43:04

dans le cas .on() méthode a été précédemment utilisé avec un sélecteur particulier, comme dans l'exemple suivant:

$('body').on('click', '.dynamicTarget', function () {
    // Code goes here
});

les deux unbind() et .off() méthodes ne sont pas aller à travailler.

Toutefois, .la méthode undelegate() pourrait être utilisée pour supprimer complètement handler de l'événement pour tous les éléments qui correspondent au sélecteur courant:

$("body").undelegate(".dynamicTarget", "click")
3
répondu Ilia Rostovtsev 2016-06-27 10:11:19

ça marche aussi très bien .Simple et facile.voir http://jsfiddle.net/uZc8w/570 /

$('#myimage').removeAttr("click");
2
répondu Somnath Kharat 2013-06-15 12:31:23

si vous définissez la onclick via html vous devez removeAttr ($(this).removeAttr('onclick'))

si vous le définissez via jquery (comme après le premier clic dans mes exemples ci-dessus) alors vous devez unbind($(this).unbind('click'))

2
répondu Ishan Liyanage 2015-06-27 06:12:56

à remove tout event-handlers , c'est ce qui a fonctionné pour moi:

pour supprimer tous les gestionnaires d'événements signifie d'avoir la plaine HTML structure sans tout le event handlers attaché au element et son child nodes . Pour ce faire, jQuery's clone() a aidé.

var original, clone;
// element with id my-div and its child nodes have some event-handlers
original = $('#my-div');
clone = original.clone();
//
original.replaceWith(clone);

avec ceci, nous aurons le clone à la place du original sans event-handlers dessus.

bon Chance...

2
répondu Akash 2017-12-12 07:18:42

J'espère que mon code ci-dessous explique tout. HTML:

(function($){

     $("#btn_add").on("click",function(){
       $("#btn_click").on("click",added_handler);
       alert("Added new handler to button 1");
     });

  
 
     $("#btn_remove").on("click",function(){
       $("#btn_click").off("click",added_handler);
       alert("Removed new handler to button 1");
     });

  
   function fixed_handler(){
    alert("Fixed handler");
  }
  
   function added_handler(){
    alert("new handler");
  }
  
  $("#btn_click").on("click",fixed_handler);
  $("#btn_fixed").on("click",fixed_handler);
  
  
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn_click">Button 1</button>
  <button id="btn_add">Add Handler</button>
  <button id="btn_remove">Remove Handler</button>
  <button id="btn_fixed">Fixed Handler</button>
1
répondu mysticmo 2015-12-22 08:28:44

je sais que cela arrive tard, mais pourquoi ne pas utiliser des js simples pour supprimer l'événement?

var myElement = document.getElementByID("your_ID");
myElement.onclick = null;

ou, si vous utilisez une fonction nommée comme gestionnaire d'événements:

function eh(event){...}
var myElement = document.getElementByID("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it
1
répondu Silviu Preda 2016-09-05 14:24:30

toutes les approches décrites ne fonctionnaient pas pour moi parce que j'ajoutais l'événement de clic avec on() au document où l'élément a été créé à l'exécution:

$(document).on("click", ".button", function() {
    doSomething();
});



ma solution:

comme je ne pouvais pas détacher le ".bouton" classe j'ai juste reçu une autre classe pour le bouton qui a le même styles CSS. En agissant de la sorte, le gestionnaire d'événements/en direct a finalement ignoré le clic:

// prevent another click on the button by assigning another class
$(".button").attr("class","buttonOff");

Espère que ça aide.

0
répondu Kai Noack 2014-02-12 08:00:07