2009-04-24 17 views
6

Tengo una ventana emergente que devuelve los datos a su padre. Utilizando window.opener.document.data = data_from_popup;Javascript pasando datos desde la ventana de la ventana hijo a la ventana principal, IE error?

Esto funciona bien en FF, pero en IE (6/7) se puede acceder a los datos durante el tiempo en que se muestra la ventana emergente. Cuando cierro la ventana emergente, parece que los datos se recopilan.

He intentado utilizar una función clone() para los datos recibidos desde la ventana emergente:

window.opener.add_data(data_from_popup); 

y en el de los padres:

function add_data(data_from_popup) { 
data = clone(data_from_popup); 
} 

Es algo funciona, pero en ciertas condiciones la función clone() parece recurrir infinitamente.

¿Alguna vez ha experimentado lo mismo y existe alguna forma de evitarlo sin utilizar una función de clonación?

Respuesta

6

No estoy seguro exactamente de lo que está experimentando, pero he almacenado datos en el abridor de la ventana emergente regularmente en IE (6,7 & 8) en aplicaciones de desarrollo y producción.

¿tiene una URL o algún otro código fuente que puede proporcionar?

en una nota relacionada ... no está tratando de determinar el tipo de un objeto en el abridor ... de la ventana emergente ¿verdad? - Hay algunos errores conocidos de IE en esta área.

Actualización:

Aquí hay un ejemplo rápido ...

<!--main window--> 
<script> 
    function getThing(id){ 
    url = 'http://mysite.com/...whatever...'; 
    features = 'locationbar=X,menubar=Y...'; 
    window['popup4'+id] = open(url, 'someNameWithoutSpaces', features); 
    } 
    function popupCallback(data){ 
    alert('I got data back! ' + data); 
    document.getElementById('someID').innerHTML = '<b>' + data.label + ' (' + data.id + ')</b>'; 
    //close the popup (now that we have/are done with the data) 
    window['popup4someID'].close(); 
    } 
</script> 
<div id="someID">{Nothing Selected Yet}</div> 
<input type="button" value="Pick One" onclick="getThing('someID');"/> 

<!--popup window--> 
<script> 
    function saveSelection(){ 
    //acquire data however you want/need 
    var selData = {}; 
    selData.id = 123456; 
    selData.label = 'iPod Touch (Jeff Atwood Edition)'; 
    //call callback on opener 
    window.opener.popupCallback(selData); 
    } 
</script> 

Actualización 2

En la prueba se desprende que en IE7, IE8 (pero no IE6) después de que se cierra la ventana emergente, se pierde cualquier dato de referencia (las referencias no capturar una instantánea) por lo tanto, si necesita los datos después de cerrar la ventana emergente, tendrá que clonarla.

Pensé que si los datos se pueden envolver en una matriz, la clonación es pan comido. Simplemente llame a .slice() para copiarlo, pero ... ¡eso tampoco funciona!

Supongo que tendrá que guardar los valores que necesita (ya sea para formar elementos, o el DOM) ya que IE no parece que le permitirá usarlos después de que se cierre la ventana emergente. :-(

+0

¿Cómo almacenaste datos en el abridor? Específicamente, ¿almacenaste datos complejos (objetos, matrices, fechas) a través de window.opener? –

+0

He usado 2 cosas. 1 window.opener.foo = algún valor; mediante el cual esto almacena una variable global "foo" en la ventana de apertura. O abriré una ventana emergente y llamaré a una devolución de llamada ... diga window.opener.myCallback (someDataObj); donde mi función de devolución de llamada hace lo que quiera/necesite con los datos. – scunliffe

+0

Interesante. Esos dos ejemplos son los que rompen en IE. Cuando el usuario cierra la ventana secundaria, la referencia del abridor a los datos simplemente se cierra. – JPot

2

La forma en que finalmente lo hice es mediante la codificación JSON del objeto complejo que quería pasar al elemento principal en la ventana emergente. Los datos que se devuelven son una cadena simple y se pueden copiar sin problemas. La cadena codificada json se evalúa en un objeto Javascript.

Cuestiones relacionadas