【问题标题】:Copy events from one element to other using jquery使用 jquery 将事件从一个元素复制到另一个元素
【发布时间】:2011-01-21 04:56:05
【问题描述】:

我的 DOM 是这样的:

<a href='javascript:void(0)' id='link1'>Element with  events bound initially</a>
<a href='javascript:void(0)' id='link2'>Element to which events are bound in future</a>

还有这个javascript:

$(function(){
    $('#link1').bind('click',function(){alert('do something to make me happy');})
});

现在我想在将来的某个时间将绑定在链接 1 上的所有事件复制到链接 2。我正在按照下面的说明进行操作,如果可能或可用,请提出一些更好的方法。

var _elmEvents = $(#link1).data('events');

if (_elmEvents) {
    $.each(_elmEvents, function (event, handlers) {
        $.each(handlers, function (j, handler) {
            $('#link2').bind(event, handler);
        });
    });
}

【问题讨论】:

  • 对于下面询问的任何 cmets,请务必注意 jQuery 现在已更改,并且为了获取元素上的事件,您必须使用 $._data( $("#foo")[ 0],“事件”)。 (从 jQuery v2.1.4 开始工作)否则,您将从以下任何方法收到 undefined。供参考请参阅:stackoverflow.com/questions/2008592/…

标签: jquery


【解决方案1】:
$.fn.copyEvents = function( to, filter )
{
    var to = to.jquery ? to : jQuery(to);
    var filter = filter ? filter.split(" ") : null;
    var events = this[0].events || jQuery.data(this[0], "events") || jQuery._data(this[0], "events");

    return this.each(function()
    {
        if (!to.length || !events) {
            return;
        }

        $.each(events, function(eventType, eventArray) {
            $.each(eventArray, function(index, event) {
                var eventToBind = event.namespace.length > 0
                    ? (event.type + '.' + event.namespace)
                    : (event.type);
                if (filter && $.inArray(eventToBind, filter) == -1) {
                    return true;
                }
                to.bind(eventToBind, event.data, event.handler);
            });
        });
    });
}

// Add some events to a element
$('#element').click(function() { });
$('#element').dblclick(function() { });
$('#element').change(function() { });

// Default usage, copy *all* events from one element to another
$('#element').copyEvents('#another-element');

// ... or you can copy only specific event types
$('#element').copyEvents('#another-element', 'change click');

原文在这里https://blog.armin-pfaeffle.de/2014/08/jquery-copy-events-from-one-element-to-another

【讨论】:

    【解决方案2】:

    如果您想将所有事件从一个对象复制到另一个对象而不进行克隆,您可以通过直接访问事件数据来实现。

    例如,如果你这样做了:

    $("#the_link").click(function(e){
        // do some stuff
        return false;
    }).mouseover(function(e){
        // do some other stuff
    });
    

    您可以在元素的“事件”数据中访问这些事件关联

    var events = $("#the_link").data('events');
    

    它将是一个对象,其键代表事件类型,每个都包含一个事件关联数组。无论如何,这是一个简单的示例,不考虑命名空间。

    var events = $("#the_link").data('events');
    var $other_link = $("#other_link");
    if ( events ) {
        for ( var eventType in events ) {
            for ( var idx in events[eventType] ) {
                // this will essentially do $other_link.click( fn ) for each bound event
                $other_link[ eventType ]( events[eventType][idx].handler );
            }
        }
    }
    

    【讨论】:

    • 这个解决方案对我不起作用,并且不考虑事件命名空间。我添加了一个处理它们的新答案(并且在我的情况下有效)。
    • 为什么这会为我返回“未定义”:alert($("#a").data('events'));?!见:jsfiddle.net/NabiKAZ/mbkL6gp3/1
    【解决方案3】:

    根据较新的 jquery 编辑 @Rikco 答案。

    function assingEvents() {
         //if you have multiple just use jQuery._data(jQuery('.copy-from-single-item')[0]
         jQuery.each(jQuery._data(jQuery('.copy-from-single-item'), 'events'), function()  {
           // iterate registered handler of original
           jQuery.each(this, function() {
            var parentEvent = this;
            jQuery.each(jQuery('.copy-to-multiple-item'),
                function() {
                    jQuery(this).bind(parentEvent.type, parentEvent.handler);
                });
           });
        });
    }
    

    【讨论】:

      【解决方案4】:

      这个在我的脚本中效果很好。

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

      我在这里找到它(来源):http://snipplr.com/view/64750/

      【讨论】:

      • 它工作正常,但可能需要替换第一个参数:请参阅问题下方 Zanderi 的评论。 (感谢两者。)
      • 为什么这会为我返回“未定义”:alert($("#a").data('events'));?!见:jsfiddle.net/NabiKAZ/mbkL6gp3/1
      【解决方案5】:

      接受的答案对我不起作用,因为我使用了 命名空间 和 其他事件(例如“粘贴”),它们不是 jQuery 中的方法。

      这对我有用:

      function copyEvents(source, destination) {
          // Get source events
          var events = source.data('events');
      
          // Iterate through all event types
          $.each(events, function(eventType, eventArray) {
              // Iterate through every bound handler
              $.each(eventArray, function(index, event) {
                  // Take event namespaces into account
                  var eventToBind = event.namespace.length > 0
                      ? (event.type + '.' + event.namespace)
                      : (event.type);
      
                  // Bind event
                  destination.bind(eventToBind, event.data, event.handler);
              });
          });
      }
      

      【讨论】:

        【解决方案6】:

        这是基于Brandons 的工作,但已更新为适用于所有 jQuery 版本。在1.6.4 到2.0.x 上测试。

        /**
         * Logic for copying events from one jQuery object to another.
         *
         * @private 
         * @name jQuery.event.copy
         * @param jQuery|String|DOM Element jQuery object to copy events from. Only uses the first matched element.
         * @param jQuery|String|DOM Element jQuery object to copy events to. Copies to all matched elements.
         * @type undefined
         * @cat Plugins/copyEvents
         * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
         * @author Yannick Albert (mail@yckart.com || http://yckart.com)
         */
        jQuery.event.copy = function (from, to) {
            from = from.jquery ? from : jQuery(from);
            to = to.jquery ? to : jQuery(to);
        
            var events = from[0].events || jQuery.data(from[0], "events") || jQuery._data(from[0], "events");
            if (!from.length || !to.length || !events) return;
        
            return to.each(function () {
                for (var type in events)
                for (var handler in events[type])
                jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
            });
        };
        

        【讨论】:

          【解决方案7】:

          您可以clone 一个元素并随心所欲地操作新元素,但是 jQuery 没有提供将事件处理程序从一个元素复制到另一个元素的简单方法。但是,执行此操作的代码是:

          var events = jQuery.data( originalElement, "events" );
          
          for ( var type in events ) {
              for ( var handler in events[ type ] ) {
                  jQuery.event.add( targetElement, type, events[ type ][ handler ], events[ type ][ handler ].data );
              }
          }
          

          但由于它在某种程度上依赖于 jQuery 内部,我会尝试使用克隆来解决。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-01
            • 2010-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-28
            • 2012-09-27
            相关资源
            最近更新 更多