2009-08-19 17 views
41

Tengo un documento principal con un iframe incrustado. Dentro del iframe tengo un campo de carga. Una vez que el usuario selecciona un archivo para cargar, desencadenaré un evento de cambio jQuery. En ese caso, quiero establecer una variable en la ventana primaria en verdadero, para que el padre sepa que la carga ha comenzado.Establecer la variable en la ventana principal desde iframe

¿Alguien sabe cómo hacer esto?

trataba esto, pero no funcionó:

var test; 
$("#newsletter_email").change(function() { 
    parent.window.test = true; 

}); 

$('#send').click(function() { 
    if (test) { 
     alert('File has been uploaded!'); 
    } else { 
     alert('You need to upload a file'); 
    } 
}); 

Respuesta

82

variables en el ámbito global son auto-expuesto como propiedades DOM de su window objeto que contiene.

Esto significa que

var foo = 'bar'; 

es análoga a

window.foo = 'bar'; 

Lo que significa que se puede leer el ámbito global de cualquier window objeto se puede obtener una referencia a. Lo que también podemos implicar aquí es que el uso de window es implícito. Incluso cuando no escribe explícitamente "ventana", está allí de todos modos.

Y puesto que los marcos mismos son también auto-expuesto como propiedades DOM de la corriente window objeto, esto significa que se puede acceder a cualquier otro marco window objeto también.

La propiedad parent de window objetos contiene una referencia al objeto window del elemento primario de esa ventana (si lo hay). Desde iframes sin duda tienen una ventana padre, entonces todas estas cosas me acaba de escribir se reduce a esto

// set the global variable 'foo' in the parent global scope 
parent.foo = 'bar'; 
+0

¿Estoy en lo cierto al pensar que esto no puede estar en un archivo .js, o que el alcance primario estaría todo jodido? –

+4

No. Los archivos externos adoptan el alcance del documento en el que están incluidos. –

+0

+1, esta respuesta fue realmente útil hoy. Me salvó de un gran dolor de cabeza ^^ – marcgg

3

También puede almacenarlo en el almacenamiento local y leer y escribir de ella, siempre que tanto el documento principal y el iframe comparte el mismo dominio.

+0

Sí, pero no todos los navegadores admiten esto. –

+0

Me doy cuenta de que esto es un poco necroposting pero es relevante para mi trabajo ahora y hay un par de bibliotecas (store.js y store2.js) que amplían el concepto de localStorage para ser independiente del navegador. – pulverize

Cuestiones relacionadas