2012-06-11 19 views
21

Ho una finestra, dove prima di essere chiusa aggiorno la pagina sottostante.typeof return "unknown" in IE

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

Se mi sono trasferita lontano dalla pagina di apertura originale, questo codice dovrebbe lanciare un "negato il permesso" Errore .

Debug del codice rivelato che typeof(opener.Refresh) è stato pari a "sconosciuto" anziché il previsto "indefinito".

Per quanto io sappia "sconosciuto" non è uno dei valori restituiti per typeof, così come e perché sarebbe questo valore essere restituiti?

Ulteriori informazioni

Ho evitato l'errore modificando l'assegno a:

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

Tuttavia esempi come questo (detecting-an-undefined-object-property-in-javascript) non sembrano al fattore "ignoto" nell'equazione .

+11

È IE, che cosa ti aspettavi? – 0x499602D2

+0

Come viene dichiarato 'opener'? –

+0

Non è dichiarato, tuttavia la finestra viene creata con una finestra standard.open. –

risposta

16

Secondo una duplicate question at Bytes, il valore typeof unknown è aggiunto JScript versione 8, insieme con date.

Un comment a un blog da Robert Nyman può anche essere esplicativo:

Internet Explorer visualizza “sconosciuta” quando l'oggetto in questione è sul dall'altro lato di un COM + ponte. Potresti non saperlo o realizzare questo , ma l'oggetto XMLHTTP di MS fa parte di un diverso oggetto COM + che implementa IUnknown; quando chiami metodi, lo stai facendo su un bridge COM e non chiamando JavaScript nativo.

Fondamentalmente questa è la risposta di MS se si tenta di testare o accedere a qualcosa che non è una parte vera del motore JScript.

+0

Grazie. Avevo già visto quel commento, ma non potevo collegarlo al mio caso apparentemente semplice ... –

+0

Quindi la soluzione migliore è non controllare mai '! == 'indefinito'' e controllare che sia uguale a uno dei valori noti ? O usare l'operatore 'in' come [TomaszDz] (http://stackoverflow.com/a/15152662/227299) suggerito? –

+0

Se è davvero necessario verificare la presenza di undefined (e non l'esistenza di una funzione come OP modificata in precedenza), funzionerà: (typeof myObj.myProp === 'undefined' || typeof myObj.myProp === 'unknown') – Bob

5

Le ECMAScript specification afferma che per gli oggetti ospitante il valore restituito dell'operatore typeof è:

implementazione definita eccezione non può essere "undefined", "boolean", "number", o "string" .

Credo che il valore unknown venga sempre restituito solo in Internet Explorer. È interessante notare che, MSDN non ne parla:

Ci sono sei possibili valori che typeof restituisce:. "Numero", "string", "booleano", "oggetto", "funzione", e "non definito"

+0

Hai qualche idea su quali scenari "sconosciuti" verrebbero restituiti? –

+4

Non ho idea di aver paura. Non riesco a trovare alcuna documentazione reale su di esso. Questo è il problema con gli oggetti host. Non ci sono standard, quindi gli sviluppatori di browser possono fare praticamente ciò che vogliono. –

+1

@BrettPostin Un sacco di 'typeof == 'unknown'' in [' window.external'] (http://msdn.microsoft.com/en-us/library/ie/ms535246 (v = vs.85) .aspx) Ad esempio 'typeof window.external.AutoScan' o' window.external.CreateAuthorizationHeader' –

7

Prova operatore in. Ho avuto lo stesso problema (con l'applet) e l'ho risolto usando in:

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

Ehi, grazie! Questo è un grande suggerimento. –