2012-04-01 55 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