Best way to remove an event handler in jQuery?

前端 未结 20 2319
庸人自扰
庸人自扰 2020-11-21 11:38

I have an input type=\"image\". This acts like the cell notes in Microsoft Excel. If someone enters a number into the text box that this input-image

相关标签:
20条回答
  • 2020-11-21 11:56

    If you want to respond to an event just one time, the following syntax should be really helpful:

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

    Using arguments.callee, we can ensure that the one specific anonymous-function handler is removed, and thus, have a single time handler for a given event. Hope this helps others.

    0 讨论(0)
  • 2020-11-21 11:56

    To remove ALL event-handlers, this is what worked for me:

    To remove all event handlers mean to have the plain HTML structure without all the event handlers attached to the element and its child nodes. To do this, jQuery's clone() helped.

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

    With this, we'll have the clone in place of the original with no event-handlers on it.

    Good Luck...

    0 讨论(0)
  • 2020-11-21 11:57

    Thanks for the information. very helpful i used it for locking page interaction while in edit mode by another user. I used it in conjunction with ajaxComplete. Not necesarily the same behavior but somewhat similar.

    function userPageLock(){
        $("body").bind("ajaxComplete.lockpage", function(){
            $("body").unbind("ajaxComplete.lockpage");
            executePageLock();      
        });
    };  
    
    function executePageLock(){
        //do something
    }
    
    0 讨论(0)
  • 2020-11-21 11:58

    If event is attached this way, and the target is to be unattached:

    $('#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.
    
    });​
    
    0 讨论(0)
  • 2020-11-21 11:59

    jQuery ≥ 1.7

    With jQuery 1.7 onward the event API has been updated, .bind()/.unbind() are still available for backwards compatibility, but the preferred method is using the on()/off() functions. The below would now be,

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

    In your example code you are simply adding another click event to the image, not overriding the previous one:

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

    Both click events will then get fired.

    As people have said you can use unbind to remove all click events:

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

    If you want to add a single event and then remove it (without removing any others that might have been added) then you can use event namespacing:

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

    and to remove just your event:

    $('#myimage').unbind('click.mynamespace');
    
    0 讨论(0)
  • 2020-11-21 12:03

    Hope my below code explains all. 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>

    0 讨论(0)
提交回复
热议问题