1

对于(跨浏览器/平台)检查对象的存在(如果需要document,可能还有对象)的最佳和最安全(不是最短/最快)的解决方案是什么?window

(function(root, undefined) {

    var document = false;

    if(typeof root.document === "object" && root.document !== null)
        document = root.document;

    // ...

    if(document !== false)
        doMyFancyClientSideStuff();

})(this);

总是typeof window.document在浏览器中"object"吗?或者是否需要某种解决方法来确保我们接收到的对象确实是 DOM 类型的对象,例如window.document instanceof window.Document,而不仅仅是自制对象或其他对象。

4

1 回答 1

1

您对“跨浏览器”的定义在这里非常重要。我实际上建议检查以下[[Class]]属性:

Object.prototype.toString.call( root.document );

这应该[object HTMLDocument]在现代浏览器(或[object Undefined])中返回。要在此列表中也包括 IE8+,我们需要调用

if( "" + this.document === '[object HTMLDocument]' ) { }

这将创建一个列表

  • IE8+
  • 铬合金
  • 火狐
  • 苹果浏览器
  • Opera(我不知道,但我想是的)

[object]IE<8将始终返回window.document[[Class]]。这至少是我能想到的最准确的检查。您当然可以,也可以检查类似

if( 'document' in this ) { }

但这并不能保证我们谈论的是一个实际的 DOM 对象,只是document在全局对象中调用了一个属性。

于 2012-07-09T13:28:35.823 回答