window.document是null还是未定义?

时间:2012-08-25 03:39:11

标签: javascript dom

我一直在对window.document对象进行一些研究,以确保我的一个JavaScript解决方案是可靠的。是否存在window.document对象为null或未定义的情况?

为了便于讨论,这里是一段不相关的示例代码。是否存在这段代码失败的情况(又称抛出异常)?

$(document).ready(function() {
    var PageLoaded = (window.document.readyState === "complete");
});

4 个答案:

答案 0 :(得分:4)

  

是否存在window.document对象为null或未定义的情况?

是的,对于不在文档中的JavaScript代码(例如node.js)。但是这样的代码也可能没有窗口对象(尽管它会有一个全局对象)。

对于符合W3C DOM的用户代理中的HTML文档中的代码,编号为

> Are there any situations in which this piece of code will fail (i.e. throw
> an exception)?
> 
> [snip jQuery code]

在以下地方失败:

  1. jQuery ready函数失败(可能至少在某些浏览器中,但不是那些常用于桌面和某些移动设备的浏览器),
  2. 没有window object
  3. 没有window.document对象
  4. 为了对在各种主机中运行的代码充满信心,您可以执行以下操作:

      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 :(得分:1)

我认为文档始终是定义的,因为浏览器显示的所有内容都是html文档,甚至是site is not available。更多,document是readonly属性

window.document = null; 
console.log(window.document); //Document some.html#

答案 2 :(得分:1)

忽略Javascript运行除了网络浏览器/用户代理之外的其他地方的事实,你的pageLoaded测试可能会在iframe上失败(未经测试,但我知道它们很奇怪)。

“页面加载”的含义可能还有一些问题。您是否正在尝试查看DOM是否已呈现并且元素是否已准备好进行操作?或者您是否正在检查页面加载是否确实完成,其中包括加载所有其他元素(如图形)。

此讨论可能有用: How to check if DOM is ready without a framework?

答案 3 :(得分:1)

因为你的javascript代码必须用html文档编写,所以你的代码不能用文档执行,换句话说,没有文档,没有javascript。