2012-04-01 7 views
5

In my question Pumbaa80 found einen Unterschied zwischen open() und window.open() Beantwortung Aufruf, versuchen Sie die folgenden Beispiele in Firefox (getestet auf 11,0):Was ist der Unterschied zwischen open() und window.open() in Firefox?

  1. http://jsfiddle.net/9kqp5/ (ruft open; öffnet in neuem Tab in FF, vorausgesetzt, dass Die Einstellung "Neue Fenster in der neuen Registerkarte öffnen" ist aktiviert. Dies ist die Standardeinstellung.

  2. http://jsfiddle.net/HLbLu/ (Anrufe window.open; öffnet in neuem kleinen Fenster)

Aber warum auf der Erde gibt es einen Unterschied? Wenn ich versuche, die following example:

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

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

Beiden Varianten Aufruf Funktion hello Arbeit genau die gleichen, auch die gleichen this mit !!!

+1

funktioniert das gleiche für mich, alles, was Sie Probe öffnen die gleiche Sache. Und in der Tat sind sie dasselbe, es sei denn, Sie definieren einen anderen Funktionsaufruf. –

+0

Beide JS Fiddles zeigen dasselbe Verhalten (das Öffnen eines neuen Fensters) auch für mich. –

+0

Das gleiche hier, versuchte Opera und Firefox. – Imp

Antwort

7

Einer Ihrer Geigen ruft window.open, während der andere document.open nennen, weil der Umfang Kette in Inline-Attribut Event-Handler ist seltsam. Sie enden also bei http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#dom-document-open

Das heißt, da Sie 3 Argumente übergeben, sollte dies aufgerufen werden window.open. Der Unterschied im Verhalten scheint ein Fehler in Firefox zu sein. Ich habe https://bugzilla.mozilla.org/show_bug.cgi?id=741266 darauf abgelegt.

+0

interessant, danke ... – TMS

+0

Nein Boris, du hättest diesen Bugreport nicht veröffentlichen sollen! Ich brauche diese Funktion !!! [Ich muss in der Lage sein, eine Legende in kleinen neuen Fenstern zu öffnen] (http://stackoverflow.com/q/9956827/684229)! – TMS

+0

Der Punkt des Fehlerberichts ist, dass 'document.open' und' window.open' in diesem Fall ein anderes Verhalten haben: Der erste öffnet einen neuen Tab und der zweite öffnet ein kleines neues Fenster. Sie sollten dasselbe Verhalten haben und dieses Verhalten sollte ein kleines neues Fenster öffnen. Was ist der Patch, den ich geschrieben habe? Sie sollten sich den Patch und besonders den Test darin ansehen. –

0

Die sind in der Tat gleich. Versuchen Sie window.open === open oder window["open"] === open. Wenn das für dich falsch ergibt, dann musst du in einer Schließung sein und ein Code hat offen definiert.

Und natürlich steht dies für alle Objekte, die Mitglied des globalen (Fenster) -Objekts sind.

4

Ihre zwei Fiddles funktionieren für mich auf Chrome.

die beiden Codezeilen jedoch

window.open(...);

und

open(...);

sind nicht äquivalent. Die einzige Zeit, in der sie äquivalent sind, besteht darin, dass der aktuelle ausführende Bereich keine neue Definition für open bereitstellt, wodurch der Interpreter in den höheren Bereichen sucht, bis er den globalen Gültigkeitsbereich erreicht und window.open findet.

Sie können dies in this fiddle in Aktion sehen:

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

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

test(); 
+0

Ja, das ist offensichtlich, aber wenn man sich die beiden Geigen in meiner Frage anschaut, nennen sie beide im globalen Kontext "offen" und trotzdem gibt es einen Unterschied! – TMS

+0

@Tomas Ich denke, Sie müssen die Version von Firefox angeben, die Sie verwenden. Bisher hat noch niemand das Phänomen reproduziert. –

+0

@AndrewLeach, das neueste natürlich ... (das ist die Standardeinstellung :-)). Version 11.0. – TMS

1

in einem Browser ist der Standardkontext window. Deshalb können Sie beispielsweise open(), alert() und sogar escape() anrufen. Der Aufruf window.open() entspricht genau open().

Wie ein neues Fenster durch den Funktionsaufruf open() geöffnet wird, hängt vollständig von Ihrem Browser ab.

+0

Aber wie erklären Sie den Unterschied der beiden Geigen? – TMS

+0

Es gibt keinen Unterschied. Wenn neue Fenster als Tabs im Browser geöffnet werden, werden sie als Tabs geöffnet. Mit dieser Unschärfe öffnen sie sich als Fenster. Sie müssten angeben, in welchem ​​Browser und in welcher Version Sie den Unterschied sehen und welche Richtlinien für Ihr neues Fenster gelten. Stellen Sie sicher, dass keine speziellen Plug-ins ausgeführt werden, die sich möglicherweise auf das Durchsuchen neuer Fenster/Registerkarten auswirken. –

+0

Pumba [beobachtete den gleichen Unterschied hier] (http://StackOverflow.com/a/9962756/684229) ... Ich habe keine speziellen Registerkarten-Plugins, mit nur FF 11.0 mit Firebug, Web-Entwickler-Toolbar und RealPlayer-Browser Aufnahme von Add-ons. Siehe den Hinweis zu den Einstellungen, die ich in meiner Frage aktualisiert habe. – TMS

1

Das ist in der Tat sehr seltsam.Es sieht aus wie die onclick Handler wenn als Attribut hinzugefügt einig Kontext mit einer eingewickelt open Funktion, die von window.open unterscheidet hat:

http://jsfiddle.net/aFujb/

Dies geschieht in neuester Firefox, Safari und Chrome. Ich kann keinen Erklärungs- oder Fehlerbericht für einen Browser finden.

Ich habe versucht, herauszufinden, was im Firefox-Quellcode passiert, aber ganz ehrlich, es ist zu viel für mich atm. Sieht aus, es gibt two different window.open implementations genannt nsGlobalWindow::Open und nsGlobalWindow::OpenJS, aber ich bin mir nicht sicher, ob das etwas mit der Frage zu tun hat.

+0

Endlich jemand! Danke für deine Untersuchung, Pumbaa. – TMS

+1

Es ist kein Fehler. In Ihrer Geige passiert das bareword-Lookup für 'open' in einem' onclick' _attribute_, also wird nach dem Element gesucht, auf dem sich das Attribut befindet, dann auf dem Dokument und dann auf dem Fenster. Und so findet es natürlich 'document.open' bevor es überhaupt zum Fenster kommt ... –

+0

@BorisZbarsky hat Recht; Für eine Erklärung des Grundes siehe [meine Antwort] (http://stackoverflow.com/a/9970045/249624). –

5

In der Ereignisbehandlungsroutine wird open selbst auf document.open aufgelöst. Wie Boris Zbarsky in einem Kommentar und in his answer erwähnt, ist dies das erwartete Verhalten, das von HTML5 angegeben wird. In the section on event handlers, Schritt 6 gibt an:

6. Verwenden der Umgebung Skriptausführung oben erstellt, erstellen Sie eine Funktionsobjekt (wie in ECMAScript Edition 5 Abschnitt 13.2 Erstellen von Funktionsobjekte definiert), mit:

(...)
lexikalische Umgebung Scope

  1. Lassen Scope das Ergebnis NewObjectEnvironment (des Elements Dokument sein, die g lobale Umgebung).
  2. Wenn das Element einen Formularbesitzer hat, lassen Sie Scope das Ergebnis von NewObjectEnvironment sein (der Formularbesitzer des Elements, Scope).
  3. Lassen Sie Scope das Ergebnis von NewObjectEnvironment (das Objekt des Elements, Scope) sein.

    1. lokaler Bereich
    2. Elementeigenschaften
    3. Eigentümer Form:
      (...)

Mit anderen Worten, Variablenreferenzen innerhalb der Event-Handler werden in der Reihenfolge gelöst werden Eigenschaften (falls zutreffend)

  • document Eigenschaften
  • globale Reichweite
  • +0

    Aha, gute Arbeit! Ein sehr seltsames Verhalten. Es ist so, als wäre der Handler in verschachtelte "mit" -Blöcken verpackt. Das hätte ich nie erwartet. – user123444555621

    +0

    Danke, tolle Erklärung! – TMS

    +0

    @ Pumbaa80 Verschachtelt mit Blöcken ist genau das, was das Verhalten ist. Ja, es ist verrückt, aber es ist für immer so in Browsern, und viele Websites hängen leider davon ab. –

    Verwandte Themen