2009-07-21 24 views
10

Aquí está el caso:
página A contiene iframe B, B contiene iframe C, A y B están bajo el mismo dominio, C debajo de otro.
C intenta restablecer la ubicación del padre B con información adicional después de "#" para resolver la comunicación entre dominios usando la mensajería Fragment Id.

IE6/7/8 simplemente funciona bien con este caso, mientras que Firefox bloquea parent.location configuración con mensaje de error [Acceso a la propiedad denegada "código:" 1010]. Pero si B es la ventana superior, lo que significa que no hay A, Firefox también vive.

Es extraño para mí ... ¿Podrían ayudarme?

¡Gracias!Configuración de ubicación principal de JavaScript de Cross Domain error de firefox

Respuesta

15

Históricamente, cualquier ventana puede cambiar la ubicación de cualquier otra ventana. Esto resultó ser un problema porque, entre otras cosas, significaba que insertar un iframe de inicio de sesión en una ventana no era seguro (porque entonces un sitio malicioso podría reemplazar el iframe de inicio de sesión con una versión falsa). Con el tiempo, se han aplicado más restricciones a los cambios de ubicación en las ventanas del navegador, hasta ahora, cuando HTML5 y la mayoría de los navegadores han llegado a un acuerdo común en the ancestor policy. En pocas palabras, parafraseando la especificación de HTML 5, una ventana A puede cambiar la ubicación de otro si y sólo si la ventana B:

  • los lugares de A y B tienen el mismo origen, es decir, que tienen el mismo esquema, anfitrión y puerto (http, stackoverflow.com, 80 por ejemplo) o
  • B es una ventana de nivel superior, y A es una ventana en un marco anidado a cierta profundidad dentro de B (hijo directo, hijo de un niño, etc.) o
  • B es una ventana abierta usando window.open y A puede cambiar la ubicación de la ventana que abrió B (por lo que B es una ventana emergente abierta por A, o una ventana emergente abierta por A, o con mayor profundidad) o
  • B no es una ventana de nivel superior, pero su ventana padre, o su ventana padre de los padres, o en alguna cantidad similar de parentesco las ubicaciones de esa ventana y A son del mismo origen

(mismo origen es más complicado que esto, pero la descripción incrustada anterior capta su esencia y cubre los casos más comunes.)

Según esta política, C puede cambiar la ubicación de A, y A puede cambiar la ubicación de B o C, pero C no puede cambiar la ubicación de B. Si necesita evitar esto, entonces debe cambiar la ubicación de su página A a algo que cambie B según corresponda; alternativamente, podría ask your page B to change its own location.

Afortunadamente eso es informativo, si no necesariamente útil. El modelo de seguridad del navegador no era tanto diseñado como evolucionado, y solo con el trabajo reciente en HTML5 realmente se está precisando para resolver estas incoherencias entre navegadores.

Dicho todo esto, estoy sorprendido de que IE7 e IE8 funcionen para usted, según tengo entendido, la política anterior se basó principalmente en la política implementada por IE7.

+0

gracias por su respuesta clara y hermosa, voy a reconsiderar mi solución sobre esto. –

+0

Gracias Jeff. Debe tenerse en cuenta que window.postMessage al que enlaza funciona en todos los navegadores modernos, pero la sintaxis en IE es un poco diferente. Publiqué una pregunta similar a esta y terminé respondiéndola yo mismo. Aquí está mi respuesta, que tiene una implementación simple de ejemplo entre navegadores: http://stackoverflow.com/questions/1860470/is-herehere-any-way-for-an-iframe-to-change-the-top-windows- url/1861054 # 1861054 – Kip

0

Desde C puede acceder a la ventana de B usando window.top.

intento, var B = window.top; B.location = "...";

+0

si usa window.top de C, obtuve A en lugar de B, pero no quiero restablecer la ubicación de A ... –

Cuestiones relacionadas