Geriausias būdas pašalinti įvykių tvarkytoją „jQuery“?

Turiu input type="image" . Jis veikia kaip ląstelių pastabos „Microsoft Excel“. Jei kas nors įveda numerį į teksto lauką, kuriame šis input-image suporuotas, nustatau input-image įvykių tvarkyklę. Tada, kai vartotojas nuspaudžia image mygtuką, jie gauna mažą iššokantį >

Mano problema yra ta, kad kai teksto lauke vartotojas įveda nulį, reikia išjungti input-image įvykių tvarkytoją. Aš bandžiau toliau, bet nesėkmingai.

 $('#myimage').click(function { return false; }); 
920
16 окт. nustatyta 16 d 2008-10-16 18:28 '08, 18:28, 2008-10-16 18:28
@ 17 atsakymų

jQuery ≥ 1.7

Atnaujinus „jQuery 1.7“, įvykio API buvo atnaujinta, .bind() / .unbind() vis dar galima naudoti atgaliniam suderinamumui, tačiau pageidaujamas metodas naudojamas () / off () . Dabar jis bus mažesnis:

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

jQuery <1.7

Mėginio kode paprasčiausiai pridėsite kitą paspaudimo vaizdą, o ne pakeiskite ankstesnį:

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

Tada bus pradėti abu paspaudimų įvykiai.

Kaip sakė žmonės, galite naudoti „openind“, kad ištrintumėte visus paspaudimų įvykius:

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

Jei norite pridėti vieną įvykį ir tada jį ištrinti (neištrindami kitų, galbūt pridėtų), galite naudoti įvykio vardų erdvę:

 $('#myimage').bind('click.mynamespace', function() {  }); 

ir ištrinkite tik savo įvykį:

 $('#myimage').unbind('click.mynamespace'); 
1433
17 окт. atsakymą davė samjudsonas spalio 17 d 2008-10-17 00:13 '08 0:13 2008-10-17 00:13

Tai nebuvo įmanoma, kai buvo atsakyta į šį klausimą, tačiau taip pat galite naudoti tiesioginį () metodą įvykių įjungimui / išjungimui.

 $('#myimage:not(.disabled)').live('click', myclickevent); $('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); }); 

Kas atsitiks su šiuo kodu, tai, kad spustelėjus mygtuką #mydisable, jis pridės klasę, kuri yra išjungta #myimage elementui. Dėl to selektorius nebeatitiks elemento, o įvykis neveiks tol, kol „išjungta“ klasė nebus ištrinta, todėl .live () selektorius dar kartą galioja.

Jis turi ir kitų privalumų, pridedant prie šios klasės paremtą stilių.

56
23 июля '09 в 20:57 2009-07-23 20:57 atsakymą pateikė „ MacAnthony “ liepos 23 d. , 09:57 , 2009-07-23 20:57

Tai galima atlikti naudojant atjungimo funkciją.

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

Jikeryje galite įtraukti kelis įvykių tvarkytojus į tą patį objektą ir įvykį. Tai reiškia, kad naujų įrašymas nepakeičia senųjų.

Yra keletas strategijų, kaip keisti įvykių tvarkytojus, pvz., Įvykių vardų vietas. Internetiniuose dokumentuose apie tai yra keletas puslapių.

Pažvelkite į šį klausimą (ką aš sužinojau apie atotrūkį). Atsakymuose yra keletas naudingų šių strategijų aprašymų.

Kaip perskaityti su atgaline grįžtamuoju ryšiu susijusias funkcijas

34
16 окт. atsakymas duotas Mnebuerquo spalio 16 d. 2008-10-16 18:35 '08, 18:35, 2008-10-16 18:35

Jei norite reaguoti į įvykį tik vieną kartą , ši sintaksė turėtų būti tikrai naudinga:

  $('.myLink').bind('click', function() { //do some things $(this).unbind('click', arguments.callee); //unbind *just this handler* }); 

Naudodami argument.callee , galime užtikrinti, kad būtų pašalintas vienas konkretus anoniminės funkcijos tvarkytojas ir todėl tam tikrą įvykį tvarko vieną kartą. Tikiuosi, kad tai padės kitiems.

33
05 авг. atsakymą pateikė ghayes 05 rug . 2011-08-05 10:29 '11, 10:29, 2011-08-05 10:29

galbūt atsipalaidavimo metodas tinka jums

 $("#myimage").unbind("click"); 
30
16 окт. Johno Bokerio atsakymas spalio 16 d 2008-10-16 18:31 '08, 18:31 pm 2008-10-16 18:31

Man reikėjo nustatyti nulinį įvykį, naudodamas prop ir attr. Aš negalėjau to padaryti su vienu ar kitu. Aš negalėjau dirbti. Dirbu su TD elementu.

 .prop("onclick", null).attr("onclick", null) 
28
28 марта '12 в 17:44 2012-03-28 17:44 atsakymas pateikiamas dwhittenburg kovo 28 d. 12 val. 17:44 2012-03-28 17:44

Galite pridėti „ onclick tvarkytoją kaip eilinį žymėjimą:

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

Jei taip, tuomet jquery .off() arba .unbind() neveiks. Jūs taip pat turėtumėte pridėti pradinį įvykių tvarkytoją, kad jis būtų ieškomas:

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

Tada jquery turi nuorodą į įvykių tvarkytoją ir gali jį ištrinti:

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

VoidKing tai šiek tiek labiau įstrižai nurodo pirmiau pateiktame komentare.

9
22 янв. atsakymas davaus 22 d 2014-01-22 01:25 '14 ne 1:25 2014-01-22 01:25

Jei įvykis yra susietas tokiu būdu , o tikslas neturi būti susietas:

 $('#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
26 июня '12 в 16:02 2012-06-26 16:02 atsakymą pateikė vartotojo669677 birželio 26 d. 12 d. 4:02 pm 2012-06-26 16:02

Atnaujinta 2014 m

Naudodami naujausią „jQuery“ versiją, dabar galite atšaukti visus vardų erdvės įvykius, tiesiog padarę $( "#foo" ).off( ".myNamespace" );

9
05 февр. atsakymas, kurį pateikė alexpls 05 Feb. 2014-02-05 14:39 '14 at 14:39 2014-02-05 14:39

Dėkojame už informaciją. labai naudinga, aš jį blokavau kito naudotojo redagavimo režimo puslapių sąveikai. Aš jį panaudojau kartu su ajaxComplete. Ne visada toks pat elgesys, bet šiek tiek panašus.

 function userPageLock(){ $("body").bind("ajaxComplete.lockpage", function(){ $("body").unbind("ajaxComplete.lockpage"); executePageLock(); }); }; function executePageLock(){ //do something } 
6
03 июля '10 в 0:54 2010-07-03 00:54 atsakymas pateikiamas jquery_user liepa 03 '10, 0:54 2010-07-03 00:54

Geriausias būdas pašalinti „onclick“ įvykį yra $(element).prop('onclick', null);

5
02 янв. Atsakymas duotas Shahrukh Azeem 02 Jan. 2015-01-02 17:43 '15, 17:43, 2015-01-02 17:43

Tai taip pat puikiai veikia. Paprasta ir patogi. http://jsfiddle.net/uZc8w/570/

 $('#myimage').removeAttr("click"); 
2
15 июня '13 в 15:31 2013-06-15 15:31 atsakymą pateikė Somnath Kharat birželio 15 d. 15:31 2013-06-15 15:31

Tuo atveju, kai .on() metodas anksčiau buvo naudojamas su konkrečiu selektoriumi, kaip ir sekančiame pavyzdyje:

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

Ne .off() unbind() ir .off() neveiks.

Tačiau metodas . undelegate () galima naudoti norint visiškai pašalinti tvarkyklę iš visų elementų, atitinkančių dabartinį selektorių:

 $("body").undelegate(".dynamicTarget", "click") 
2
27 июня '16 в 13:11 2016-06-27 13:11 atsakymą Ilia Rostovtsev pateikė 16 birželio 16 d. 13:11 2016-06-27 13:11

jei įdiegiate onclick per html , jums reikia pašalintiAttr removeAttr ($(this).removeAttr('onclick'))

jei ją įdiegiate per „jquery“ (kaip ir po pirmųjų paspaudimų aukščiau pateiktuose pavyzdžiuose), turite unbind($(this).unbind('click'))

2
02 сент. Atsakymas duotas Ishan Liyanage 02 rugsėjis. 2014-09-02 09:53 '14, 9:53 val. 2014-09-02 09:53

Tikiuosi, kad mano apatinis kodas paaiškina viską. HTML:

 <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
22 дек. Atsakymą mysticmo pateikė gruodžio 22 d. 2015-12-22 11:28 '15, 11:28 2015-12-22 11:28

Žinau, kad tai vyksta vėlai, bet kodėl gi ne naudoti paprastą JS, jei norite ištrinti įvykį?

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

arba, jei naudojate pavadintą funkciją kaip įvykių tvarkytojas:

 function eh(event){...} var myElement = document.getElementByID("your_ID"); myElement.addEventListener("click",eh); // add event handler myElement.removeEventListener("click",eh); //remove it 
1
05 сент. Atsakymą pateikė Misu Costel 05 Sep. 2016-09-05 17:24 '16 at 17:24 pm 2016-09-05 17:24

Visi aprašyti metodai man neveikė, nes pridėjau paspaudimo įvykį su on() dokumentu, kuriame elementas buvo sukurtas vykdymo metu:

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


Mano problema yra:

Kadangi aš negalėjau atsieti „.button“ klasės, paprasčiausiai priskyriau kitą klasę prie to paties CSS stiliaus. Šiuo būdu tiesioginis / tiesioginis rengėjas ignoravo paspaudimą pagaliau:

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

Tikiuosi, kad tai padės.

0
12 февр. Atsakymas pateikiamas Kai Noack 12 vasario mėn. 2014-02-12 11:00 '14 11:00 val. 2014-02-12 11:00

Peržiūrėkite kitus klausimus apie „ etiketes arba Užduokite klausimą