2010-04-27 5 views
23

Hay un trasfondo complicado que involucra cómo me encontré con esto, pero ¿por qué la propiedad self no es exactamente igual a la ventana en sí?¿Por qué la ventana no es idéntica a window.self en Internet Explorer?

En Safari y Firefox y amigos, los resultados son los que cabe esperar:

> window == window.self 
    true 
> window === window.self 
    true 

Lo mismo no es cierto en Internet Explorer, sin embargo:

>> window == window.self 
    true 
>> window === window.self 
    false 

puede dar cuenta a nadie por la inconsistencia? ¿A qué se dirige exactamente la propiedad self del objeto ventana? Arroja algo con igualdad, que es aún más irritante.

+0

Interesante aparentemente no son del mismo tipo. window.self.self === window.self es igual al pensamiento verdadero. Aparentemente IE trata a la ventana como un tipo especial. –

+5

porque IE hace todo mal. :-) –

Respuesta

15

Eso no es todo, window!==window.window!

Creo que lo que probablemente estamos viendo aquí es la diferencia entre los objetos 'ventana interior' y 'ventana exterior'. Ciertamente, otros navegadores tienen estos (por ejemplo, Moz); normalmente se utilizan para presentar una vista diferente del window desde dentro y fuera de su propio código.

La ventana interna contiene sus variables globales y miembros específicos del documento. La ventana externa es accesible para [cross-frame-] scripting a través de referencias de ventana como frames[n], parent, opener, y aparentemente self. Está vinculado a la ventana gráfica del propietario (ventana/marco del navegador), por lo que, por ejemplo. cuando navega un iframe a un documento nuevo, el documento padre aún ve el objeto identidad igual a window en su iframe.

En un diseño de Modelo de objetos del navegador sensible habría objetos separados para esto, pero cuando JavaScript fue originalmente creado por Netscape se tuvo muy poca consideración por elegancia, lo que resultó en esta y muchas otras interfaces donde hay demasiada sobrecarga (form con un elemento llamado submit, ¿alguien?).

Por lo tanto, para compatibilidad, la ventana dividida tiene que continuar a aparecer para ser un objeto único para los scripts aunque no se encuentre debajo. En IE, a veces la máscara se desliza: parece que decir window te da la ventana interior, y no hay truco para que sea === contra la ventana exterior.

ETA: En realidad, ahora que lo pienso, incluso hay una justificación (deficiente) para esto. La especificación ECMAScript, que no está escrita con múltiples contextos globales en mente, define window, y la versión no vinculada de this, como la recuperación del objeto de ámbito de variable global, que sería la ventana interna.

Las demás propiedades, que forman parte del DOM/BOM, no están dentro del alcance de la especificación ECMA, por lo que pueden devolver algo diferente (y deben, en aras de la creación de scripts de trama cruzada).

+1

Guau, no estoy seguro de haber podido pedir una mejor respuesta. –

+0

¿Dónde y en qué especificación de ECMAScript ve una definición para un objeto global 'window'? Además, todo este material de ventana interno y externo es BS. Ambos son los mismos 'AbstractView's por DOM (aunque obviamente no en IE). Según lo expresado por las variables nítidas de JavaScript, 'ventana # 1 = {ventana: # 1 #}'. –

+2

@EliGray: ECMA262-3 s10.1.5, ECMA262-5 s15.1: "en el modelo de objeto de documento HTML, la propiedad' ventana' del objeto global es el objeto global mismo ". Puede pensar que las ventanas divididas son BS, pero eso es lo que hacen la mayoría de los navegadores, y deben hacer si quieren mantener el comportamiento de secuencias de comandos de cuadros cruzados de larga data (\ *) que cuando navega una vista hacia un documento nuevo, el la referencia que tenía a su 'ventana' ahora apunta a la' ventana' de la nueva vista del documento. (\ *: IMO: mala conducta, pero no está bien intentar cambiar eso ahora.) – bobince

4

Buena pregunta.Lo hace con document y document.parentWindow también:

window == document; // true 
window === document; // false 

window == document.parentWindow; // true 
window === document.parentWindow; // false 

La gran wtf para mí, aunque es:

window == document; // true 
document == window; // false 

Puede intercambiar window con this en cualquiera de los ejemplos anteriores (y permanecer en el mundial contexto) con los mismos resultados. Hace que el operador == sea aún más sospechoso.

Por qué se comporta de esta manera me supera.

+2

Hubiera sido mejor como comentario, ya que no responde la pregunta. –

+0

No encaja en ningún comentario, eh. Se relaciona con la situación en esa 'document.parentWindow === window.self'. En mi hipótesis (y quién puede decir lo que realmente está sucediendo dado su sangriento IE), las propiedades explícitas como 'window.window',' parent', 'self',' abridor', 'frame.contentWindow',' document.parentWindow' obtener la ventana exterior, mientras que las construcciones implícitas de nivel de lenguaje 'ventana' y' esto' le dan la ventana interna. – bobince

+1

[todo lo que está sucediendo con la hilarante ventana/documento no transitiva == comparación, sin embargo, ¡no tengo ni la más mínima!] – bobince

Cuestiones relacionadas