2012-06-11 8 views
21

Ich habe ein Fenster, wo vor dem Schließen ich die zugrunde liegende Seite aktualisieren.typeof zurück "unbekannt" in IE

if(opener && typeof(opener.Refresh) != 'undefined') 
{ 
    opener.Refresh(); 
} 

Wenn ich weg von der ursprünglichen Öffnung Seite bewegt, dieser Code würde werfen einen „Zugriff verweigert“ Fehler.

den Code Debugging ergab, dass typeof(opener.Refresh)-„unbekannt“ statt der erwarteten „undefiniert“ gleich war.

Soweit ich bin mir bewusst, „unbekannt“ nicht einer der Rückgabewerte für typeof ist, so, wie und warum würde dieser Wert zurückgegeben?

Weitere Informationen

ich den Fehler vermieden, indem die Prüfung auf Veränderung:

if(opener && typeof(opener.Refresh) == 'function') 

aber Beispiele wie diese (detecting-an-undefined-object-property-in-javascript) scheinen nicht „unbekannt“ in die Gleichung zu Faktor .

+11

Es ist IE, was hast du erwartet? – 0x499602D2

+0

Wie wird 'opener' deklariert? –

+0

Es wird nicht deklariert, jedoch wird das Fenster mit einem Standard window.open erstellt. –

Antwort

16

Nach einem duplicate question at Bytes, der typeof Wert unknown hinzugefügt JScript Version 8 sowie date.

A comment in einem Blog von Robert Nyman kann auch erklärend sein:

Internet Explorer zeigt „unbekannt“, wenn das betreffende Objekt auf der anderen Seite einer COM + Brücke ist. Sie können dies nicht wissen oder realisieren dies, aber MS XMLHTTP-Objekt ist Teil eines anderen COM + -Objekts, das implementiert IUnknown; Wenn Sie Methoden aufrufen, tun Sie dies über eine COM-Brücke und nicht natives JavaScript aufrufen.

Dies ist die Antwort von MS, wenn Sie versuchen, etwas zu testen oder auf etwas zuzugreifen das ist kein echter Teil der JScript-Engine.

+0

Danke. Ich hatte diesen Kommentar schon gesehen, konnte ihn aber nicht auf meinen scheinbar einfachen Fall beziehen ... –

+0

Also ist die beste Lösung, niemals nach '! == 'undefiniert' zu suchen und zu prüfen, ob sie einem der bekannten Werte entspricht ? Oder verwenden Sie den 'in'-Operator als [TomaszDz] (http://stackoverflow.com/a/15152662/227299) vorgeschlagen? –

+0

Wenn Sie wirklich nach undefiniert suchen müssen (und nicht Funktion Existenz als OP oben bearbeitet), dann würde Folgendes funktionieren: (typeof myObj.myProp === 'undefiniert' || typeof myObj.myProp === 'unbekannt') – Bob

5

Die ECMAScript specification besagt, dass für Host der Rückgabewert des typeof Operator-Objekte ist:

Implementierung definiert, außer vielleicht nicht "undefined", "boolean", "number" oder "string" .

Ich glaube, der Wert unknown wird nur im Internet Explorer zurückgegeben. Interessanterweise nicht erwähnt MSDN nicht:

Es gibt sechs mögliche Werte, die Renditen typeof:. "Nummer", "string" "boolean", "Objekt", "Funktion" und "unbestimmt"

+0

Haben Sie irgendwelche Ideen, unter welchen Szenarien "unbekannt" zurückgegeben würde? –

+4

Keine Ahnung, ich habe Angst. Ich kann keine echte Dokumentation darüber finden. Das ist das Problem mit Host-Objekten. Es gibt keine Standards, also können die Browser-Entwickler so ziemlich alles machen, was sie wollen. –

+1

@BrettPostin Eine ganze Menge 'typeof == 'unbekannt' in [' window.external'] (http://msdn.microsoft.com/en-us/library/ie/ms535246 (v = vs.85) .aspx) Zum Beispiel 'typeof window.external.AutoScan' oder' window.external.CreateAuthorizationHeader' –

7

Versuchen Sie in Operator. Ich hatte das gleiche Problem (mit Applet) und ich löste es mit in:

if("Refresh" in opener) { 
    opener.Refresh(); 
} 
+0

Hey, danke! Das ist ein großartiger Vorschlag. –

Verwandte Themen