2012-04-01 85 views
5

在回答my question Pumbaa80 found差异呼吁open()window.open()之间,试试下面的例子在Firefox(在11.0测试):Firefox中的open()和window.open()有什么区别?

  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的两种变体!

+1

对我来说是一样的,你所有的样品都是一样的。事实上它们是同样的东西,除非你定义了另一个打开的电话号码 – 2012-04-01 16:45:05

+0

这两个JS Fiddles对我来说也表现出相同的行为(打开一个新窗口)。 – 2012-04-01 16:47:39

+0

同样在这里,尝试过Opera和Firefox。 – Imp 2012-04-01 16:50:09

回答

7

你的一个小提琴的呼唤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

+0

有趣,谢谢... – TMS 2012-04-02 08:23:05

+0

没有鲍里斯,你不应该发布该bugreport!我需要这个功能! [我需要能够在小新窗口中打开图例](http://stackoverflow.com/q/9956827/684229)! – TMS 2012-04-02 08:34:21

+0

错误报告的要点是,现在'document.open'和'window.open'在你的情况下有不同的行为:前者打开一个新标签,后者打开一个小窗口。他们应该有相同的行为,而这种行为应该是打开一个小小的新窗口。这是我写的补丁的功能;你应该看看补丁,特别是在测试中。 – 2012-04-02 13:43:56

0

其实是一样的。尝试window.open === openwindow["open"] === open。 如果这给你带来错误,那么你必须在一个闭包中,并且一些代码已经定义为open。

当然,这表示所有属于全局(窗口)对象成员的对象。

4

你的两个小提琴在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(); 
+0

是的,这很明显,但如果你看看我的问题中的两个小提琴,他们都会在全球范围内称为“开放”,但仍然存在差异! – TMS 2012-04-01 16:55:43

+0

@Tomas我认为你需要指定你使用的Firefox版本。到目前为止,没有人再现这种现象。 – 2012-04-01 16:59:55

+0

@AndrewLeach,当然是最新的......(这是默认的:-))。版本11.0。 – TMS 2012-04-01 17:01:51

1

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

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

+0

但你如何解释两个小提琴的区别? – TMS 2012-04-01 16:58:08

+0

没有区别。将新窗口设置为在浏览器中作为选项卡打开时,它们将以标签打开。随着这个未定,他们打开窗户。你必须指定哪种浏览器和版本,你会发现你的新窗口策略存在差异。确保您没有任何可能影响新窗口/选项卡式浏览的特殊插件。 – 2012-04-01 17:04:35

+0

Pumba [在这里观察到同样的区别](http://stackoverflow.com/a/9962756/684229)...我没有任何特殊的选项卡式插件,只有带有Firebug的FF 11.0,Web开发人员工具栏和RealPlayer浏览器记录加载项。请参阅关于我在问题中更新的设置的说明。 – TMS 2012-04-01 17:10:18

1

这确实很奇怪。它看起来像onclick处理器当作为一个属性增添了一些背景与包裹open功能,从不同window.open

http://jsfiddle.net/aFujb/

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

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

+0

终于有人了!感谢您的调查,Pumbaa。 – TMS 2012-04-01 20:45:39

+1

这不是一个错误。在你的小提琴中,'open'的裸词查找是在'onclick' _attribute_中进行的,因此它在属性所在的元素上查找,然后在文档上,然后在窗口上查找。所以当然它会在它到达窗口之前找到“document.open”... – 2012-04-02 01:15:05

+0

@BorisZbarsky是对的;请参阅[我的答案](http://stackoverflow.com/a/9970045/249624)以获取有关解释原因的说明。 – 2012-04-02 01:53:06

5

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

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

( ...)
词法环境范围

  1. 让范围是NewObjectEnvironment(元素的文件中,G的结果lobal环境)。
  2. 如果元素具有表单所有者,则让Scope为NewObjectEnvironment(元素的表单所有者,Scope)的结果。
  3. 让Scope成为NewObjectEnvironment(元素的对象,Scope)的结果。

    1. 本地范围
    2. 元件特性
    3. 所有者形式:
      (...)

换言之,事件处理程序内部的变量引用将在顺序来解决属性(如果适用)

  • document属性
  • 全球范围
  • +0

    啊哈,干得好!一个非常奇怪的行为,但。这就像处理程序被嵌套在'with'块中。我从未想到会这样。 – user123444555621 2012-04-02 07:10:02

    +0

    谢谢,很好的解释! – TMS 2012-04-02 08:26:28

    +0

    @ Pumbaa80与块的嵌套正是这种行为。是的,这很古怪,但在浏览器中永远如此,并且不幸的是,很多网站都依赖于它。 – 2012-04-02 13:44:40