【问题标题】:How to transfer data from element to a delegate event?如何将数据从元素传输到委托事件?
【发布时间】:2014-01-13 12:07:47
【问题描述】:

我想从委托 onclick 事件处理程序中检索元素数据,并让它工作,但突然我遇到了一些问题。

最后我隔离了这个问题:似乎附加到元素的数据 当元素从 DOM 中移除时被删除。这可能会发生 在调用委托 onclick 事件处理程序之前。

因为有时我会有一个 click 事件处理程序,它会在委托处理程序运行之前删除元素。

考虑这个文件:

<div id='content'>
    <a href="#pp" class='remove'>Will be removed ( data is lost )</a>
    <a href="#pp">Will stay ( works )</a>
</div>

还有这个 javascript:

$(document).ready(function () {
    $('a').data("keep", {
        content: 'want to see at delegate click envent'
    });
    $('a').click(function () {
        var data = $(this).data("keep"),
            data_to_show = data ? JSON.stringify(data) : 'Real Gone!!';
        alert("click: " + data_to_show);
        if ($(this).hasClass('remove')) {
            $(this).remove();
        }
    });
    $('#content').delegate('a', 'click', function (event) {
        var data = $(this).data("keep"),
            data_to_show = data ? JSON.stringify(data) : 'Real Gone!!';
        alert("delegate: " + data_to_show);
    });
});

您可以在以下位置玩它:http://jsfiddle.net/s47c5/4/

我可以推迟删除元素,将其包装成超时...

    if ($(this).hasClass('remove')) {
        setTimeout ( function () { 
            $(this).remove()
        }, 10 );
    }

它有效,但不知何故这让我毛骨悚然!

所以问题是:

我怎样才能正确地从要删除的项目中传输数据,以便它到达委托的事件处理程序?

【问题讨论】:

    标签: javascript jquery html onclick delegates


    【解决方案1】:

    你应该试试这个代码:

    $(document).ready(function () {
        $('a').data("keep", {
            content: 'want to see at delegate click envent'
        });
        $('a').click(function () {
            var data = $(this).data("keep"),
                data_to_show = data ? JSON.stringify(data) : 'Real Gone!!';
            alert("click: " + data_to_show);
    
        });
        $('#content').delegate('a', 'click', function (event) {
            var data = $(this).data("keep"),
            data_to_show = data ? JSON.stringify(data) : 'Real Gone!!';
            alert("delegate: Before removing >" + data_to_show);
            if ($(this).hasClass('remove')) {
                $(this).remove();            
            }
            //After removing 
            data = $(this).data("keep");
            data_to_show = data ? JSON.stringify(data) : 'Real Gone!!';
            alert("delegate: After removing >" + data_to_show);
        });
    });
    

    看到我在 JS fiddle 中做了一些改动:

    JSFiddle

    【讨论】:

    • @user2043273 看到我已经添加了答案,它正在使用 givem JSfiddle。
    • 是的,您的解决方案基本上是延迟删除项目,就像使用 setTimeout() ' 不再是,而是通过其他方式传输数据。也许将数据附加到事件中? )。事实上,我并没有受到这样的控制,因为 $(this).remove() 实际上嵌套在一些复杂的代码层下;它甚至可能删除 $('#content'),而不仅仅是元素。
    猜你喜欢
    • 2018-12-27
    • 2013-03-08
    • 2015-11-02
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多