Foros del Web » Programando para Internet » Javascript »

Funciones en archivo JavaScript añadido dinámicamente

Estas en el tema de Funciones en archivo JavaScript añadido dinámicamente en el foro de Javascript en Foros del Web. Hola a todos y todas. Me gustaría preguntarles acerca de un pequeño problema que tengo cuando añado un archivo javascript dinámicamente y quiero acceder a ...
  #1 (permalink)  
Antiguo 22/12/2012, 09:25
 
Fecha de Ingreso: mayo-2012
Ubicación: La Rioja (España)
Mensajes: 13
Antigüedad: 12 años
Puntos: 0
Funciones en archivo JavaScript añadido dinámicamente

Hola a todos y todas.
Me gustaría preguntarles acerca de un pequeño problema que tengo cuando añado un archivo javascript dinámicamente y quiero acceder a las funciones de éste después de haberlo cargado.

Voy a escribirlo en un ejemplo.

Tengo el siguiente archivo dinamicos.html:

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <meta charset="utf-8" />
  3.     <title>Scripts dinámicos</title>
  4.     <script type="text/javascript" src="prueba2.js"></script>
  5. </head>
  6.     <p>Probando los scripts dinámicos</p>
  7.     <script type="text/javascript">
  8.         loadScript("funciones.js");
  9.         diHola();
  10.     </script>
  11. </body>
  12. </html>

Tengo también un archivo .js llamado prueba2.js, que carga dinámicamente un elemento <script> que enlaza con un archivo .js externo:

prueba2.js

Código Javascript:
Ver original
  1. function loadScript(url) {
  2.     //url es la url del archivo javascript externo que se quiere cargar
  3.     var script = document.createElement("script");
  4.     script.type = "text/javascript";
  5.     script.src = url;
  6.     document.body.appendChild(script);
  7. }

Y finalmente, tengo un archivo .js llamado funciones.js en el que tengo dos funciones muy simples:

funciones.js
Código Javascript:
Ver original
  1. function diAdios() {
  2.     alert("Adiós");
  3. }
  4.  
  5. function diHola() {
  6.     alert("Hola");
  7. };

La cuestión es que yo quiero cargar el archivo funciones.js de forma dinámica llamando a loadScript("funciones.js") desde el archivo dinamicos.html.
Esto se realiza correctamente, pero cuando quiero utilizar una función del archivo funciones.js desde el archivo dinamicos.html, llamando por ejemplo a diHola(), obtengo el siguiente error: Uncaught ReferenceError: diHola is not defined.

Observando el código fuente de dinamicos.html después de insertar el script dinámicamente se puede ver como sí se ha insertado un nuevo elemento <script> que enlaza al archivo funciones.js.
El problema es que después no puedo utilizar ninguna de las funciones de este archivo .js desde el archivo html.

Si alguien entiendo lo que quiero decir agradecería alguna solución.
  #2 (permalink)  
Antiguo 22/12/2012, 11:27
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Funciones en archivo JavaScript añadido dinámicamente

Tenés que invocar la función una vez que se cargó el documento

Código Javascript:
Ver original
  1. window.onload = function(){
  2.             diHola();
  3.         }

Yo en particular, para cargar tanto js como css dinámicos (bastante común cuando cargás html que contiene javascript con ajax), utilizo esta script

Código Javascript:
Ver original
  1. var cargarObjetos="";
  2.                 function cargarRecursos(){
  3.                     if(!document.getElementById){
  4.                         return;
  5.                         }
  6.                         var i = 0;for(i=0; i<arguments.length; i++){
  7.                             var archivo=arguments[i];var archivoref="";
  8.                             if(cargarObjetos.indexOf(archivo)==-1){
  9.                                 if(archivo.indexOf(".js")!=-1){
  10.                                     archivoref=document.createElement('script');archivoref.setAttribute("type","text/javascript");
  11.                                     archivoref.setAttribute("src", archivo);
  12.                                     }else if(archivo.indexOf(".css")!=-1){
  13.                                         archivoref=document.createElement("link");
  14.                                         archivoref.setAttribute("rel", "stylesheet");
  15.                                         archivoref.setAttribute("type", "text/css");
  16.                                         archivoref.setAttribute("href", archivo);
  17.                                         }
  18.                                         }if(archivoref!=""){
  19.                                             document.getElementsByTagName("head").item(0).appendChild(archivoref);
  20.                                             cargarObjetos+=archivo+" ";
  21.                                             }
  22.                                         }
  23.                                     }

Cargándola en el header.
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 22/12/2012, 12:30
 
Fecha de Ingreso: mayo-2012
Ubicación: La Rioja (España)
Mensajes: 13
Antigüedad: 12 años
Puntos: 0
Respuesta: Funciones en archivo JavaScript añadido dinámicamente

Gracias por tu ayuda @emprear.
Efectivamente su solución de utilizar windows.onload funciona correctamente, y el script que escribió después también es muy útil para cargar dinámicamente varios archivos javascript y css al mismo tiempo.

El problema que le veo a utilizar window.onload es que, si por ejemplo mi archivo javascript añadido dinámicamente tiene 50 funciones, y quiero llamar a 15 desde mi documento html, tengo que hacer lo siguiente:

Código Javascript:
Ver original
  1. window.onload = function() {
  2. //llamada a función 1
  3. //llamada a función 2
  4. //llamada a función 3
  5. //...
  6. //llamada a función 15
  7. }

Lo que me gustaría es que, una vez cargado dinámicamente el archivo con la llamada a mi función "loadScript("funciones.js");", tendría disponibles todas las funciones de este archivo sin esperar a que se produjera el evento load de la página entera, ya que eso puede tardar bastante en algunos casos.
No sé si se puede utilizar o disparar algún otro evento para tener disponible todo el código del archivo javascript cargado dinámicamente antes de que se carguen todos los elementos de la página.

Lo que he sacado como conclusión, por si a alguien más le interesa profundizar en este tema, es lo que voy a explicar siguiendo el ejemplo que puse en mi primer post:

Si en mi documento html pongo lo siguiente:

Código HTML:
Ver original
  1. <script type="text/javascript">
  2.         loadScript("funciones.js");
  3.         diHola();
La llamada a loadScript("funciones.js"); carga dinámicamente el archivo funciones.js y añade el siguiente código al final de <body> en el documento html:

Código HTML:
Ver original
  1. <script text="text/javascript" src="funciones.js"></script>
Aunque se haya añadido lo anterior al código fuente de la página, realmente no se han cargado las funciones que pudiera tener el archivo "funciones.js", por lo que si inmediatamente después de cargar éste, quiero hacer una llamada a algunas de sus funciones, como por ejemplo a "diHola()", obtendrá un error diciendo que diHola no existe.
Mi teoría es que, el código existente en el archivo añadido dinámicamente llamado funciones.js no ha sido cargado todavía. Es como si habría que esperar un rato a que el navegador completara este proceso.
Esto se puede comprobar si en vuestro documento html poneis lo siguiente:

Código HTML:
Ver original
  1. <script type="text/javascript">
  2.         loadScript("prueba.js");
  3.         setTimeout("diHola()", 1000);

En este último caso, espero 1 segundo para ejecutar la función "diHola()" que se encuentra en el archivo funciones.js que añadí dinámicamente antes.

La cuestión es que, lo que yo hubiera esperado que se pudiera hacer al añadir dinámicamente el archivo javascript "funciones.js", es utilizar todas las funciones en él contenidas inmediatamente, sin utilizar "window.onload".
  #4 (permalink)  
Antiguo 22/12/2012, 14:26
 
Fecha de Ingreso: mayo-2012
Ubicación: La Rioja (España)
Mensajes: 13
Antigüedad: 12 años
Puntos: 0
Respuesta: Funciones en archivo JavaScript añadido dinámicamente

Por si alguien le ayuda, me ha sido útil leer [URL="http://stackoverflow.com/questions/8586446/dynamically-load-external-javascript-file-and-wait-for-it-to-load-without-usi"]un post en stackoverflow.com[/URL] que habla precisamente de esto.
De todas formas voy a seguir informándome acerca de este tema para ver si descubro la mejor solución, y así ayudo a cualquiera que tenga la mismas dudas.

Última edición por eduardobpe; 22/12/2012 a las 14:35
  #5 (permalink)  
Antiguo 22/12/2012, 15:12
Avatar de Trublux  
Fecha de Ingreso: octubre-2010
Ubicación: Madrid
Mensajes: 355
Antigüedad: 13 años, 6 meses
Puntos: 48
Respuesta: Funciones en archivo JavaScript añadido dinámicamente

Cuando se hace lo que estás haciendo el propósito es que la página no tenga que retrasarse en cargar por cargar el js. Pero si quieres que esté todo disponible desde el principio, no lo hagas así, carga todo tal cual y ya está.
__________________
eZ Publish Developer Basic Legacy
eZ Publish Developer Basics (4.4)
Alojamientos rurales en España

Etiquetas: dinamico
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 03:37.