Najlepszy sposób na usunięcie obsługi zdarzeń w jQuery?

Mam input type="image". To działa jak notatki komórki w programie Microsoft Excel. Jeśli ktoś wpisuje liczbę do pola tekstowego, z którym ta input-image jest sparowana, konfiguruję obsługę zdarzeń dla input-image. Następnie, gdy użytkownik kliknie image, dostaje małe wyskakujące okienko, aby dodać notatki do danych.

Mój problem polega na tym, że gdy użytkownik wprowadza zero do pola tekstowego, muszę wyłączyć obsługę zdarzeń input-image. Próbowałem następujących, ale bezskutecznie.

$('#myimage').click(function { return false; });
Author: Konrad Borowski, 2008-10-16

18 answers

JQuery ≥ 1.7

Wraz z jQuery 1.7 zaktualizowano interfejs API zdarzenia, .bind()/.unbind() są nadal dostępne dla kompatybilności wstecznej, ale preferowaną metodą jest użycie na()/Funkcje off () . Poniżej byłoby teraz,

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

JQuery

W przykładowym kodzie po prostu dodajesz kolejne zdarzenie kliknięcia do obrazu, nie nadpisując poprzedniego:

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

Oba zdarzenia kliknięcia zostaną zwolnione.

Jako ludzie czy możesz użyć unbind, aby usunąć wszystkie zdarzenia kliknięcia:

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

Jeśli chcesz dodać pojedyncze zdarzenie, a następnie je usunąć (bez usuwania innych, które mogły zostać dodane), możesz użyć przestrzeni nazw zdarzenia:

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

I usunąć tylko Twoje wydarzenie:

$('#myimage').unbind('click.mynamespace');
 1503
Author: samjudson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-18 13:16:19

To nie było dostępne, gdy odpowiedź na to pytanie została udzielona, ale możesz również użyć metody live(), aby włączyć/wyłączyć zdarzenia.

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

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

Co się stanie z tym kodem jest to, że po kliknięciu #mydisablebutton, doda klasę wyłączoną do elementu # myimage. Spowoduje to, że selektor nie będzie już pasował do elementu i zdarzenie nie zostanie wywołane, dopóki Klasa 'disabled' nie zostanie usunięta .selektor live() ponownie poprawny.

To ma inne korzyści dodając stylizację opartą również na tej klasie.

 59
Author: MacAnthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-07 14:14:12

Można to zrobić za pomocą funkcji unbind.

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

Możesz dodać wiele procesów obsługi zdarzeń do tego samego obiektu i zdarzenia w jquery. Oznacza to, że dodanie nowego nie zastępuje starych.

Istnieje kilka strategii zmiany procedur obsługi zdarzeń, takich jak przestrzenie nazw zdarzeń. Jest kilka stron o tym w dokumentach online.

Spójrz na to pytanie (tak dowiedziałem się o unbind). Istnieje kilka przydatnych opis tych strategii w odpowiedzi.

Jak odczytać związane funkcje wywołania zwrotnego hover w jquery

 37
Author: Mnebuerquo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:32

Jeśli chcesz odpowiedzieć na zdarzenie tylko jeden raz, poniższa składnia powinna być naprawdę pomocna:

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

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

Używanie argumentów .callee , możemy zapewnić, że jedna konkretna funkcja obsługi funkcji anonimowych zostanie usunięta, a tym samym będzie miała jeden Czas Obsługi dla danego zdarzenia. Mam nadzieję, że to pomoże innym.

 34
Author: ghayes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 07:29:01

Może metoda unbind będzie działać dla ciebie

$("#myimage").unbind("click");
 29
Author: John Boker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-16 15:31:02

Musiałem ustawić Zdarzenie NA null używając propa i attr. Nie mogłem tego zrobić z jednym lub drugim. Ja też nie mogłem dostać .odepnij się do pracy. Pracuję nad elementem TD.

.prop("onclick", null).attr("onclick", null)
 29
Author: dwhittenburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-28 14:44:31

Możesz dodać obsługę onclick jako znacznik inline:

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

Jeśli tak, jquery .off() lub .unbind() nie będzie działać. Musisz również dodać oryginalny program obsługi zdarzeń w jquery:

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

Następnie jquery ma odniesienie do obsługi zdarzenia i może go usunąć:

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

VoidKing wspomina o tym nieco bardziej skośnie w komentarzu powyżej.

 10
Author: davaus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 08:07:30

Jeśli zdarzenie jest dołączone w ten sposób , a cel ma być odłączony:

$('#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
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 14:02:53

Aktualizacja dla 2014

Używając najnowszej wersji jQuery, możesz teraz odłączyć wszystkie zdarzenia w przestrzeni nazw, wykonując po prostu $( "#foo" ).off( ".myNamespace" );

 9
Author: alexpls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-05 02:32:24

Dzięki za informacje. bardzo pomocne użyłem go do blokowania interakcji strony w trybie edycji przez innego użytkownika. Używałem go w połączeniu z ajaxComplete. Nie musi być to samo zachowanie, ale nieco podobne.

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

function executePageLock(){
    //do something
}
 6
Author: jquery_user,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-11 16:09:31

Najlepszym sposobem na usunięcie zdarzenia onclick inline jest $(element).prop('onclick', null);

 6
Author: Shahrukh Azeem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 14:43:04

W przypadku .on() metoda była wcześniej używana z konkretnym selektorem, jak w poniższym przykładzie:

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

Obie metody unbind() i .off() nie działają .

Jednak .metoda undelegate () może być użyta do całkowitego usunięcia obsługi ze zdarzenia dla wszystkich elementów pasujących do bieżącego selektora:

$("body").undelegate(".dynamicTarget", "click")
 3
Author: Ilia Rostovtsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 10:11:19

To również działa dobrze .Proste i łatwe.zobacz http://jsfiddle.net/uZc8w/570/

$('#myimage').removeAttr("click");
 2
Author: Somnath Kharat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 12:31:23

Jeśli ustawisz onclick przez html Musisz removeAttr ($(this).removeAttr('onclick'))

Jeśli ustawisz go przez jquery (jak po pierwszym kliknięciu w moich przykładach powyżej) to musisz unbind($(this).unbind('click'))

 2
Author: Ishan Liyanage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-27 06:12:56

To remove wszystkie event-handlers, to mi się udało:

Aby usunąć wszystkie procedury obsługi zdarzeń, należy mieć zwykły HTML structure bez wszystkich event handlers dołączonych do element i jego child nodes. Aby to zrobić, jQuery's clone() pomógł.

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);

Z tym, będziemy mieć clone w miejsce original Bez event-handlers na nim.

Powodzenia...
 2
Author: Akash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 07:18:42

Mam nadzieję, że mój poniższy kod wszystko wyjaśni. 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
Author: mysticmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 08:28:44

Wiem, że to przychodzi późno, ale dlaczego nie użyć zwykłego JS do usunięcia zdarzenia?

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

Lub, jeśli używasz nazwanej funkcji jako obsługi zdarzenia:

function eh(event){...}
var myElement = document.getElementByID("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it
 1
Author: Silviu Preda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 14:24:30

Wszystkie opisane podejścia nie działały dla mnie, ponieważ dodawałem Zdarzenie click z on() do dokumentu, w którym element został utworzony w czasie wykonywania:

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


moje obejście:

Ponieważ nie mogłem odpiąć".button " class I just assigned another class to the button that had the same CSS styles. W ten sposób live/on-event-handler zignorował kliknięcie w końcu:

// prevent another click on the button by assigning another class
$(".button").attr("class","buttonOff");
Mam nadzieję, że to pomoże.
 0
Author: Kai Noack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-12 08:00:07