【问题标题】:$(document).ready() firing immediately within a jQuery-AJAX call$(document).ready() 在 jQuery-AJAX 调用中立即触发
【发布时间】:2012-06-26 11:14:12
【问题描述】:

我有一个名为 search.html 的 html 页面,其中包含以下 jQuery 代码:

$(document).ready(function(){
...some code // THIS IS THE CODE I'M INTERESTED IN
}
...some other code

我还有另一个包含以下 jQuery 代码的 html 页面:

$("#display_area").load("search.html") // #display_area is a div

问题是,当调用这个 jQuery 代码时,它会插入 search.html 的内容,但会立即执行我感兴趣的代码($(document).ready() 部分中的代码),它不等待 DOM 准备好,这显然会产生错误。

其他代码(在 $(document).ready() 部分之外)正常执行,没有任何问题。

将代码放在 .load() 函数的回调函数中也不起作用,代码会在 DOM 未准备好时触发。

有没有办法解决这个问题?任何帮助将不胜感激。

编辑:我只想指定 search.html 包含自己的 DOM,该 DOM 将插入到 #display_area div 中,我希望我的代码在 #display_area div 完成加载所有通过 load() 函数加载的新 DOM(内容)。

【问题讨论】:

  • 你能编辑search.html吗?

标签: jquery ajax document-ready ready


【解决方案1】:

我认为您的错误是当您的主页的 DOM 第一次准备好时调用 $(document).ready。更改 DOM 不会重新触发 $(document).ready。您的困惑来自于您在页面加载时调用$("#display_area").load("search.html")。那时,原始 DOM 还没有完成,当它完成时,$(document).ready 被触发,稍后(在某个随机时刻)你的 Ajax 函数返回。就是这样。

要在您的 Ajax .load 函数返回后执行代码,请使用此

$("#display_area").load("search.html", function() { 
    alert('New DOM elements should be available now'); 
    // do more stuff 
} );

编辑:好的,这是整个方案:

  • 在您的主 html 页面中,仅在 DOM 准备好时调用 $("#display_area").load("search.html")。因此,请从您的主页中的$(document).ready 函数进行此调用
  • 接下来,使用我描述的.load的回调函数,在里面做你想做的事
  • 最后,如果您希望 search.html 中的代码在加载后执行:在您的主页和 search.html 之间约定一个函数名称。此函数在 search.html 中定义并从 .load 回调中调用。

【讨论】:

  • 感谢您的帮助,但正如我在问题中所说,将代码放在 .load() 的回调函数中,就像您所做的那样,也不起作用。即使#display_area div 没有完成更新其 DOM,回调函数中的代码也会执行。我深信这是 DOM 未准备好的问题,因为如果我多次重新加载页面,有时它可以工作,有时它不会。
  • 啊。然后在主页的 document.ready 中执行 .load 调用!另外,我会做一个小的编辑来解释和添加一些东西。
  • 谢谢,但还是不行。实际上,问题似乎出在加载功能上。我从 $(document).ready 中删除了所有代码 - 现在我的调用页面中不再有 $(document).ready - 并将其放在 load() 的回调函数中。仅当主页的 DOM 按照您的建议准备好并且回调函数中的代码仍然启动得太早时,我才调用 load() 函数。
  • 您的观察与 jQuery API 相矛盾:“如果提供了“完整”回调,则在后处理和 HTML 插入完成后执行。所以我们一定在某处遗漏了一些东西。你知道如何调试网络请求吗?每个浏览器略有不同,Chrome:ctrl-shift-J 然后单击网络。究竟会发生什么? search.html 最终会成为#display_area div 的一部分吗?当 .load 警告框出现时,这是还是不可见?
  • 对不起,我一开始使用 $(document).ready() 的方式与您和@logansama 所建议的一样,肯定是错误的。但是,即使我将所有代码都放在 load() 的回调函数中,它也没有工作,但指出根据 jQuery API 它必须工作,这让我走上了正确的轨道,结果证明它因为另一个原因而无法工作问题:我有一个在这段代码中加载的 jQuery 滑块 UI,当通过 AJAX 加载时它似乎不起作用,因为它位于代码的开头,它也阻止了所有其余部分的运行。非常感谢您的帮助。
【解决方案2】:

search.html 中的$(document).ready() 将在search.html 加载时触发,这将在.load() 完成时发生,即使其他页面未完成加载。

您可以尝试将 JS 代码放在 search.html 中的普通函数中,然后在 .load() 的回调函数中调用此“新添加”函数。填充 div 仍然可以在 .load() 回调函数中进行。

【讨论】:

  • 感谢您的帮助,但正如我在问题中和对@Jochem 的评论中所说,将代码放在 .load() 的回调函数中,就像您解释的那样,不起作用任何一个。即使#display_area div 没有完成更新其 DOM,回调函数中的代码也会执行。我深信这是 DOM 没有准备好的问题,因为如果我多次重新加载页面,有时它会工作,有时它不会
  • @IlyesFerchiou - 然后您可以添加到我的答案中的是将 .load(..) 放在另一个文件的 .ready() 中。然后应该在加载 search.html 等之前使用容器 div 加载 DOM。
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多