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; });
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');
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.
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
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.
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");
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)
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.
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.
});
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" );
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
}
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);
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")
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");
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'))
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.
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>
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
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.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