jquery - AJAX 重新加载后重新触发就绪事件

标签 jquery

我研究了其他线程,但很困惑。

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

通常的情况是用户的其他 jQuery 内容将放在 jQuery(document).ready 之后。

我刚刚测试过调用:

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

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

正确的处理方法是什么? (如果能提供最通用的解决方案就太好了)

我很乐意做一些像这个帖子中建议的事情:

Trigger $document.ready (so AJAX code I can't modify is executed)

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

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

提前致谢并致以亲切的问候

最佳答案

您不应该尝试重新加载整个 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允许您将事件绑定(bind)到页面上任何时候都不会更改的低级元素,同时允许您控制哪些动态元素实际触发该容器内的事件。

<div id="container">

    <div id="ajax-content">

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

    </div>

</div>

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

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

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

    // Your normal onclick code
});

关于jquery - AJAX 重新加载后重新触发就绪事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235800/

相关文章:

javascript - 免费蜘蛛图 API

javascript - 从 fiddle 中获取选项卡示例并在我的元素中使用

jquery - 在 jQuery 中用自定义 div 替换动画宽度

javascript - 禁用单选按钮

javascript - 如何多重播放两个文本字段并在另一个文本字段中显示而不在 Rails 中提交(使用 jQuery 或 Javascript)

javascript - 为什么我不能使用 jQuery 将 php 变量发送到 javascript 变量?

弹出窗口中的 jquery 周日历

JavaScript 正则表达式 - 匹配和替换匹配项中的多次出现

javascript - 添加新输入后不工作类 .numeric。我该怎么办?

javascript - 单击任意位置关闭汉堡菜单