【问题标题】:Why do some browsers declare an opener object when there isn't one?为什么有些浏览器在没有 opener 对象的情况下声明了一个 opener 对象?
【发布时间】:2013-03-04 21:27:20
【问题描述】:
typeof(opener)

在除 IE 之外的所有浏览器中生成“对象”,尽管对象为空。 IE 仅在实际使用 window.open 或类似方法时才会这样做。我不想这么想,但 IE 是唯一能做到这一点的浏览器吗?

【问题讨论】:

  • 你为什么要看类型?为什么不只看价值? if (opener)。类型是什么?
  • 我只是想知道为什么该对象被声明在第一位。
  • IE 在“正常”窗口(不是从 js 打开的窗口)上为window.hasOwnProperty('opener') 提供了什么? undefined?
  • @Serhiy - 因为window.opener 是窗口对象上的有效属性,应该始终作为属性存在。它可能有也可能没有分配给它的非空值。
  • @bfavaretto false 在任何一种情况下

标签: javascript internet-explorer google-chrome firefox opera


【解决方案1】:

“为什么有些浏览器在没有开启器对象的情况下会声明?”

在 JavaScript 中,typeof null === "object"

使用直接的=== 比较,而不是typeof

opener === null; // true

如果 IE 给你undefined,那么使用== 来测试两者。

opener == null; // true if null or undefined

【讨论】:

  • 虽然是真的,但我不确定这是否真的与 OP 的要求有关。问题不是“为什么typeof null返回"object",而是“为什么非IE浏览器在这种情况下返回null?”当IE没有。(OP没有说什么IE确实如此,但我认为它给出了undefined?)
  • OP 想知道为什么当窗口没有打开器时对象不是未定义的。
  • @Serhiy:阅读标题。 OP 询问为什么有些浏览器在没有打开器对象的情况下声明了一个打开器对象。答案是他们没有,而且测试是有缺陷的。浏览器用null 原始值声明了一个全局变量,但碰巧null,它不是一个对象,作为typeof 的结果返回"object"。所以typeof 单独不能用于测试。
  • @thesystem Serhy 和 OP 是同一个人! :P!
  • @bfavaretto:对于 OP 以第三人称来称呼自己,这太奇怪了。 :P 不管怎样,答案都是一样的。
【解决方案2】:
  • window.opener 为空。
  • null 是导致对象带有typeof 的原始类型之一。

控制台输出Chrome:

> window.opener
    null
> typeof null
    "object"
> typeof window.opener
    "object"

控制台输出IE9:

>> window.opener 
>> typeof window.opener 
"undefined" 

看起来 Chrome/Firefox 将其初始化为 null 并且 IE 未将其定义为启动。但是,当您进行真实检查时,这并不重要,因为 null 和 undefined 将评估为 false。

【讨论】:

  • typeof null"object",但 null 实际上并不是一个对象。
【解决方案3】:

Internet Explorer 的许多功能与其他浏览器不同。这只是一个小例子。

良好的跨平台 JavaScript 将需要有许多 If-then-else 分支实例(或作为替代的 try-catch)来处理这些差异。

【讨论】:

  • 一个简单的测试方法是查看 Navigator.appName
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多