Duplicate one element's event handlers onto another?

前端 未结 6 1532
半阙折子戏
半阙折子戏 2021-02-14 01:51

How do you copy an event handler from one element to another? For example:

$(\'#firstEl\')
    .click(function() {
        alert(\"Handled!\");
         


        
相关标签:
6条回答
  • 2021-02-14 02:06

    http://www.learningjquery.com/2007/01/copy-events-from-one-element-to-another

    0 讨论(0)
  • 2021-02-14 02:19

    This question was already answered but for future reference: you could copy them by iterating the events of the original element and binding their handlers to the target.

    > see edit below!

    // iterate event types of original
    $.each($('#original').data('events'), function() {
      // iterate registered handler of original
      $.each(this, function() {
        $('#target').bind(this.type, this.handler);
      });
    });
    

    This is handy when you have no control of the original element (e.g. when using a plugin) and just want to clone the behavior of a certain element.

    Edit: Access to an elements event handlers has been changed in later jQuery versions. This should work for newer versions:

    $.each($._data($('#original').get(0), 'events'), function() {
      // iterate registered handler of original
      $.each(this, function() {
        $('#target').bind(this.type, this.handler);
      });
    });
    

    Cheers

    0 讨论(0)
  • 2021-02-14 02:23

    You might be interested in the triggerHandler method

    // here's where the magic happens 
    //$('#secondEl').click = $('#firstEl').click; // ????
    $('#secondEl').click(function() {
        $('#firstEl').triggerHandler('click');
    });
    
    0 讨论(0)
  • 2021-02-14 02:23

    $('#secondEl').click = $('#firstEl').click.bind($('#secondEl'));

    Assuming you are using Prototype JS (http://www.prototypejs.org/api/function/bind)

    0 讨论(0)
  • 2021-02-14 02:28

    Is this what you are looking for?

    var clickHandler = function() { alert("Handled!"); }
    $('#firstEl').click(clickHandler);
    $('#secondEl').click(clickHandler);
    
    0 讨论(0)
  • 2021-02-14 02:31

    You can't easily (and probably shouldn't) "copy" the event. What you can do is use the same function to handle each:

    var clickHandler = function() { alert('click'); };
    // or just function clickHandler() { alert('click'); };
    
    $('#firstEl').click(clickHandler);
    
    // and later
    $('#secondEl').click(clickHandler);
    

    Alternatively you could actually fire the event for the first element in the second handler:

    $('#firstEl').click(function() {
        alert('click');
    });
    
    $('secondEl').click(function() {
        $('#firstEl').click();
    });
    

    Edit: @nickf is worried about polluting the global namespace, but this can almost always be avoided by wrapping code in an object:

    function SomeObject() {
        this.clickHandler = function() { alert('click'); };
    }
    SomeObject.prototype.initFirstEvent = function() {
        $('#firstEl').click(this.clickHandler);
    };
    SomeObject.prototype.initSecondEvent = function() {
        $('#secondEl').click(this.clickHandler);
    };
    

    or wrapping your code in an anonymous function and calling it immediately:

    (function() {
        var clickHandler = function() { alert('click'); };
        $('#firstEl').click(clickHandler);
        $('#secondEl').click(clickHandler);
    })();
    
    0 讨论(0)
提交回复
热议问题