2011-11-21 13 views
6

He realizado algunos experimentos en Chrome, pero no estoy seguro, así que necesito una confirmación:¿Los marcos e iframes tienen contextos javascript aislados?

Estoy en lo cierto al pensar que los marcos e iframes tienen un contexto de JavaScript por separado, lo que imposibilita compartir variables entre esos marcos/iframes?

Para simplificar, vamos a suponer que el cliente siempre será la misma versión de Chrome (es mi caso)

+0

La respuesta es "sí", pero no es imposible "comparten variables". Sin embargo, puede ser arriesgado, ya que Internet Explorer es muy exigente con el linaje de los objetos de JavaScript. – Pointy

+0

Debe hacer una respuesta en lugar de un comentario;) Además, supongamos que el cliente siempre será Chrome. – Klaim

+0

la respuesta está lista. No * creo * que Chrome tiene la sensibilidad IE, pero no estoy 100% seguro. Sería bastante fácil de probar. – Pointy

Respuesta

8

Sí.

Sin embargo, puede utilizar la colección frames o parent para acceder a otros marcos (suponiendo que sean del mismo dominio).

1

La separación de contexto no es entre fotogramas, sino entre dominios. Esto significa que si carga el marco A con el dominio A y el marco B con el dominio B, el javascript del marco A no puede acceder al contexto del dominio B. Compruebe this para una explicación más larga.

EDITAR: Por supuesto, si están en el mismo dominio, la respuesta proporcionada por SLaks se aplica completamente.

6

No es "imposible" compartir valores entre cuadros, pero debe tener cuidado. En Internet Explorer, el siguiente escenario dará lugar a un error:

  1. Crear un objeto de JavaScript en el marco de A.
  2. Pase el objeto JavaScript para una función en la trama B, que guarda el valor en algún lugar (en la trama B)
  3. constructivo a se vuelve a cargar con una nueva página
  4. Código en el marco B intenta hacer referencia al objeto salvado de la antigua trama() A.

Internet Explorer no le gusta cuando un objeto de una defunc t se hace referencia a la página.

3

Bueno, simplemente tienen diferentes objetos globales y alcance global. Sin embargo, si están en el mismo dominio, puede ejecutar código en uno de otro. Pero si tuviera que hacer esto (dentro de la ventana principal):

document.getElementById("myiframe").contentWindow.window.globalArray = []; 

que crea una variable global globalArray dentro de ámbito global del marco flotante.

y luego dentro del marco flotante

console.log(globalArray instanceof Array);

regresará false porque Array se refiere a Array constructor del marco flotante. Habría que hacer

console.log(globalArray instanceof top.Array); 

donde top se refiere al objeto global ventana contenedora.

jsFiddle: http://jsfiddle.net/EFbtN/

Cuestiones relacionadas