我们假设我有一个包含javascript文件的HTML页面:
base.js是这样的:
$(document).ready(function () {
obj.init();
}
// ..............
var obj = {...};
令人惊讶的是, 有时 (并非所有时间)Firebug在obj.init()
来电时向我显示未定义的错误!我的理解是文档就绪意味着所有html元素,包括图像,javascript文件下载和执行(?)。
我相信为了找到这个错误的根本原因,我们需要了解"文件准备好了什么"手段?任何人有任何见解?
============================
更新:也许我不应该在这里提到图像,我主要担心的是特别是javascript文件。是否" DOM完全构建"包括"所有执行的javascript代码"?
============================
再次更新:看来这里的人们同意了这个事件" document.ready"在下载并执行所有javascript代码之前不会被触发。因此,问题的根本原因仍然未知。在将$(document).ready块移动到javascript文件的底部后,我绕过了这个问题。
答案 0 :(得分:6)
来自jQuery.ready()
的文档:
虽然JavaScript在呈现页面时提供了执行代码的
load
事件,但在完全接收到所有资源(如图像)之前,不会触发此事件。在大多数情况下,只要完全构造DOM层次结构,就可以运行脚本。传递给.ready()
的处理程序保证在DOM准备好后执行,因此这通常是附加所有其他事件处理程序并运行其他jQuery代码的最佳位置。使用依赖于CSS样式属性值的脚本时,在引用脚本之前引用外部样式表或嵌入样式元素非常重要。如果代码依赖于加载的资源(例如,如果需要图像的尺寸),则代码应放在
load
事件的处理程序中。
答案 1 :(得分:2)
加载并解析文档时会发生ready
事件。
这包括所有Javascript文件,但不是图像。
在解析文档后发生就绪事件。有些浏览器有一个特定的事件,在其他浏览器中,jQuery使用一个定时器来轮询文档的状态。这意味着事件可以在解析整个文档时发生,也可以稍后发生,具体取决于浏览器。这通常不是问题,因为在解析文档的任何内容之前不会发生。
如果您在执行某些操作之前需要加载所有图像,则应使用load
事件。
答案 2 :(得分:1)
您应该在引用它之前定义obj
。
另外,document.ready并不意味着将加载资源,只是解析了文档,因此资源在文档就绪和$(window).load
事件之间加载。