8

我研究了其他线程,只是感到困惑。

情况:我提供了一个通用的 jQuery 插件,它加载用户通过 AJAX 动态指定的 div。一切正常,但是在例如一个用户的页面上,有一段 JS 没有被调用,因为“就绪”事件没有被重新触发。

通常的情况是用户的其他 jQuery 东西会放在 jQuery(document).ready 之后。

我刚刚测试了调用:

$(document).trigger('ready');

手动 - 它根本没有任何效果,因为我认为“准备好”只被调用一次且只有一次。

处理它的正确方法是什么?(提供尽可能通用的解决方案会很棒)

我很想做类似这个帖子中建议的事情:

触发 $document.ready (所以我无法修改的 AJAX 代码被执行)

但我认为 readyList 现在是私有的,不能再直接操作了?

值得一提的是,我提供的插件为用户提供了回调功能。当然,他可以在其中放置加载后处理 JS 代码。

预先感谢和亲切的问候

4

3 回答 3

14

您不应该尝试重新加载整个 DOM 就绪函数。特别有害的是事件的 n+n 特性,例如,如果 DOM 就绪功能被它们反复重新触发,则同一元素上的 2 个单击事件可能会变为 4 个,然后是 8 个等。

您可以通过在完成 ajax 调用后取出需要运行的代码来避免这种情况,并且大概是您希望从您希望重新初始化的事件中受益的元素的数量。

$(document).ready(function()
{
    initialise();

    //... Resume with DOM ready
});

function initialise()
{
    // create event here that needs re-initialising
}

因此,当您完成 ajax 调用后,只需initialise()再次调用即可。

或者看看使用.on和使用它的冒泡功能,这就是我处理这类问题的方式。它避免了您必须考虑“重新初始化”脚本中 DOM 就绪函数的任何部分。

来自评论的补充

.on允许您将事件绑定到页面上在任何时候都不会更改的低级别元素,同时允许您控制哪些动态元素实际触发该容器中的事件。

<div id="container">

    <div id="ajax-content">

        <a href="#" class="created-link">A new link</a>

    </div>

</div>

所以我们知道它<a>是在 DOM 就绪事件被触发后由 ajax 函数创建的,因此任何应用到它的直接事件都将不起作用。

相反,我们会将事件绑定到较低级别的未更改元素并冒泡到包含的动态 DOM 元素。

$('#container').on('click', '.created-link', function(event)
{
    event.preventDefault();

    // Your normal onclick code
});
于 2012-09-02T12:30:08.053 回答
10

只是为了分享我的发现和解决方案,我遇到了同样的问题,在 AJAX 重新加载 $(document).ready 函数后,这个问题没有被调用,我使用了这两个答案的组合,最后找到了一个非常简单的解决方案

我的解决方案看起来像这样

<script type="text/javascript">
function initialise(){
    $('.clickableItem').click(function(){
        /* do code here */
        return false;
    });
};
$(document).ready(function(){
    initialise();
});
$(document).ajaxComplete(function () {
    initialise();
});
</script>

希望这可以帮助某人

于 2013-11-23T12:40:12.737 回答
0

看起来带有 # as href 的链接不起作用。只要照顾好这个。:)

于 2013-05-17T14:55:38.323 回答