2012-06-11 12 views
21

Tengo una ventana, donde antes de cerrarla actualizo la página subyacente.typeof return "unknown" en IE

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

Si me alejé de la página original de apertura, este código podría lanzar un "permiso denegado" error .

Depuración del código reveló que era igual a typeof(opener.Refresh)"desconocido" en lugar del esperado "indefinido".

Por lo que yo soy consciente de "desconocido" no es uno de los valores de retorno de typeof, así que ¿cómo y por qué se devolvería este valor?

Más información

evitaba el error cambiando el cheque a:

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

Sin embargo no parecen ejemplos como este (detecting-an-undefined-object-property-in-javascript) al factor "desconocido" en la ecuación .

+11

Es IE, ¿qué esperabas? – 0x499602D2

+0

¿Cómo se declara 'abridor'? –

+0

No está declarado, sin embargo, la ventana se crea con un window.open estándar. –

Respuesta

16

Según un duplicate question at Bytes, el valor typeof unknown se añade a JScript versión 8, junto con date.

Un comment a un blog de Robert Nyman también puede ser explicativa:

Internet Explorer muestra “desconocido” cuando el objeto en cuestión está en el otro lado de un puente COM +. Puede que no sepa esto o no se dé cuenta esto, pero el objeto XMLHTTP de MS es parte de un objeto COM + diferente que implementa IUnknown; cuando llamas a los métodos, lo haces a través de un puente COM y no llamas a JavaScript nativo.

Básicamente esa es la respuesta de MS si intentas probar o acceder a algo que no es una verdadera parte del motor de JScript.

+0

Gracias. Ya había visto ese comentario, sin embargo no pude relacionarlo con mi caso aparentemente simple ... –

+0

Así que la mejor solución es no verificar nunca '! == 'undefined'' y verificar que sea igual a uno de los valores conocidos ? O use el operador 'in' como sugiere [TomaszDz] (http://stackoverflow.com/a/15152662/227299)? –

+0

Si realmente necesita verificar indefinido (y no funciona como OP editado arriba), entonces funcionaría lo siguiente: (typeof myObj.myProp === 'undefined' || typeof myObj.myProp === 'unknown') – Bob

5

Los ECMAScript specification estados que para objetos anfitrión el valor de retorno del operador typeof es:

definido por la implementación excepto puede no ser "undefined", "boolean", "number", o "string" .

Creo que el valor unknown solo se devuelve en Internet Explorer. Curiosamente, MSDN no lo menciona:

Hay seis valores posibles que typeof devuelve:. "Número", "cadena", "booleano", "objeto", "función", y "indefinido"

+0

¿Tiene alguna idea en qué escenarios se devolvería "desconocido"? –

+4

No tengo idea de que tengo miedo. No puedo encontrar ninguna documentación real al respecto. Ese es el problema con los objetos host. No existen estándares, por lo que los desarrolladores del navegador pueden hacer prácticamente lo que quieran. –

+1

@BrettPostin Una gran cantidad de 'typeof == 'unknown'' en [' window.external'] (http://msdn.microsoft.com/en-us/library/ie/ms535246 (v = vs.85) .aspx) Por ejemplo 'typeof window.external.AutoScan' o' window.external.CreateAuthorizationHeader' –

7

Probar in operador. Tuve el mismo problema (con el applet) y lo resolví usando in:

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

¡Oye, gracias! Esta es una gran sugerencia. –