Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] ¿Cómo escribir código javascript dentro de una nueva ventana creada con javascript??

Estas en el tema de ¿Cómo escribir código javascript dentro de una nueva ventana creada con javascript?? en el foro de Javascript en Foros del Web. Estoy creando un sitio que se vuelve cada vez más complejo y ahora me encuentro con esta bronca. En el documento A.html tengo el siguiente ...
  #1 (permalink)  
Antiguo 16/04/2013, 12:16
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Pregunta ¿Cómo escribir código javascript dentro de una nueva ventana creada con javascript??

Estoy creando un sitio que se vuelve cada vez más complejo y ahora me encuentro con esta bronca.
En el documento A.html tengo el siguiente HTML:
Código HTML:
<input type="button" value="Abrir nueva ventana!" onclick="abrirVentana()" /> 
Cuando se le da clic a este botón se ejecuta la siguiente función javascript que abre una nueva ventana:

Código Javascript:
Ver original
  1. function abrirVentana()
  2.     {
  3.         var ventana = window.open('', 'ventana', 'width=640, height=480');
  4.         ventana.document.write('<head><title>Título nueva ventana</title></head>');
  5.         ventana.document.write('<body>');
  6.         ventana.document.write('<div id="contenedor">');
  7.         ventana.document.write('<input type="button" value="Cerrar la nueva ventana" onclick="cerrarNuevaVentana()" />');
  8.         ventana.document.write('</div>');
  9.         ventana.document.write('</body>');
  10.     }

Lo que quiero hacer es que al dar clic en el botón contenido en esta nueva ventana, se ejecute una función javascript, la que sea, no importa, por ejemplo, una que cierre esta misma ventana. Para esto, el código javascritpt anterior no me sirve, porque sólo crea la nueva ventana, y ésta no tiene nada, excepto un botón miserable que no va a ejecutar nada porque dentro de esa nueva ventana no hay código javascript qué ejecutar.
Se me ocurrió que puedo escribir código javascript dentro de esa nueva ventana empleando el mismo document.write al momento de crear esa nueva ventana. Entonces, modifico el código javascript anterior de esta manera:

Código Javascript:
Ver original
  1. function cerrarNuevaVentana()
  2.     {
  3.         var ventana = window.open('', 'ventana', 'width=640, height=480');
  4.         ventana.document.write('<head><title>Título de nueva ventana</title>');
  5.         ventana.document.write('<script type="text/javascript">');
  6.        ventana.document.write('function cerrarNuevaVentana()');
  7.             ventana.document.write('{');
  8.             ventana.document.write('Aquí el código de la función');
  9.             ventana.document.write('}');
  10.             ventana.document.write('</script>');
  11.         ventana.document.write('</head>');             
  12.     ventana.document.write('<body>');
  13.         ventana.document.write('<div id="contenedor">Contenido del div contenedor</div>');
  14.     ventana.document.write('<input type="button" value="Quitar div contenedor!" onclick="borrarContenidoDeNuevaVentana()" />');
  15.         ventana.document.write('</body>');
  16.     }

Pero no funciona!
Cuando ejecuto el archivo A.html, el cual contiene la función abrirVentana(), en pantalla aparece parte del código javascript. Lo que indica que no es posible escribir código javascript dentro de document.write.
¿Cómo #$%&#$ le hago entonces para que la nueva ventana ejecute una función cualquiera?
  #2 (permalink)  
Antiguo 16/04/2013, 12:32
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Si el script está en un archivo aparte probablemente podrás.

De todos modos, puedes hacerlo más sencillo:
Código Javascript:
Ver original
  1. function cerrarNuevaVentana(obj)
  2. {
  3.     obj.close();
  4. }
  5.  
  6. function abrirVentana()
  7.     {
  8.         var ventana = window.open('', 'ventana', 'width=640, height=480');
  9.         ventana.document.write('<head><title>Título nueva ventana</title></head>');
  10.         ventana.document.write('<body>');
  11.         ventana.document.write('<div id="contenedor">');
  12.         ventana.document.write('<input type="button" value="Cerrar la nueva ventana" onclick="opener.cerrarNuevaVentana(window)" />');
  13.         ventana.document.write('</div>');
  14.         ventana.document.write('</body>');
  15.     }
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 16/04/2013, 12:35
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

aunque considero que no es la mejor forma, si se puede, el detalle es que tienes que escapar las comillas, porque evidentemente al escribir código js con js el parser se confunde.

es más, lo mejor es concatenar todo el código js en una variable, y volcarlo todo de una vez con write, es solo saber manejar la salida de los datos.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #4 (permalink)  
Antiguo 16/04/2013, 12:53
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Cita:
Iniciado por David Ver Mensaje
Si el script está en un archivo aparte probablemente podrás.

De todos modos, puedes hacerlo más sencillo:
[HIGHLIGHT="Javascript"]
function cerrarNuevaVentana(obj)
{
obj.close();
}
...
¿Me estás diciendo que la nueva ventana sí reconoce las funciones declaradas en el documento principal , y que por esto mismo no es necesario escribir funciones en la nueva ventana? Ahorita mismo lo intento, regreso y comento!
  #5 (permalink)  
Antiguo 16/04/2013, 13:26
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Sí, con el detalle de que para llamar a la función tienes que hacerlo de la forma opener.nombreFuncion() ya que opener hace referencia a la ventana que abrió el popup.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 16/04/2013, 14:31
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Cita:
Iniciado por David Ver Mensaje
Sí, con el detalle de que para llamar a la función tienes que hacerlo de la forma opener.nombreFuncion() ya que opener hace referencia a la ventana que abrió el popup.
Vaya, carajo! Cuando me salió el problema pensé en llamar una función en A.html desde la nueva ventana, pero dije: "No creo que funcione, después de todo, es una nueva ventana y no hay sesión abierta".

Como sea, creo que lo más sencillo y recomendable es hacer lo que mencionaste hace rato: crear un archivo funciones.js y allí meter todas las funciones, después en la nueva ventana llamar a funciones.js con un include y listo (espero que sea tan fácil!).

Desgraciadamente, ya no puedo dejar de pensar en el ejemplo que pusiste con el OPENER, el problema es que no pude encontrarle la forma para que funcione con otras funciones. Ya ejecuté tu código y funciona a la perfección con la función cerrarVentana. He intentado llamar otras funciones, pero ya no funciona porque las intrucciones de estas otras funciones son muy distintas.

Función cerrar ventana automáticamente:
Código Javascript:
Ver original
  1. function cerrarVentanaAuto()
  2.   {
  3.       setTimeout("window.close()", 3000);
  4.   }

y función eliminar el único div de la nueva ventana:
Código Javascript:
Ver original
  1. function borrar()
  2.   {
  3.         var hijo = document.getElementById("contenedor");
  4.         var padre = hijo.parentNode;
  5.         var removerHijo = padre.removeChild(hijo);
  6.   }

Juro por mi madre que ya le moví para ver si jalan estas funciones en la nueva ventana, poniendo y quitando tu variable OBJ y el OPENER, pero nada de nada.

Imagino que sabiendo cómo hacer que sirvan estas funciones, podré arreglarmelas después con otras.

Gracias David.
  #7 (permalink)  
Antiguo 16/04/2013, 14:47
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Verás que en ese contexto document se refiere al documento en la ventana principal; puedes usar obj.document si pasas como parámetro la ventana abierta como en el ejemplo.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 16/04/2013, 15:52
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Cita:
Iniciado por maycolalvarez Ver Mensaje
aunque considero que no es la mejor forma, si se puede, el detalle es que tienes que escapar las comillas, porque evidentemente al escribir código js con js el parser se confunde.

es más, lo mejor es concatenar todo el código js en una variable, y volcarlo todo de una vez con write, es solo saber manejar la salida de los datos.

Tampoco resulta la forma como dices MAY, ese Maaaay!
1. Metí todo el código javascript tal cual en una variable y nada.
2. Metí todo el código javascript en una variable y escapé casi cada caracter con &..., y nada.
3. Puse un input text de tal modo que el value fuera el código javascript, y después recoger este value en una variable y así meterlo en la nueva ventana y nada. Así:
Código Javascript:
Ver original
  1. function abrirVentana()
  2.     {
  3.         var ventana = window.open('', 'ventana', 'width=640, height=480');
  4.         ventana.document.write('<head><title>Título nueva ventana</title>' + codigo + '</head>');
  5.         ventana.document.write('<body>');
  6.         ventana.document.write('<div id="contenedor">');
  7.         ventana.document.write('<input type="button" value="Cerrar la nueva ventana" onclick="opener.cerrarNuevaVentana(window)" />');
  8.         ventana.document.write('</div>');
  9.         ventana.document.write('</body>');
  10.     }

En este caso, en la nueva ventana se despliega en pantalla la palabra UNDEFINED. Supongo que aparece esto porque el intérprete no sabe qué clase de contenido tiene la variable CODIGO, si es de tipo numérico, booleano... No se por qué dice que la variable es indefinida si la variable se decalra con comillas, lo que implica que es una variable de cadena. Bueno, como sea, no funciona!
Ayuda!
David respondió satisfactoriamente a mi pregunta inicial.
El problema ahora es más general, cómo llamar cualquier función desde una nueva ventana! Ya hice lo que comenta el deivid, crear un archivo funciones.js y poner allí todas las funciones, después llamarlas desde la ventana pero tampoco jala.
  #9 (permalink)  
Antiguo 16/04/2013, 16:10
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Si definitivamente quieres hacerlo de esa manera en lugar de usar las funciones de la ventana principal, solo tienes que evitar colocar directamente la etiqueta <script> para no confundir al parser:
Código Javascript:
Ver original
  1. ventana.document.write('<scr' + 'ipt type="text/javascript">alert("Hello");</scr' + 'ipt>');
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #10 (permalink)  
Antiguo 16/04/2013, 17:18
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
Sonrisa Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Cita:
Iniciado por David Ver Mensaje
Si definitivamente quieres hacerlo de esa manera en lugar de usar las funciones de la ventana principal, solo tienes que evitar colocar directamente la etiqueta <script> para no confundir al parser:
Código Javascript:
Ver original
  1. ventana.document.write('<scr' + 'ipt type="text/javascript">alert("Hello");</scr' + 'ipt>');
Sé que soy una lata y que esto es cansado, pero no sale!
Bueno, sí sirve el código que dices, David, sacar el alert de esa forma. Perfecto .
Pero si pones una función, entonces no funciona. Por ejemplo:
Código Javascript:
Ver original
  1. ventana.document.write('<scr' + 'ipt type="text/javascript"> function cerrarVentanaAuto() {setTimeout("window.close()", 1000);} </scr' + 'ipt>');

Por otro lado, no es que quiera empecinarme en llamar una función de esta forma (metiendo el código dentro de document.write). De hecho, cualquier forma es bienvenida, pero que sirva! Inicialmente tú pusiste un código (con la var OBJ y el OPENER) que ejecutó perfectamente una función. Y eso es lo que quiero, el problema es que no sé cómo adecuar ese OBJ y OPENER para ejecutar otras funciones (que ya puse más arriba, las de cerrarVentanaAuto y borrar)

Porque no es tan sencillo como poner opener.nombreFuncion() dentro de un onload u onclick. Ya lo hice así y no jala (excepto en el ejemplo que pusiste de cerrar ventana haciendo clic en un botón).

Última edición por berkeleyPunk; 16/04/2013 a las 17:25
  #11 (permalink)  
Antiguo 16/04/2013, 20:19
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Tenés muchas posibilidades. Lo primero que te recomiendo, e que para generar el código javascript utilices esta herramienta

http://foros.emprear.com/javascript/...s/html2js.html

Aqui un ejemplo
la ventana padre
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es-ar">
  3. <meta charset="utf-8" />
  4. <title>Generar ventana javascript</title>
  5. <script type="text/javascript">
  6. //<![CDATA[
  7. var nventana= null;
  8. function nvf(){
  9. var winleft = (screen.width-600)/2;
  10. var wintop = (screen.height-250)/2;
  11. nventana = window.open('','nombreVentana','toolbar=no,location=no,top='+wintop+',left='+winleft+',scrollbars=no,status=no,width=700,height=450');
  12. var strVar="";
  13. strVar += "<!DOCTYPE html>";
  14. strVar += "<html lang=\"es-ar\">";
  15. strVar += "<head>";
  16. strVar += "<meta charset=\"utf-8\" \/>";
  17. strVar += "<title>NuevaVentana<\/title>";
  18. strVar += "<link rel=\"stylesheet\" type=\"text\/css\" href=\"estilos.css\" media=\"screen\" \/>";
  19. strVar += "<style type=\"text\/css\">";
  20. strVar += ".verde{";
  21. strVar += "background:green;";
  22. strVar += "}";
  23. strVar += "<\/style>";
  24. strVar += "<script type=\"text\/javascript\">";
  25. strVar += "function cambiarColor(){";
  26. strVar += "document.getElementById(\"roja\").style.background = \"blue\";";
  27. strVar += "}";
  28. strVar += "<\/script>";
  29. strVar += "<script type=\"text\/javascript\" src=\"fncs.js\"><\/script>";
  30. strVar += "<\/head>";
  31. strVar += "<body>";
  32. strVar += "<div id=\"contenedor\">";
  33. strVar += "<input type=\"button\" value=\"Cerrar la nueva ventana\" onclick=\"self.close();\" \/><br \/>";
  34. strVar += "<input type=\"button\" value=\"Cambiar Roja por Azul\" onclick=\"cambiarColor();\" \/><br \/>";
  35. strVar += "<input type=\"button\" value=\"Cambiar fondo del opener a lime con una función definida en el mismo\" onclick=\"opener.cambiaFondo();\" \/><br \/>";
  36. strVar += "<input type=\"button\" value=\"Poner un nombre en en el campo de texto inferior utilizando una función en un archivo externo (fncs.js)\" onclick=\"cambiaNombre();\" \/><br \/>";
  37. strVar += "<\/div>";
  38. strVar += "<div class=\"verde\">verde<\/div>";
  39. strVar += "<div id=\"roja\">roja<\/div>";
  40. strVar += "Nombre: <input type=\"text\" value=\"\" id=\"nombre\" \/><br \/>";
  41. strVar += "Número: <input type=\"text\" value=\"\" id=\"numero\" \/>";
  42. strVar += "<\/body>";
  43. strVar += "<\/html>";
  44. nventana.document.write(strVar);
  45. }
  46.  
  47. function cambiaFondo(){
  48. document.body.style.background = "lime";
  49. }
  50. function valor_a_hija(n){
  51. if(parseInt(navigator.appVersion) >= 4){nventana.window.focus();}
  52. nventana.document.getElementById('numero').value = n;
  53. }
  54.  
  55. //]]>
  56. </head>
  57. <button onclick="nvf();">Generar nueva ventana</button><br />
  58. <button onclick="valor_a_hija(25);">Pasar número a hija (presionar primero el botón anterior para generar la ventana</button><br />
  59. <button onclick="nvf();setTimeout('valor_a_hija(50)',5000);">Crear ventana hija y pasarle un número (cerrar la nueva ventana si está abierta),<br />
  60. utilizamos setTimeuot para pasar el valor para dar tiempo a que se genere la ventana</button>
  61. </body>
  62. </html>

el css externo llamado en la ventana hija
estilos.css
Código CSS:
Ver original
  1. #roja{
  2. background: red;
  3. }

el js externo llamado en la ventana hija
fncs.js
Código Javascript:
Ver original
  1. function cambiaNombre(){
  2. document.getElementById("nombre").value = "Emprear";
  3. }

Demo funcionando
http://foros.emprear.com/javascript/...r_ventana.html

Esto sería lo básico, hay muchas otras variantes.
Es importante que el html con el que vas a crear la nueva ventana esté bien hecho,
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #12 (permalink)  
Antiguo 17/04/2013, 10:54
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 9 meses
Puntos: 22
De acuerdo Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

Cita:
Iniciado por emprear Ver Mensaje
Tenés muchas posibilidades. Lo primero que te recomiendo, e que para generar el código javascript utilices esta herramienta

[url]http://foros.emprear.com/javascript/generador_html_js/html2js.html[/url]
...
...
...
Una vez más, el Maestro Emprear tenía que resolver uno de mis problemas con javascript. Qué pasó, cómo estás compañero!

Estuve revisando el código que pones aquí arriba, y vi que en el fondo, toda la bronca nace al no escapar comillas, como decía el may (maycolalvarez). Pero no sólo las comillas, también las diagonales. Y con eso, el parser ya no se confunde con dónde empieza y dónde acaba el código de la función de la ventana padre...

El ejemplo que pones es amplio, y estudiándolo bien, permite aprender cómo interactúan las ventanas padre e hija.

Aprendí de tu código y ahora sí puedo ejecutar la función que yo quería que se ejecutara en la ventana hija, a saber, una función que contuviera un setTimeout:

Código HTML:
Ver original
  1. <input type="button" value="Abrir nueva ventana!" onclick="abrirVentana()" />

Y
Código Javascript:
Ver original
  1. function abrirVentana()
  2.     {
  3.         var ventana = window.open("", "ventana1", "width=300, height=200, scrollbars=no");
  4.         var strVar  = "";
  5.        
  6.         strVar = strVar + "<head>";
  7.         strVar = strVar + "<title>Ésta es una nueva ventana<\/title>";
  8.         strVar = strVar + "<script type=\"text\/javascript\">";
  9.         strVar = strVar + "function cerrarVentana()";
  10.         strVar = strVar + "{";
  11.         strVar = strVar + "window.close()";
  12.         strVar = strVar + "}";
  13.         strVar = strVar + "function cerrarVentanaAuto()";
  14.         strVar = strVar + "{";
  15.         strVar = strVar + "setTimeout(\"window.close()\", 3000)";
  16.         strVar = strVar + "}";
  17.         strVar = strVar + "<\/script>";
  18.         strVar = strVar + "<\/head>";
  19.         strVar = strVar + "<body onload=\"cerrarVentanaAuto()\">";
  20.         strVar = strVar + "<input type=\"button\" value=\"cerrar ventana\" onclick=\"cerrarVentana()\" />";
  21.         strVar = strVar + "<input type=\"button\" value=\"cerrar ventana después de 3 segs\" onclick=\"cerrarVentanaAuto()\" />";
  22.         strVar = strVar + "<\/body>";
  23.        
  24.         ventana.document.write(strVar);
  25.     }

Dos cosas más y doy por solucionado este post, que de seguro le servirá a mucha gente.

1. En la ventana hija, si le doy clic al botón "cerrar ventana después de 3 segs", se ejecuta la función pertinente a la perfección. Pero si hago que se ejecute dicha función al cargarse esta ventana nueva, con el onload, no funciona. ¿Por qué?
2. Más exactamente, cómo funciona la herramienta que pones en el enlace http://foros.emprear.com/javascript/...s/html2js.html ?


.

Última edición por berkeleyPunk; 17/04/2013 a las 11:04
  #13 (permalink)  
Antiguo 17/04/2013, 15:06
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo escribir código javascript dentro de una nueva ventana creada con ja

La herramienta simplemente escapa los caracteres reservados. El original no es mío, solo le adapté el tema de la variable. Y siempre es recomendable que escribas tu html y el js contenido de manera ordenada
Con respecto a lo del cierre onload, no lo sé con seguridad, pero evidentemente está relacionado de la manera que cada navegador trata el objeto window.
Fijate por ejemplo. en IE no se cierra, pero si le das a recargar la página, si, en FF no se cierra, pero si hacés click derecho ni siquiera te muestra la opción recargar.
De todas formas encontré una forma alternativa para el cierre automático onload con setTimeout, y es la siguiente, antes del cierre del body (funciona en todos los que probé, FF,IE,Chrome)

Código:
strVar = strVar + "<script>setTimeout(\"window.close()\", 5000);<\/script><\/body></html>";
tampoco hace falta encerrarlo en una función, en la demo anterior agregué un botón extra para que verifiques, le doy un poco más de margen para dar tiempo a que se prueben los otros botones.
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: html+javascript
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:33.