【问题标题】:How can event handlers be dynamically moved to a different element with jQuery?如何使用 jQuery 将事件处理程序动态移动到不同的元素?
【发布时间】:2010-11-12 20:40:55
【问题描述】:

jQuery 插件使代码更加可重用。

我之前制作了一个插件,可以打开一个动态创建的灯箱,该灯箱从 IMG 标记的属性中提取信息。该插件为图片注册了一个点击事件处理程序。

我最近制作了另一个插件,我想在这些图像上使用它来动态添加叠加层。我遇到的问题是覆盖完美地完成了它的工作,完全覆盖了图像(并覆盖了在图像上运行点击事件的能力)。

我一直在尝试找到一种将事件处理程序从 IMG 复制到新叠加层的方法。我发现以下信息让我了解http://ejohn.org/apps/workshop/adv-talk/#9

使用上面的代码,我能够检索分配给特定 IMG 元素的数据“事件”属性的事件,并将其分配给覆盖元素的数据“事件”属性。不幸的是,这似乎是重复的 - 单击覆盖元素时不会触发该事件。

示例代码(无覆盖,此代码仅用于示例目的):

HTML:

<div class="object1">This is the first object.</div>
<div class="object2">This is the 2nd object.</div>

JavaScript:

$(document).ready(function(){
    $('.object1').click(function(){
        alert('I was clicked.');
    });

    //using 2 params in data() uses a key/value pair
    $('.object2').data('events', $('.object1').data('events'));
    //still no "click" event handler on '.object2', ...
    // ... although the information is stored on the element's data store
});

我希望事件本身也会被注册,但情况似乎并非如此。有没有办法做到这一点?

【问题讨论】:

    标签: jquery events bind swap


    【解决方案1】:

    我刚想出了这个插件。似乎它做了你打算做的事情。 http://plugins.jquery.com/project/copyEvents

    【讨论】:

    • 虽然看起来这很可行,但我宁愿不向我的插件添加依赖项。但是,我可以查看插件的来源,并能够从中制定动态解决方案。由于您的链接使我找到了解决方案,因此我将为您提供答案。谢谢,code90!
    • 此链接已损坏。此外,该插件不适用于现代版本的 jQuery(1.8+),因为事件的存储方式不同,除非它已被更新。
    【解决方案2】:

    试试这个 (View demo)

    $(document).ready(function(){
        $('.object1').click(function(){
            alert('I was clicked.');
        });
    
        $('.object2').click($('.object1').data('events').click[0]);
    });
    

    【讨论】:

    • 问题是我想确保这个新插件可以使用所有功能,无论情况如何。如果有 mouseout 事件,这将不是一个动态的解决方案。我曾想过(应该在我的原始帖子中提到它,抱歉),但它只是没有涵盖足够的可能性。
    • 此代码不适用于新版本的 jQuery (1.8+),因为存储事件的方式已更改。这是一个适用于现代版本的 sn-p,它处理所有事件类型,而不仅仅是单击。 stackoverflow.com/a/29151280/2180479
    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多