JavaScript - Error window.opener.parent.location

 
Vista:

Error window.opener.parent.location

Publicado por David (2 intervenciones) el 02/03/2007 10:49:02
Hola.

Tengo un problemilla y mis conocimientos de javascript no son muy buenos.

Tengo una aplicacion la cual utilizo window.showModalDialog para abrir un pop up modal con una serie de controles. Una vez que el usuario elije un control llamo a la funcion window.opener.parent.location para que me vaya a la pagina de atras y me redirija a una determinada url segun el control seleccionado.

Me da el siguiente error 'window.opener.parent' es nulo o no es un objeto.

Esto me funcionaba perfectamente con window.open en vez de window.showModalDialog.

Si no se puede llamar a la funcion window.opener.parent desde una pagina modal de este tipo. ¿Sabeis como se podria hacer?

Mil gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error window.opener.parent.location

Publicado por Gonzalo (107 intervenciones) el 02/03/2007 12:15:47
Cuando usas un ModalDialog, este no es una nueva ventana propiamente dicha (aunque cargue una página en ella. Por tanto, no tiene opener, forma parte de la propia ventana en la que estás.

¿Qué quiere decir esto? Pues que showmodalDialog tiene su propio mecanismo para devolver valores a la ventana que lo llamó. El uso es un poco distinto que al hacer un window.open.

El uso es algo como...

1. En la ventana donde quieres abrir el diálogo:
var valorRetorno = showModalDialog("pagina.html");

(Opcionalmente también puedes pasarle un parámetro y la decoración (barra de estado, de direcciones, etc) que quieres que salga. Pero eso es irrelevante para el ejemplo)

2. En la página que cargas, pagina.html, puedes tener el HTML que quieras. Lo único que debes hacer para devolver un valor, es asignarlo a la propiedad returnValue y luego cerrar la ventana.
p.ej. podrías tener un campo input y un botón de aceptar que llame a aceptar(). Entonces podrías hacer algo como:
function aceptar() {
returnValue = miCampo.value;
close();
}


Esto es para hacer cosas sencillas, como preguntar por un dato (o quizá dos o tres datos), pero nada más. Si quieres hacer algo más sofisticado, tienes otra forma de hacerlo.

Como decía arriba, showModalDialog (y showModelessDialog también) acepta un segundo argumento en el que le puedes cualquier tipo de objeto al diálogo abierto. Le puedes pasar una cadena de texto, un número, un array de datos... o más interesante, le puedes pasar algún objeto de la página llamante (incluso su propio objeto window).

En la página llamante podrías hacer:
var valorRetorno = showModalDialog("pagina.html",window,opciones);
Luego, en pagina.html puedes usar dialogArguments para referirte al objeto recibido. En este caso, podrías hacer algo como:
var ventanaLlamante = dialogArguments;
// unCampo es un campo de la ventana llamante:
ventanaLlamante.document.getElementById("unCampo").value = "cambiado";
// miFuncion es una función de la ventana llamante:
ventanaLlamante.miFuncion("hola");

Por último una recomendación:
showModalDialog (y showModelessDialog) no son objetos estándar y sólo están soportados en Iexplorer. Personalmente no te recomiendo usarlo salvo que no quieras que tu aplicación funcione en otra cosa que no sea Iexplore. Además, un diálogo modal no siempre es lo más adecuado de cara al usuario. Piénsa bien si realmente necesitas que sea modal y aunque realmente lo necesites, piensa que hay otras alternativas que pueden lograr el mismo objetivo (e.g. mira los ejemplos que hay en esta página: http://prototype-window.xilinus.com/samples.html donde dice click here)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error window.opener.parent.location

Publicado por David (2 intervenciones) el 02/03/2007 13:04:02
Claro, conciso y con ejemplos... muchas gracias Gonzalo.

Ya me funciona perfectamente.

Al ser una aplicación interna en realidad no hay problema por lo del Internet explorer pero voy a investigar los ejemplos que me envias que me parecen muy interesantes.

Otra vez mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar