【问题标题】:$( document ).ready() in partial view only runs first time it is added to the DOM via AJAX部分视图中的 $( document ).ready() 仅在第一次通过 AJAX 添加到 DOM 时运行
【发布时间】:2014-08-05 21:16:33
【问题描述】:

在使用 AJAX 将部分视图加载到页面上的对话框后,此代码(位于部分本身而不是主页中)运行并且我按预期获得选项卡:

// Run this on page load
$(function () {
    debugger;
    $("#ProjectTabset").tabs();
});

在这种情况下,如果包含部分的 div 从 DOM 中删除(使用 jQuery 删除)然后再次添加并再次加载部分,它应该再次运行,但它没有。

为什么它会第一次运行,但以后不会运行?问题可能是插入部分的 div 并没有以某种方式真正删除吗? (虽然我正在测试它在创建之前不存在,而且它似乎不再是 DOM 的一部分。)

如果我可以更清楚或提供更多细节,请告诉我:)

【问题讨论】:

  • 你应该在ajax调用成功回调中调用$("#ProjectTabset").tabs();
  • 谢谢,我已经尝试过了,它有效,但我对为什么这段代码第一次运行但之后没有运行感兴趣。
  • 您是否尝试过使用 $(document).find("#ProjectTabset").tabs();?
  • $(document).ready() 在文档准备好时运行。在事实之后附加 html 不会使文档没有准备好,一旦准备好,它总是准备好直到页面被卸载。 $(document).ready() 只被触发一次。您可以根据需要/需要多次绑定它,但每个都只会执行一次。
  • @KevinB,我认为,你应该发表你的评论作为答案。

标签: javascript jquery ajax asp.net-mvc


【解决方案1】:

由于您已经从 DOM 中删除了元素并动态添加回来,如果您希望在动态添加的元素上处理事件,您可能需要通过 on() 使用委托事件。请尝试以下方法,看看是否有帮助。

$( document ).on( 'ready', function (e) {
   $("#ProjectTabset").tabs();
})

事件处理程序仅绑定到当前选定的元素;在您的代码调用时,它们必须存在于页面上 。在()。要确保元素存在并且可以选择,请执行 文档就绪处理程序内的事件绑定,用于在 页面上的 HTML 标记。如果新的 HTML 被注入到 页面,选择元素并在新 HTML 之后附加事件处理程序 被放置在页面中。或者,使用委托事件附加事件 处理程序,如下所述。

委托事件的优势在于它们可以处理来自 以后添加到文档中的后代元素。经过 选择一个保证在该时间存在的元素 附加了委托事件处理程序,您可以使用委托事件 避免频繁附加和删除事件处理程序的需要。

链接here 可能会帮助您解决问题。

【讨论】:

  • 谢谢丹尼斯,这是个好主意。我将代码添加到父页面,并将其添加到其文档就绪 (DR) 中,并且两者都执行但没有导致部分的 DR 再次运行。我还将它添加到部分和它的 DR 中,但它根本没有被执行。我解释得够好了吗?这是一个奇怪的场景,我担心它不清楚发生了什么。它不是我的代码,我有点惊讶 DR 会从新插入的部分运行...
  • 不要以这种方式绑定到.ready。它不会做你认为它会做的事情。 ready 的处理方式与 jQuery 中的大多数其他事件不同。更不用说,您的语法甚至与事件委托没有任何关系。
  • @KevinB,很抱歉延迟回复,由于某种原因,我没有收到您的评论通知。你能详细说明吗?我很清楚 .ready 的作用,你的意思是代表团设置 Dennis R 建议吗?
  • @Gp24 我的观点是不可能委派 ready 事件,根据文档,使用 .on 绑定它被认为是一种不好的做法。使用 .on 绑定到它的问题是,如果 ready 事件已经触发,它将无法工作,它只能在单个页面的生命周期内触发一次。
  • 就绪事件不会帮助您解决问题。
【解决方案2】:

你应该使用.delegate():

 // Run this on page load or ajax load complete
 $('body').delegate('#ProjectTabset', 'ready', function() {
        $("#ProjectTabset").tabs();
 });

更新:

$(document).delegate('#ProjectTabset', 'click', function() {
    $('#ProjectTabset').tabs();
}

$.ajax(function(){
    ...
    success: function(){
        $('#ProjectTabset').click();
    }
})

【讨论】:

  • 并确保在 ajax 请求准备好后调用该函数! ;)
  • 感谢 mihutz,我尝试将此代码放在父页面及其文档就绪 (DR) 中,并在部分、其 DR 和 ajax 调用的成功函数中,但似乎没有一个按预期工作.确实是 .tabs();线似乎永远不会被调用。你还有其他地方想让我使用代码吗?
  • 感谢 mihutz,我正在做一些与此非常相似的事情 - 基本上只是在成功函数中调用 .tabs() 。我正在尝试找出什么会阻止包含在我正在加载的部分中的文档就绪函数运行,如果它在第一次添加到 DOM 时运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多