【问题标题】:What is the difference between open() and window.open() in Firefox?Firefox 中的 open() 和 window.open() 有什么区别?
【发布时间】:2012-04-15 12:12:16
【问题描述】:

在回答my question Pumbaa80 found 调用open()window.open() 之间的区别时,请尝试以下示例在 Firefox 中(在 11.0 上测试):

  1. http://jsfiddle.net/9kqp5/(调用 open在 FF 中的新选项卡中打开,前提是“在新选项卡中打开新窗口”设置已打开,默认情况下为)

  2. http://jsfiddle.net/HLbLu/(致电window.open在新的小窗口中打开

但到底为什么会有不同呢?如果我尝试following example

<script>
var a = 2;
function hello() { alert(this.a); }

hello();
window.hello();
</script>

调用函数hello 的两种变体完全相同,包括具有相同的this!!!

【问题讨论】:

  • 对我来说是一样的,你所有的样本都打开了同样的东西。确实它们是同一回事,除非您定义另一个函数调用 open
  • 两个 JS Fiddles 对我来说也表现出相同的行为(打开一个新窗口)。
  • 这里也一样,试过 Opera 和 Firefox。
  • 我的 Firefox (3.6.21) 行为符合预期(window.openopen 相同)并且这两个小提琴都打开了一个新窗口。但是,我想以后的版本可能会巧妙地更改定义以适应标签。
  • 对不起大家!我想提一下 Firefox 有区别,但不小心删掉了,只在关键词上。又加了! Firefox 中的区别在linked question 中有更多描述。

标签: javascript firefox window


【解决方案1】:

您的一个小提琴正在调用window.open,而另一个正在调用document.open,因为内联属性事件处理程序中的范围链很奇怪。所以你最终会在http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#dom-document-open

也就是说,由于您传递了 3 个参数,因此应该调用 window.open。行为上的差异似乎是 Firefox 中的一个错误。我为此提交了https://bugzilla.mozilla.org/show_bug.cgi?id=741266

【讨论】:

  • 不,鲍里斯,你不应该发布那个错误报告!我需要这个功能!!! I need to be able to open a legend in small new windows!
  • 错误报告的重点是,现在document.openwindow.open 在您的情况下具有不同的行为:前者打开一个新选项卡,后者打开一个小新窗口。它们应该具有相同的行为,并且该行为应该是打开一个小的新窗口。这就是我写的补丁的作用;你应该看看补丁,尤其是其中的测试。
  • 鲍里斯,恐怕趋势是禁止打开新窗口.. 打电话给window.open 是最后的机会了。恐怕他们会以另一种方式解决错误:window.open 的行为方式与document.open 相同,即两者都将转到新选项卡(前提是您在新选项卡中设置了“在新选项卡中打开新窗口”) FF 属性,这是默认的)。
  • 没有“他们”。解决这个错误的人是我。 window.open 的行为是有原因的,document.open 做了一些不同的事情只是一个错误。现已修复。
  • 啊啊啊,我看到“分配给:Boris Zbarsky”!所以“他们”其实就是你? :-) 好!
【解决方案2】:

在事件处理程序中,open 本身将解析为 document.open。正如 Boris Zbarsky 在评论和 his answer 中提到的,这是 HTML5 指定的预期行为。在the section on event handlers 中,第 6 步指定:

6。使用上面创建的脚本执行环境,创建一个 函数对象(如 ECMAScript 第 5 版第 13.2 节中所定义的) 创建函数对象),其中:

(...)
词法环境范围

  1. 设 Scope 为 NewObjectEnvironment(元素的 Document,全局环境)的结果。
  2. 如果元素有表单所有者,则设 Scope 为 NewObjectEnvironment(元素的表单所有者,Scope)的结果。
  3. 设 Scope 为 NewObjectEnvironment(元素的对象,Scope)的结果。
    (...)

换句话说,事件处理程序中的变量引用将按顺序解析:

  1. 本地范围
  2. 元素属性
  3. 所有者表单属性(如果适用)
  4. document属性
  5. 全球范围

【讨论】:

  • 啊哈,干得好!虽然是一个非常奇怪的行为。就像处理程序被包裹在嵌套的 with 块中一样。我从没想过会这样。
  • @Pumbaa80 嵌套块正是这种行为。是的,这很古怪,但在浏览器中一直如此,不幸的是,大量网站都依赖它。
【解决方案3】:

你的两个小提琴在 Chrome 上对我来说是一样的。

但是这两行代码

window.open(...);

open(...);

不等价。唯一相同的情况是,如果您当前的执行范围没有为 open 提供新定义,导致解释器在更高的范围内查找,直到到达全局范围并找到 window.open

您可以在this fiddle 中看到这一点:

var test = function () {
    var open = function () {
      alert('uh oh');  
    };

    window.open('www.google.com');
    open('www.google.com');
};

test();

【讨论】:

  • 是的,这很明显,但是如果您查看我的问题中的两个小提琴,它们在全局上下文中都调用 open 并且仍然存在差异!
  • @Tomas 我认为您需要指定您正在使用的 Firefox 版本。到目前为止,还没有人重现这一现象。
  • @AndrewLeach,当然是最新的...(这是默认值:-))。 11.0 版。
【解决方案4】:

其实是一样的。试试window.open === openwindow["open"] === open。 如果这对您产生错误,那么您必须处于闭包中并且某些代码已定义为打开。

当然,这代表作为全局(窗口)对象成员的所有对象。

【讨论】:

    【解决方案5】:

    在浏览器中,默认上下文是window。这就是为什么你可以打电话给open()alert(),甚至是escape()。调用window.open() 完全等同于open()

    open() 函数调用如何打开新窗口完全取决于您的浏览器。

    【讨论】:

    • 但是你怎么解释这两个fiddles的区别呢?
    • 没有区别。将新窗口设置为在浏览器中作为选项卡打开时,它们将作为选项卡打开。在未设置的情况下,它们将作为窗口打开。您必须指定您看到差异的浏览器和版本以及您的新窗口策略是什么。确保您没有运行任何可能影响新窗口/选项卡式浏览的特殊插件。
    • Pumba observed the same difference here... 我没有任何特殊的选项卡式插件,只有带有 Firebug、Web 开发人员工具栏和 RealPlayer 浏览器记录插件的 FF 11.0。请参阅有关我在问题中更新的设置的说明。
    • 不知道该告诉你什么——这里的每个人都在说同样的话;他们无法重现您正在经历的事情。没有让某人查看 Firefox 的 about:config 的完整输出,我相信它要么是你不知道的插件,要么是你的 Firefox 配置文件中的一个挥之不去的设置(你升级到 11,还是这个使用新的个人资料?)。
    【解决方案6】:

    这确实很奇怪。看起来onclick 处理程序当作为属性添加时 具有与window.open 不同的包装open 函数的一些上下文:

    http://jsfiddle.net/aFujb/

    这发生在最新的 Firefox、Safari 和 Chrome 中。我找不到任何浏览器的解释或错误报告。

    我试图找出 Firefox 的源代码中发生了什么,但老实说,这对我来说太多了。看起来有two different window.open implementationsnsGlobalWindow::OpennsGlobalWindow::OpenJS,但我不确定这是否与问题有关。

    【讨论】:

    • 终于有人了!感谢您的调查,彭彭。
    • 这不是错误。在您的小提琴中,open 的裸词查找发生在 onclick attribute 中,因此它在属性所在的元素上查找,然后在文档上查找,然后在窗口上查找。所以它当然会在到达窗口之前找到document.open...
    • @BorisZbarsky 是对的;请参阅 my answer 了解原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2012-01-20
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多