【问题标题】:jQuery: How to call a jQuery plugin function on an element that hasn't yet been added to the DOM?jQuery:如何在尚未添加到 DOM 的元素上调用 jQuery 插件函数?
【发布时间】:2011-10-10 12:47:59
【问题描述】:

我有一个我正在使用的 jQuery 插件:

$(document).ready(function(){
    $('.elements').fancyPlugin();
});

在我开始添加新元素之前效果很好:

$.get('ajax.html', function(data){
    $('#container').html(data);
});

我可以像这样再次调用插件函数:

$.get('ajax.html', function(data){
    $('#container').html(data).find('.elements').fancyPlugin();
});

...除了 AJAX 发生在另一个不需要知道 fancyPlugin() 的 jQuery 插件中。

如何将此插件应用于所有当前和未来的元素?

【问题讨论】:

  • 好吧好吧好吧我知道这个...... hrmmmm......好吧也许不完全,但你应该使用事件监听器。我会在文档上绑定 DOMNodeInserted 然后调用你的函数。

标签: javascript jquery jquery-plugins


【解决方案1】:

我认为这将适用于除 IE 之外的所有浏览器:

document.body.addEventListener("DOMNodeInserted", function(event){
    var $elementJustAdded = $(event.target);
    if ($elementJustAdded.hasClass('elements')) {
        $elementJustAdded.fancyPlugin();
    }
}, false);

【讨论】:

【解决方案2】:

另一种方法是创建自己的事件:

var container=$('#container');
$.get('ajax.html', function(data){   
   container.html(data);
   $('.elements',container).trigger('added.yourns');    
});

container.on('added.yourns','.elements',function(){
  $(this).fancyPlugin();
});

然后,添加元素时,只需使用trigger方法触发事件!

var aDiv=$('div');
aDiv.appendTo(someNode);
aDiv.trigger('added.yourns');

这样做将使您能够在任何 javascript 文件中附加任何行为!

【讨论】:

  • 您回答了一个困扰我数月的问题……而今天我只需要这个。你让某人开心,欢呼:))))))))))))))))
  • 这很棒,帮助解决了我正在构建的问题。谢谢!
  • 这解决了什么问题?如果我最终必须调用aDiv.trigger('added.yourns');,为什么我不能在新加载的节点上调用.fancyPlugin()?每次添加新节点时,我们都不必调用任何东西;这就是这个问题的全部意义,还是我遗漏了什么?
  • 如果你在很多地方修改同一个DOM元素,你就是在找问题!它所解决的是你可以监听事件来调用你需要的任何插件,而不仅仅是一个!您可能有其他处理程序来读取新值或做其他花哨的事情。如您所见,它有其用例,否则其他人不会感谢我 ;-)
【解决方案3】:

如果这些元素是通过 AJAX 添加的,您可以使用 .ajaxSuccess() 方法:

$('#container').ajaxSuccess(function(result) {
    $('.elements').fancyPlugin();
});

这是live demo

【讨论】:

【解决方案4】:

让您的 AJAX 处理程序触发一些自定义事件,例如 contentAdded,并将 fancyPlugin 绑定到该事件。

或者,您可以使用DOM mutation events 调用fancyPlugin 以对容器进行任何更改。本地浏览器支持还没有完全到位,但有 plugins 应该会处理好这个问题。

【讨论】:

【解决方案5】:

有趣。本质上,您会喜欢这样的东西:

$('selector').ready( ... do something ... );

问题是这种逻辑不可用。页面上加载的元素不会触发我知道的任何特定事件,它们只是从它们上方的 DOM 节点继承 CSS。我要做的只是从$.get 成功函数中触发一个自定义事件。您的其余代码可以挂钩到该事件以执行任何可能需要的插件重新加载工作。您可以将相关选择器列表与事件一起传递,并使用它来调用适当的插件(您可以在哈希表中保留一组 selector -> plugin refresh function 关系)

【讨论】:

    【解决方案6】:

    您看过 jQuery .live 事件处理程序吗?如果满足指定要求,则在将新项目添加到 dom 时自动绑定。

    http://api.jquery.com/live/

    【讨论】:

    【解决方案7】:

    如果你做了这样的事情呢?

    $(document).ready(function(){
        $('.elements').live('load', function () {
            $(this).fancyPlugin();
        })
    });
    

    事件不会在 ajax 调用后或在它们返回的内容中重新绑定。 live() 将处理程序附加到现在和将来的事件。"

    【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多