代码之家  ›  专栏  ›  技术社区  ›  nickf

将一个元素的事件处理程序复制到另一个元素上?

  •  9
  • nickf  · 技术社区  · 16 年前

    如何将事件处理程序从一个元素复制到另一个元素? 例如:

    $('#firstEl')
        .click(function() {
            alert("Handled!");
        })
    ;
    
    // here's where the magic happens 
    $('#secondEl').click = $('#firstEl').click; // ????
    

    请注意,第二个元素的处理时间与第一个元素获取其处理程序的时间不同,这意味着:

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

    ...不行。

    6 回复  |  直到 8 年前
        1
  •  24
  •   Christof    11 年前

    这个问题已经得到了回答,但供将来参考:可以通过迭代原始元素的事件并将其处理程序绑定到目标来复制它们。

    >请参见下面的编辑!

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

    当您无法控制原始元素(例如,当使用插件时)并且只想克隆某个元素的行为时,这非常方便。

    编辑: 在以后的jQuery版本中,对elements事件处理程序的访问已被更改。这适用于较新版本:

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

    干杯

        2
  •  4
  •   Prestaul    16 年前

    你不能轻易(或许也不应该)“复制”这个事件。您可以使用相同的函数来处理以下各项:

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

    或者,您可以为第二个处理程序中的第一个元素实际触发事件:

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

    编辑:@nickf担心会污染全局命名空间,但这几乎总是可以通过在对象中包装代码来避免的:

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

    或者将代码包装在匿名函数中并立即调用:

    (function() {
        var clickHandler = function() { alert('click'); };
        $('#firstEl').click(clickHandler);
        $('#secondEl').click(clickHandler);
    })();
    
        3
  •  2
  •   Ken Browning    16 年前

    你可能会对 triggerHandler method

    // here's where the magic happens 
    //$('#secondEl').click = $('#firstEl').click; // ????
    $('#secondEl').click(function() {
        $('#firstEl').triggerHandler('click');
    });
    
        4
  •  0
  •   Beau Simensen    16 年前

    这就是你要找的吗?

    var clickHandler = function() { alert("Handled!"); }
    $('#firstEl').click(clickHandler);
    $('#secondEl').click(clickHandler);
    
        6
  •  -3
  •   TRF    16 年前

    $(#secondEl')。点击=$(“#firstEl”)。点击绑定($(“#secondEl”);

    假设您使用的是Prototype JS( http://www.prototypejs.org/api/function/bind )