JQuery හි සිදුවීම් හසුරුවන්නෙකු ඉවත් කිරීමට හොඳම ක්‍රමය?


1064

මට අ input type="image". මෙය මයික්‍රොසොෆ්ට් එක්සෙල් හි ඇති සෛල සටහන් මෙන් ක්‍රියා කරයි. input-imageමෙය යුගලනය කර ඇති පෙළ කොටුවට යමෙකු අංකයක් ඇතුළත් කළහොත් , මම ඒ සඳහා සිදුවීම් හසුරුවන්නෙකු සකසමි input-image. එවිට පරිශීලකයා ක්ලික් කළ විට image, දත්ත වලට සටහන් කිහිපයක් එකතු කිරීමට ඔවුන්ට කුඩා උත්පතන ලැබේ.

මගේ ගැටළුව වන්නේ පරිශීලකයෙකු පෙළ කොටුවට ශුන්‍යයක් ඇතුළු කළ විට, මට input-imageසිදුවීම් හසුරුව අක්‍රීය කිරීමට අවශ්‍ය වීමයි . මම පහත සඳහන් දෑ අත්හදා බැලුවද එයින් කිසිදු .ලක් නොවීය.

$('#myimage').click(function { return false; });

Answers:


1643

jQuery ≥ 1.7

JQuery 1.7 සිට සිදුවීම් API යාවත්කාලීන කර ඇත, .bind()/ .unbind()පසුගාමී අනුකූලතාව සඳහා තවමත් පවතී, නමුත් වඩාත් කැමති ක්‍රමය වන්නේ on () / off () ශ්‍රිත භාවිතා කිරීමයි. පහත දැක්වෙන්නේ,

$('#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

ඔබගේ උදාහරණ කේතයේ ඔබ හුදෙක් පින්තූරයට තවත් ක්ලික් කිරීමේ සිදුවීමක් එක් කරයි, පෙර එක ඉක්මවා නොයනු ඇත:

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

ක්ලික් කිරීමේ සිදුවීම් දෙකම පසුව ඉවත් කරනු ලැබේ.

මිනිසුන් පවසා ඇති පරිදි, සියලු ක්ලික් සිදුවීම් ඉවත් කිරීමට ඔබට බැඳීම භාවිතා කළ හැකිය:

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

ඔබට තනි සිදුවීමක් එකතු කර එය ඉවත් කිරීමට අවශ්‍ය නම් (එකතු කර ඇති වෙනත් ඒවා ඉවත් නොකර) ඔබට සිදුවීම් නාම අවකාශය භාවිතා කළ හැකිය:

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

සහ ඔබගේ සිදුවීම ඉවත් කිරීමට:

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

6
unbind()වැඩ කරන්නේ දැයි පරීක්ෂා කිරීමට ක්‍රමයක් තිබේද? මම එය එකතු කර ඇති අතර සිදුවීම් දෙකම තවමත් වෙඩි තබා ඇත.
ඩේවිඩ් යෙල්

19
සිදුවීම් දෙකම තවමත් වෙඩි තබන්නේ නම් පැහැදිලිවම එය ක්‍රියාත්මක නොවේ. නිසි පිළිතුරක් ලබා ගැනීම සඳහා ඔබට තවත් තොරතුරු ලබා දිය යුතුය. වෙනම ප්‍රශ්නයක් ඇසීමට උත්සාහ කරන්න.
samjudson

13
පැරණි පිළිතුර - ඇතුළත් කර ඇති නාම අවකාශ තොරතුරු මෙන් - නමුත් මට අමතක ය; jQ වස්තුව සක්‍රිය / අක්‍රිය කරයිද? එසේ නම්, සමහර විට වඩාත් සම්පූර්ණ පිළිතුර වනුයේ ඩේසි දාමයට ය:$('#myimage').off('click').on('click',function(){...})
vol7ron

3
ඔව් ඔවුන් එසේ කරයි, ඔව්, ඔබට අනෙක් සියලුම ක්ලික් සිදුවීම් ඉවත් කර ඔබේම දෑ එකතු කිරීමට අවශ්‍ය නම් ඔබට ඉහත දම්වැල් සහිත ඇමතුම කළ හැකිය.
samjudson

.unbind()මම පිරික්සුම් කොටු පොකුරක් ටොගල් කරන තත්වයකට භාවිතා කිරීම මට උදව් විය, නමුත් මම විශ්වාසයෙන් යුතුව නැවත වරක් .click()හසුරුවන්නා නැවත එකතු කරමින් යෙදුම එල්ලීමට හේතු විය.
TecBrat

63

මෙම ප්‍රශ්නයට පිළිතුරු සපයන විට මෙය ලබා ගත නොහැකි විය, නමුත් ඔබට සිදුවීම් සක්‍රිය / අක්‍රීය කිරීමට සජීවී () ක්‍රමය භාවිතා කළ හැකිය .

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

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

මෙම කේතය සමඟ කුමක් සිදුවේද යන්න නම්, ඔබ #mydisablebutton ක්ලික් කළ විට, එය අක්‍රීය කළ පන්තිය #myimage අංගයට එකතු කරනු ඇත. මෙමඟින් තේරීම් කාරකය තවදුරටත් මූලද්‍රව්‍යයට නොගැලපෙන අතර .Live () තේරීම නැවත වලංගු වන පරිදි 'ආබාධිත' පන්තිය ඉවත් කරන තෙක් සිද්ධිය ඉවත් නොකෙරේ.

එම පංතිය මත පදනම්ව මෝස්තර එකතු කිරීමෙන් මෙය වෙනත් වාසි ලබා ගනී.


3
භාවිතා කිරීම විදිහෙන් live(), පෙර මෙම මාර්ගය ... පසෙකට කේතනය පහසුව සිට එය භාවිතා කරන ආකාරය පිළිබඳව කවදාවත් හිතුවේ නෑ, වේගවත් එය හෝ එය බඳින්න / unbind භාවිතා කිරීමට වෙනත් කිසිදු වාසි කර දෙන්නේ කෙසේද?
චක්‍රිට්

2
ඔබ මූලද්‍රව්‍ය එකතු කිරීම / ඉවත් කිරීම කරන්නේ නම්, සජීවීව බැඳීම එක් වරක් පමණක් සිදු කරන බැවින් බන්ධනයට වඩා නිශ්චිත කාර්ය සාධන වාසි ඇත. jQuery නිශ්චිත අංග සමඟ බැඳීමට වඩා සජීවී හා පැවරෙන සිදුවීම් වෙත ගමන් කරන බව පෙනේ.
මැක් ඇන්තනි

3
සජීවීව අක්‍රිය කිරීමට ඔබට
ඩයි

9
"JQuery 1.7 වන විට .live () ක්‍රමය අවලංගු කර ඇත. සිදුවීම් හසුරුවන්නන් ඇමිණීම සඳහා .on () භාවිතා කරන්න. api.jquery.com/live
ලූකස් පොටර්ස්කි

12
අහ්, චංචල jQuery, එක් දිනක් ඔබ පිරිමි ළමයෙකු වෙත නියෝජිතයින් 300 ක් ගෙන එයි, ඊළඟ දවසේ එය යල්පැන ඇත.
MrBoJangles

37

ඔබට සිදුවීමකට එක් වරක් පමණක් ප්‍රතිචාර දැක්වීමට අවශ්‍ය නම් , පහත දැක්වෙන වාක්‍ය ඛණ්ඩය සැබවින්ම ප්‍රයෝජනවත් විය යුතුය:

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

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

භාවිතා arguments.callee , අපි එක් විශේෂිත නිර්නාමික-උත්සවය හසුරුවන්නා ඉවත් කර ඇති බව සහතික කළ හැකි අතර, ඒ අනුව, දී ඇති අවස්ථාවට සඳහා තනි කාලය හසුරුවන්නා ඇත. මෙය අන් අයට උපකාරී වේ යැයි සිතමි.


2
නියත වශයෙන්ම, සමහර විට ඔබ හසුරුවන්නා අසීමිත විය යුත්තේ කවදාද යන්න පිළිබඳව යම් තර්කනයක් කිරීමට ඔබ කැමති විය හැකිය (උදා: ඔවුන් පළමුව පෙළ කොටුවක් ගොනු නොකරන්නේ නම් බැඳ තබන්න එපා).
ගයිස්

6
argments.callee දැඩි ප්‍රකාරයෙන් අවලංගු කර ඇත!
zloctb

37

බන්ධන ශ්‍රිතය භාවිතා කිරීමෙන් මෙය කළ හැකිය.

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

ඔබට jquery හි එකම වස්තුවට සහ සිදුවීමට සිදුවීම් හසුරුවන්නන් කිහිප දෙනෙකු එකතු කළ හැකිය. මෙයින් අදහස් කරන්නේ නව එකක් එකතු කිරීම පැරණි ඒවා වෙනුවට ආදේශ නොකරන බවයි.

සිදුවීම් නාම අවකාශයන් වැනි සිදුවීම් හසුරුවන්නන් වෙනස් කිරීම සඳහා උපාය මාර්ග කිහිපයක් තිබේ. සබැඳි ලියකියවිලි වල මේ ගැන පිටු කිහිපයක් තිබේ.

මෙම ප්‍රශ්නය දෙස බලන්න (මා බැඳීම ගැන ඉගෙන ගත්තේ එලෙසයි). පිළිතුරු වල මෙම උපාය මාර්ග පිළිබඳ ප්‍රයෝජනවත් විස්තරයක් ඇත.

Jquery හි බැඳී ඇති හෝවර් කෝල්බැක් කාර්යයන් කියවන්නේ කෙසේද


32

සමහර විට නොබැඳීමේ ක්‍රමය ඔබ වෙනුවෙන් ක්‍රියා කරනු ඇත

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

30

මුක්කු සහ අට්ටාල භාවිතා කරමින් මට සිදුවීම අහෝසි කිරීමට සිදු විය. මට එක හෝ වෙනත් ආකාරයකින් එය කළ නොහැකි විය. මටත් වැඩ කරන්න බැරි වුණා. මම TD මූලද්‍රව්‍යයක් මත වැඩ කරමින් සිටිමි.

.prop("onclick", null).attr("onclick", null)

1
මම මෙය ඡන්දය දුන්නේ මින්ට් 30 ක් පමණ ඔන්බ්ලර් බැඳ තැබීමට උත්සාහ කර ඇති බැවිනි. . අමුතුයි. මම ක්‍රෝම් භාවිතා කරන්නේ jquery 1.7.2
ජෙරමි

මෙහෙත් එහෙමයි! මම සරල <a> ටැගයෙන් ක්ලික් කිරීමේ සිදුවීම ඉවත් කිරීමට උත්සාහ කළෙමි! මේ සඳහා ස්තූතියි. මගේ නඩුවේ .prop ("onclick", null) ප්රමාණවත් විය.
ජෑන් ලොබා

මෙහෙත් එහෙමයි. jq 1.7.2 සහ .prop ("onclick", null) සමඟ එෆ්එෆ් හි බැඳීම සහ අක්‍රිය කිරීම මට ප්‍රමාණවත් නොවීය
බ්‍රයනල්ලොට්

4
මම හිතන්නේ ඉහත ක්‍රම ඔබ වෙනුවෙන් ක්‍රියාත්මක නොවීමට හේතුව ඔබ එය සකස් කළ ආකාරයයි. ඔබ සිදුවීම් හසුරුවන්නා DOM වෙත ලියා ඇත්නම්, ඔව්, මෙම ගුණාංගය ඉවත් කිරීම සිදුවීම් හසුරුවන්නා ඉවත් කිරීමට අවශ්‍ය වේ, කෙසේ වෙතත්, මම සිතන්නේ බොහෝ දෙනෙක් (මා ද ඇතුළුව) එවැනි දේ (ජාවාස්ක්‍රිප්ට්, සිදුවීම් හසුරුවන්නන් යනාදිය) වලින් keep ත් කර තැබීමට කැමැත්තෙමි. DOM, එබැවින් අපට සිදුවීම් හසුරුවන්නෙකු සැකසීමට අවශ්‍ය වූ විට $("#elementId").click(function(){//Event execution code goes here});එය HTML පිටුවේ කිසිසේත් නොපවතින ලෙස අපි යමක් භාවිතා කරමු . අප සැබවින්ම භාවිතා කළ යුතු බව පැහැදිලි කිරීමට .unbind()හෝ වඩාත් කැමති.off()
VoidKing

JQuery හරහා එකතු කරන ලද ගුණාංග ක්‍රෝම් හි මූලද්‍රව්‍ය පුවරුවේ නොපෙන්වන බව සොයා ගැනීමට පැයක් පමණ ගත කළ අයෙකුගේ මෙන්න මෙන්න. උත්සාහ unbindකර ඇති offඅතර එය ගැටළුව විසඳන්නේ නැත. බොහොම ස්තූතියි!
රෙනන්

13

සිදුවීම මේ ආකාරයෙන් අමුණා ඇත්නම් සහ ඉලක්කය සම්බන්ධ නොවිය යුතුය:

$('#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.

});​

11

ඔබ onclickහසුරුවන්නා පේළිගත සලකුණු ලෙස එකතු කරමින් සිටිය හැක :

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

එසේ නම්, jquery .off()හෝ ක්‍රියා .unbind()නොකරනු ඇත. මුල් සිදුවීම් හසුරුවන්නා jquery තුළද එකතු කළ යුතුය:

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

එවිට jquery හි සිදුවීම් හසුරුවන්නා පිළිබඳ සඳහනක් ඇති අතර එය ඉවත් කළ හැකිය:

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

VoidKing ඉහත අදහස් දැක්වීමේදී මෙය තව ටිකක් පැහැදිලිව සඳහන් කරයි.


9

2014 සඳහා යාවත්කාලීන කරන ලදි

JQuery හි නවතම අනුවාදය භාවිතා කරමින්, සරලවම කිරීමෙන් ඔබට සියලු සිදුවීම් නාම අවකාශයක බැඳ තැබිය හැකිය $( "#foo" ).off( ".myNamespace" );


8

පේළිගත ඔන්ක්ලික් සිදුවීම ඉවත් කිරීමට හොඳම ක්‍රමය නම් $(element).prop('onclick', null);


8

කිරීමට remove සියලූම event-handlers , මේ මට වැඩ දේ:

සියලුම සිදුවීම් හසුරුවන්නන් ඉවත් කිරීම යන්නෙන් අදහස් කරන්නේ තැනිතලාව සහ එහි HTML structureසියල්ල event handlersඅමුණා නොගෙනය . මෙය කිරීමට, උදව්.elementchild nodesjQuery's clone()

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

මේ සමඟ, අපට අංක නොමැතිව cloneස්ථානය ලැබෙනු ඇතoriginalevent-handlers එය මත.

වාසනාව...


7

තොරතුරු වලට ස්තූතියි. වෙනත් පරිශීලකයෙකු සංස්කරණ ප්‍රකාරයේදී පිටු අන්තර්ක්‍රියා අගුළු දැමීම සඳහා මම එය භාවිතා කළෙමි. මම එය ajaxComplete සමඟ භාවිතා කළෙමි. අවශ්‍යයෙන්ම එකම හැසිරීම නොව තරමක් සමාන ය.

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

function executePageLock(){
    //do something
}

5

නඩුවේ .on()ක්රමය මීට පෙර පහත සඳහන් උදාහරණය මෙන්, විශේෂයෙන්ම තේරීම් සමඟ භාවිතා කරන ලදී:

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

ක්‍රම unbind()සහ .off()ක්‍රම දෙකම ක්‍රියාත්මක නොවේ .

කෙසේ වෙතත්, වත්මන් තේරීම් කාරකයට ගැලපෙන සියලුම අංග සඳහා හෑන්ඩ්ලර් සම්පූර්ණයෙන්ම ඉවත් කිරීමට .undelegate () ක්‍රමය භාවිතා කළ හැකිය:

$("body").undelegate(".dynamicTarget", "click")

1
මෙම විසඳුම සෙවීම සඳහා මම මුළු පිටුවම අනුචලනය කළෙමි.
අභිෂේක් පාණ්ඩේ

5

$(document).on()ගතිකව සාදන ලද මූලද්‍රව්‍යයකට සවන්දෙන්නෙකු එක් කිරීමට ඔබ භාවිතා කරන්නේ නම් එය ඉවත් කිරීමට ඔබට පහත සඳහන් දෑ භාවිතා කිරීමට සිදුවනු ඇත:

// add the listener
$(document).on('click','.element',function(){
    // stuff
});

// remove the listener
$(document).off("click", ".element");


2

ඔබ නියම නම් onclickහරහා htmlඔබට අවශ්යremoveAttr ($(this).removeAttr('onclick'))

ඔබ එය jquery හරහා සකසන්නේ නම් (ඉහත උදාහරණවල පළමු ක්ලික් කිරීමෙන් පසුව) ඔබට අවශ්‍ය වේ unbind($(this).unbind('click'))


2

මෙය ප්‍රමාද වී පැමිණෙන බව මම දනිමි, නමුත් සිදුවීම ඉවත් කිරීමට සරල JS භාවිතා නොකරන්නේ මන්ද?

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

හෝ, ඔබ සිදුවීම් හසුරුවන්නෙකු ලෙස නම් කරන ලද ශ්‍රිතයක් භාවිතා කරන්නේ නම්:

function eh(event){...}
var myElement = document.getElementById("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it

හොඳ යෝජනාවක්, ලබා ගත හැකි විට ස්වදේශීය ජාවාස්ක්‍රිප්ට් භාවිතා කිරීමට මම කැමැත්තෙමි
මිචියෙල්

1

විස්තර කරන ලද සියලුම ප්‍රවේශයන් මට වැඩ කළේ නැත, මන්දයත් මම ක්ලික් කිරීමේ සිද්ධිය on()ධාවන වේලාවේදී මූලද්‍රව්‍යය නිර්මාණය කළ ලේඛනයට එකතු කරන බැවිනි :

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


මගේ ක්‍රියාකාරිත්වය:

මට ".බටන්" පන්තිය බැඳ තැබීමට නොහැකි වූ නිසා මම වෙනත් පංතියක් එකම CSS මෝස්තර සහිත බොත්තමට පවරා ඇත්තෙමි. එසේ කිරීමෙන් සජීවී / සිදුවීම් හසුරුවන්නා අවසානයේ ක්ලික් කිරීම නොසලකා හැරියේය:

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

උපකාරවත් වන බලාපොරොත්තුව.


1

මගේ පහත කේතය සියල්ල පැහැදිලි කරයි යැයි සිතමි. 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
ඇයි ඔබ පසුකර })(jQuery);එය දැනටමත් ගෝලීය ප්රවේශ විය හැකි විට IIFE බවට?
බ්‍රයන් පී

2
හොඳ ප්‍රශ්නයක් බ්‍රයන්. පුහුණුවීම නිසා මෙම ක්‍රමය මගේ ජානයට ඇතුළත් කර ඇත. - jquery නොවන ප්ලගිනයට විචල්‍යය have ඇති වීමට යම් හැකියාවක් තිබිය හැකිය, එබැවින් මට $ කෙලින්ම භාවිතා කළ නොහැක. - js ස්ක්‍රිප්ට් ගොනුවක "jQuery" යන වචනය නිතර භාවිතා කිරීමෙන් ගොනුවේ බයිට් ප්‍රමාණය වැඩි කළ හැකිය, එහිදී jQuery යනු බයිට් 6 ක නූලකි. එබැවින් මම "$" හෝ තනි බයිට් වල ඕනෑම විචල්‍යයක් භාවිතා කිරීමට කැමැත්තෙමි.
මිස්ටික්මෝ

0

බොත්තමෙන් එය ඉවත් කරන්න:

$('.classname').click(function(){
$( ".classname" ).remove();
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.