2009-09-26 36 views
73

El componente JS del lado del cliente de Orbited (un servidor Comet), requiere que si el servidor se está ejecutando en un dominio diferente o puerto a la propia JS, debe ejecutar¿Qué hace document.domain = document.domain?

document.domain = document.domain; 

antes que cualquier otro JS está cargado . (Consulte el documentation.)

¿Qué significa esto? ¡Parece un NOOP! (He comprobado y de hecho es necesario.)

Respuesta

175

De hecho, escribí este código.

Al intentar hacerlo a través del subdominio/cometa puerto, el iframe tiene que tener el mismo valor document.domain como el marco principal. Desafortunadamente, el navegador almacena el nombre de dominio Y el puerto internamente para el valor original document.domain. Pero getter y setter en javascript no saben nada sobre el puerto. El problema es el siguiente: si el marco superior document.domain es ('example.com', 80), y el marco inferior es ('comet.example.com', 80), ¿cómo se obtiene el marco inferior como ('example.com', 80) también?

No puede, ya que cambiar la parte de nombre de host necesariamente hará que el puerto se establezca en null, por lo que lo mejor que puede hacer es ('example.com', null) en el marco inferior. Por lo tanto, el marco superior también debe establecerse en ese valor, y establecer document.domain=document.domain hace precisamente eso. Cambia la representación interna en el navegador de ('example.com', 80) a ('example.com', null) y luego todo coincide y la comunicación entre marcos/puertos de subdominios funciona.

+80

+1 para la primera oración :) –

+0

Desafortunadamente, esta solución no funcionó para mí (ver http://stackoverflow.com/questions/7796767/is-it-possible-to-alter-one-frame-from-another- using-javascript para más detalles). Agregar 'document.domain = document.domain' a todos los marcos no cambia el comportamiento de Chrome. ¿Algunas ideas? –

+0

Además, descubrí que si establecía un retraso para mi js, al menos obtengo URL válidas para ambos marcos. Aún así, sin embargo, un marco no puede acceder al otro. –

9

He encontrado la siguiente información en este sitio: devguru. Más concretamente, aquí está la cita:

Este conjuntos de propiedades o devuelve el nombre de dominio del servidor desde el que se originó el documento . Esto predetermina al nombre de dominio del servidor que se recuperó del documento , pero se puede cambiar a un sufijo (y solo un sufijo ) de este nombre. Esto permite que comparta las propiedades de script, de seguridad, lo que permite, entre documentos entregados de diferentes servidores siempre que ellos compartan el mismo sufijo de dominio.

Me parece que permite scripts de sitios cruzados para el mismo dominio (incluso si el subdominio es diferente).

Supongo que si no toca document.domain, el motor js solo permite otros javascripts del mismo dominio. Con esa propiedad, podrá implementar en otros subdominios como el estado de documentos en órbita.

+6

eso no explica por qué 'document.domain = document.domain' * no * es un NOOP. –

+1

Es solo una suposición descabellada, pero como dije, creo que la propiedad solo se activa cuando se establece en un valor. –

29

navegadores distinguen entre (a) document.domain cuando no está definida explícitamente y (b) document.domain pero explicitamente ... incluso si regresan el mismo valor.

La configuración explícita del valor indica la intención de "cooperar" con un script en otro subdominio (bajo el mismo dominio principal).

Si AMBAS la página principal Y el script externo establecen explícitamente el documento.dominio con el mismo valor, la restricción de política de origen mismo puede pasarse por alto y cada secuencia de comandos puede acceder a todos los objetos y propiedades (por lo demás restringidos) de los contextos de los demás.

+5

Su primera oración es un detalle extremadamente crítico para entender sobre este tema. ¡Gracias! –

+0

¡De nada! Me alegro de que fue útil. :) – cweekly

6

El document.domain obtiene un valor predeterminado de la URL real si no se establece explícitamente. Los navegadores registrarán si document.domain ha salido por defecto de la URL o si se ha establecido explícitamente. Ambos deben ser valores predeterminados para el mismo dominio o ambos deben establecerse explícitamente en el mismo dominio para que esto funcione. Si uno está predeterminado y uno está configurado explícitamente, ambos coincidentes si se leen, las dos páginas seguirán prohibidas de hablar entre ellas.

Ver: https://developer.mozilla.org/en-US/docs/DOM/document.domain