2010-04-27 7 views
23

C'è un passato contorto che riguarda il modo in cui mi sono imbattuto in questo, ma perché la proprietà self non è esattamente uguale alla finestra stessa?Perché la finestra non è identica a window.self in Internet Explorer?

in Safari e Firefox e amici, i risultati sono come mi aspetto:

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

Lo stesso non vale in Internet Explorer, però:

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

Can conto a nessuno per l'incoerenza? Per esattamente qual è la proprietà self dell'indicizzazione dell'oggetto della finestra? Si rivolge a qualcosa con l'uguaglianza, che è ancora più irritante.

+0

Interessanti a quanto pare non sono dello stesso tipo. window.self.self === window.self equivale al vero pensiero. Apparentemente IE considera la finestra come un tipo speciale. –

+5

perché IE fa tutto sbagliato. :-) –

risposta

15

Questo non è tutto, window!==window.window!

Credo che quello che probabilmente stiamo vedendo qui è la differenza tra gli oggetti "finestra interna" e "finestra esterna". Certamente altri browser hanno questi (ad esempio Moz); in genere vengono utilizzati per presentare una vista diversa di window all'interno e all'esterno del proprio codice.

La finestra interna contiene le variabili globali e i membri specifici del documento. La finestra esterna è accessibile allo script [cross-frame-] tramite riferimenti di finestra come frames[n], parent, opener e apparentemente self. È associato alla finestra del proprietario (finestra del browser/frame), quindi ad es. quando si sposta un iframe in un nuovo documento, il documento principale vede ancora l'oggetto identico window nel suo iframe.

In un design ragionevole del modello di oggetto del browser ci sarebbero oggetti separati per questo, ma quando JavaScript è stato originariamente gettato insieme da Netscape ci sono state pochissime considerazioni sull'eleganza, risultando in questa e molte altre interfacce dove c'è troppo sovraccarico (form con un elemento chiamato submit, qualcuno?).

Quindi per la compatibilità, la finestra divisa deve continuare per apparire come un singolo oggetto per gli script anche se non è sotto. In IE, a volte la maschera scivola: sembra come dire che window ti porta la finestra interna, e non c'è trucco per renderlo === contro la finestra esterna.

ETA: In realtà ci penso, c'è anche qualche (scarsa) giustificazione per questo. La specifica ECMAScript, che non è scritta con più contesti globali in mente, definisce window e la versione non associata di this, come il recupero dell'oggetto della variabile globale, che sarebbe la finestra interna.

Le altre proprietà, che fanno parte del DOM/BOM, non rientrano nello scopo delle specifiche ECMA, quindi possono restituire qualcosa di diverso (e, per motivi di script cross-frame).

+1

Wow, non sono sicuro che avrei potuto chiedere una risposta migliore. –

+0

Dove e in quale specifica ECMAScript vedi una definizione per un oggetto globale 'window'? Inoltre, tutta questa roba interna ed esterna è BS. Sono entrambi gli stessi 'AbstractView's del DOM (anche se ovviamente non in IE però). Come espresso dalle variabili taglienti di JavaScript, 'window # 1 = {window: # 1 #}'. –

+2

@EliGray: ECMA262-3 s10.1.5, ECMA262-5 s15.1: "nel modello di oggetto documento HTML la proprietà' window' dell'oggetto globale è l'oggetto globale stesso ". Si può pensare che le finestre divise siano BS, ma è quello che fa la maggior parte dei browser, e deve fare se devono mantenere il comportamento di cross-frame-scripting (\ *) di vecchia data che quando si passa ad una vista in un nuovo documento, il riferimento che si doveva alla sua 'finestra' ora punta alla' finestra' della nuova vista del documento. (\ *: IMO: comportamento scorretto, ma non va bene provare a cambiarlo ora.) – bobince

4

Bella domanda.Lo fa con document e document.parentWindow troppo:

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

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

La grande WTF per me però è:

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

È possibile scambiare window con this in qualsiasi degli esempi di cui sopra (e rimanere nel mondiale contesto) con gli stessi risultati. Rende ancor più sospetto l'operatore ==.

Perché si comporta in questo modo è così oltre me.

+2

Sarebbe stato meglio come commento, in quanto non risponde alla domanda. –

+0

Non si adatta perfettamente a un commento, eh. Si riferisce alla situazione in quel 'document.parentWindow === window.self'. Nella mia ipotesi (e chi può dire cosa sta realmente accadendo dato che è un dannato IE), le proprietà esplicite come 'window.window',' parent', 'self',' opener', 'frame.contentWindow',' document.parentWindow' prendi la finestra esterna, mentre il costrutto implicito a livello di linguaggio 'window' e' this' ti dà la finestra interiore. – bobince

+1

[proprio quello che sta succedendo con l'esilarante finestra non transitiva/documento == confronto, però, non ho il più pallido!] – bobince

Problemi correlati