document.ready什么时候运行,什么时候内联JS被处理?

时间:2010-01-20 19:30:44

标签: javascript jquery javascript-events

我有一个页面,我在<head>部分导入了大部分js。 但是,主页面有一些内联javascript。

在我在<head>中导入的一个脚本中,我有$(document).ready...,它使用页面上内联定义的一些JS变量。 据我所知,这正如我所期望的那样 - $(document).ready使用内联定义的JS变量不会遇到任何错误。

但是,我收到了一些用户的报告,他们在$(document).ready内的代码中看到“未定义”错误,其中我引用了页面内联定义的变量。

我怀疑这是浏览器特定的行为,但我不确定。我没有在文档中明确地找到这个,所以有人可以确认在$(document).ready中从<head>引入的{{1}}页面中使用内联定义的变量是否可行?

引用您的来源会使您的回答更可信。 :)

谢谢!

3 个答案:

答案 0 :(得分:6)

引擎盖下:$(文件).ready()

正如您对John Resig所期望的那样,jQuery确定DOM何时就绪的方法使用各种优化。

例如,如果浏览器支持DOMContentLoaded事件(就像许多非IE浏览器那样),那么它将触发该事件。但是,在文档的readyState达到“完成”之前,IE无法安全地触发,这通常是晚些时候。

如果这些优化都不可用,window.onload将触发事件

来源:here

答案 1 :(得分:3)

为什么不在启动应用的“body”标记的末尾放置一个“脚本”标记 通过这样做,您确信一切就绪(跨浏览器和交叉库)。

<html>
  ...
  <script>startApp('param');</script>
</body>
</html>

“startApp”是之前任何地方定义的函数,无论是内联还是“head”标记。

答案 2 :(得分:1)

$(document).ready()针对不同的浏览器使用各种不同的方法。没有太多的浏览器同意如何处理这个事件,所以有很多方法可以测试它。我很确定jQuery实现,至少是IE hack,依赖于插入一个片段并检查它是否只有在DOM准备好后才存在的doScroll("left")属性。这是一种无证的行为,可能会随着IE的新版本而改变。

$(document).ready()的目的是允许您在页面加载完成之前运行与DOM相关的JavaScript,因为window.onload在整个页面加载之前不会触发。

不同的实施方案也具有不同的可靠性水平。听起来好像其中一个浏览器在完成加载之前触发了脚本。

请记住,内联JavaScript的触发顺序不一定在ready之前。听起来我应该将您的内联脚本合并到$(document).ready()回调中。 jQuery做得最好,但并不完美。