我一直在研究 window.document 对象,以确保我 JavaScript 解决方案的可靠性。是否存在 window.document 对象为 null 或 undefined 的情况?
为了讨论,这里提供一个与主题无关的代码示例。是否存在任何情况会导致这段代码失败(即抛出异常)?
$(document).ready(function() {
var PageLoaded = (window.document.readyState === "complete");
});
我一直在研究 window.document 对象,以确保我 JavaScript 解决方案的可靠性。是否存在 window.document 对象为 null 或 undefined 的情况?
为了讨论,这里提供一个与主题无关的代码示例。是否存在任何情况会导致这段代码失败(即抛出异常)?
$(document).ready(function() {
var PageLoaded = (window.document.readyState === "complete");
});
在什么情况下window.document对象会是null或undefined?
在JavaScript代码不在文档中时(例如node.js),是可能出现的情况。但这种代码可能没有window对象(尽管它将拥有全局对象)。
对于符合W3C DOM标准的用户代理中的HTML文档,不会出现这种情况。
> Are there any situations in which this piece of code will fail (i.e. throw
> an exception)?
>
> [snip jQuery code]
以下情况会导致代码出现问题:
为了确保代码能够在各种主机上正常运行,您可以采取以下措施:
if (typeof window != 'undefined' && window.document &&
window.document.readyState == whatever) {
// do stuff
}
这并不需要花费太多额外的时间,可能只需要一次性完成。
其他选择:
(function (global) {
var window = global;
if (window.document && window.document.readyState == whatever) {
// do stuff
}
}(this));
并且
(function (global) {
var window = global;
function checkState() {
if (window.document && window.document.readyState) {
alert(window.document.readyState);
} else {
// analyse environment
}
}
// trivial use for demonstration
checkState();
setTimeout(checkState, 1000);
}(this));
(1, eval)("this")
而不仅仅是this
。 - Omar Tariqeval('this')
是的实现? - RobG我认为文档始终被定义,因为浏览器显示给你的所有内容都是 HTML 文档,即使是"网站不可用"。此外,document
是只读属性。
window.document = null;
console.log(window.document); //Document some.html#
忽略JavaScript在Web浏览器/用户代理以外的其他地方运行的事实,您的pageLoaded测试可能会在iframes上失败(未经测试,但我知道它们会变得奇怪)。
还有一些关于“页面加载完成”的含义的疑问。您是要查看DOM是否已呈现并准备好进行操作?还是要检查页面加载是否确实完成,其中包括所有其他元素(例如图形)也已加载。
这个讨论可能会有所帮助: 如何在没有框架的情况下检查DOM是否准备就绪?
DOM level 1
中定义的。只有一些古老的移动浏览器可能不支持。 - Dmitry Koroliovwindow.document
未定义,并且您需要readyState
的可靠性。 - Dmitry Koroliov由于您的 JavaScript 代码必须编写在 HTML 文档中,因此您的代码无法在文档外执行,换句话说,没有文档就没有 JavaScript。