Foros del Web » Programando para Internet » Javascript »

Agregar Librerías de Javascript dinámicamente

Estas en el tema de Agregar Librerías de Javascript dinámicamente en el foro de Javascript en Foros del Web. Buenas a todos. Advierto, de antemano, que soy un iniciado en este mundo. Escucharé cuanto digais y lo agradeceré. He estado durante un par de ...
  #1 (permalink)  
Antiguo 23/11/2011, 20:18
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 6 meses
Puntos: 14
Agregar Librerías de Javascript dinámicamente

Buenas a todos.

Advierto, de antemano, que soy un iniciado en este mundo. Escucharé cuanto digais y lo agradeceré.

He estado durante un par de horas buscando información acerca de lo que el título indica. Básicamente, tengo un sitio web con diferentes librerias y módulos, por lo que es necesario una función con la que se puedan cargar librerías, comprobando previamente si ya han sido cargadas.

Para esto, pensé que debía de haber alguna forma de recurrir al Header y obtener el listado de librerias cargadas, pero no he encontrado nada a este respecto.

Finalmente, decidí hacer la función por mí mismo. Es esto:

Código:
<script type="text/javascript">
var listaLibrerias = new Array ();

function cargaLibreria (nombre) {
	var cargadaConAnterioridad = false;
	var txt;
	
	for (i=0;i<listaLibrerias.length;i++){
		if(listaLibrerias[i] == nombre) {
			txt = "cargada anteriormente la libreria" + nombre + "<br />";
			cargadaConAnterioridad = true;
		}		
	}
	
	if (cargadaConAnterioridad == false) {
		listaLibrerias[i] = nombre;
		
		var cabecera = document.getElementsByTagName("head")[0];
		var nuevoScript = document.createElement('script');
		nuevoScript.type = 'text/javascript';
		nuevoScript.src = nombre;
		
		cabecera.appendChild(nuevoScript);
		txt = "Se ha cargado la libreria" + nombre + "<br />";
	}
	
	document.getElementById("info").innerHTML= document.getElementById("info").innerHTML + txt;
}
</script>
Me gustaría saber vuestra opinión, ya que en páginas como:
http://www.ejeliot.com/blog/109
http://www.cristalab.com/tutoriales/carga-dinamica-de-librerias-javascript-con-librarymanager-c66186l/

... presentan soluciones más complejas, a mi parecer.

Gracias por todo, y un saludo.
  #2 (permalink)  
Antiguo 24/11/2011, 06:38
Avatar de ryugen
Colaborador
 
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Santa Fe
Mensajes: 350
Antigüedad: 16 años, 3 meses
Puntos: 187
Respuesta: Agregar Librerías de Javascript dinámicamente

yo suelo usar esta función, que permite agregar una funcion cuando se cargue correctamente
Código Javascript:
Ver original
  1. function loadScript(url, callback) {
  2.     var script = document.createElement("script")
  3.     script.type = "text/javascript";
  4.     if (script.readyState) { //IE
  5.         script.onreadystatechange = function () {
  6.             if (script.readyState == "loaded" || script.readyState == "complete") {
  7.                 script.onreadystatechange = null;
  8.                 callback();
  9.             }
  10.         };
  11.     } else { //Others
  12.         script.onload = function () {
  13.             callback();
  14.         };
  15.     }
  16.     script.src = url;
  17.     document.getElementsByTagName("head")[0].appendChild(script);
  18. }
  #3 (permalink)  
Antiguo 26/11/2011, 15:44
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 6 meses
Puntos: 14
Respuesta: Agregar Librerías de Javascript dinámicamente

Cita:
Iniciado por ryugen Ver Mensaje
yo suelo usar esta función, que permite agregar una funcion cuando se cargue correctamente
Código Javascript:
Ver original
  1. function loadScript(url, callback) {
  2.     var script = document.createElement("script")
  3.     script.type = "text/javascript";
  4.     if (script.readyState) { //IE
  5.         script.onreadystatechange = function () {
  6.             if (script.readyState == "loaded" || script.readyState == "complete") {
  7.                 script.onreadystatechange = null;
  8.                 callback();
  9.             }
  10.         };
  11.     } else { //Others
  12.         script.onload = function () {
  13.             callback();
  14.         };
  15.     }
  16.     script.src = url;
  17.     document.getElementsByTagName("head")[0].appendChild(script);
  18. }

¿Pero esa función solventa el problema de librerias cargadas repetidamente?
No veo en el código que me dices control de las librerias ya cargadas.
  #4 (permalink)  
Antiguo 26/11/2011, 16:37
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: Agregar Librerías de Javascript dinámicamente

Existen varios loaders asíncronos de scripts, por ejemplo yepnope, que es bastante rápido y ligero.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #5 (permalink)  
Antiguo 28/11/2011, 20:01
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 6 meses
Puntos: 14
Respuesta: Agregar Librerías de Javascript dinámicamente

Trabajando con esto y utilizando una función como la comentada por ryugen, cargo librerias JS.

El problema con el que me encuentro ahora es que...
Al utilizar una función dentro de la libreria cargada con otra función, no se ejecuta.

Tras indagar, he visto que lo que sucede es que el navegador carga las librerias primero, y luego ejecuta funciones. Por lo tanto, si cargo una libreria con una funcion esta se carga después. Y por tanto si quiero acceder a una función dentro de una de esas librerias, me aparecerá un error.

Por eso es necesario hacer los "callback", pero la información que he encontrado es confusa.

¿Si quisiera utilizar la función "BLABLA" dentro de una librería que cargo con una función, como la llamaría? o dicho de otra forma como implemento el callback para esas funciones.

También he pensado que podría utilizarse un timeOut para que el navegador esperara antes de llamar a esa función, pero no sé si es incorrecto, ya que en el momento en que lee el código pese a que tiene que esperar, al leer el nombre de la función no sabe qué es.

En fin, gracias y un saludo.
  #6 (permalink)  
Antiguo 29/11/2011, 00:26
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: Agregar Librerías de Javascript dinámicamente

Tienes que esperar el evento onload del script, si no el contenido todavía no habrá sido cargado.
Saludos.
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #7 (permalink)  
Antiguo 29/11/2011, 06:56
Avatar de ryugen
Colaborador
 
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Santa Fe
Mensajes: 350
Antigüedad: 16 años, 3 meses
Puntos: 187
Respuesta: Agregar Librerías de Javascript dinámicamente

Si en lugar de utilizar el evento document ready para utilzar tus funciones ahora tienes que manejarte en los script loads o los callbacks del loader de script.

para el tema de librerias ya cargadas, yo utlizaría metodos nativos para comprobar si se cargaron.

Por ejemplo en jquery:
Código Javascript:
Ver original
  1. if(jQuery){
  2.      //jQuery ha sido correctamente cargada
  3.      if (jQuery.ui) {
  4.              //jQuery UI cargada correctamente
  5.      }
  6. }
  #8 (permalink)  
Antiguo 30/11/2011, 05:58
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 6 meses
Puntos: 14
Respuesta: Agregar Librerías de Javascript dinámicamente

Gracias por ayudarme, señores.

Lo del Onload plantea un problema, y es que si la página es producto de un conjunto de archivos, que se combinan según las opciones del usuario, puede darse el caso de varios Onloads en la página y según tengo entendido sólo se carga un Onload (el último que el navegador encuentra).

En caso de que sepamos qué funciones poner en el Onload no hay problema, pero si esto depende de las opciones habría que buscar otra forma, ¿cierto?

Respecto las librerías ya cargadas, Ryugen, no estoy seguro de entenderte (aunque creo que sé por donde vas).

Por ejemplo, imaginemos que tengo la libreria "soyUnaLibreria.js". En esta libreria tengo el código:

Código:
//Codigo de la libreria soyUnaLibreria.js

function superF () {
 return "Esto es lo que devuelve la superF";
}
¿Para saber si se ha cargado, deberia hacer...

Código:
if (superF){
 alert("Se ha cargado superF!!!");
} else {
 alert("Oh no, no se ha cargado superF");
}
?

Gracias de nuevo.
  #9 (permalink)  
Antiguo 30/11/2011, 06:55
Avatar de ryugen
Colaborador
 
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Santa Fe
Mensajes: 350
Antigüedad: 16 años, 3 meses
Puntos: 187
Respuesta: Agregar Librerías de Javascript dinámicamente

En primer medida, si, podrías chequear la existencia de una libreria asi.

Sobre el tema de onload yo me estoy refiriendo al onload de los SCRIPTS y no del DOCUMENT, asi que cada uno va a tener el suyo.

Por otra parte framework como jquery permiten mas de una funcion bindeada al elemento onload y se ejecutan en orden.

Pero suponiendo que no uses jquery y aun asi quieres lograr eso, yo lo que haria es definir un arreglo GLOBAL al cual le voy agregando funciones
Código Javascript:
Ver original
  1. var arrFn = [];
  2. //.. mas adelante
  3. function funcionAgregada1() { };
  4. arrFn[arrFn.length] = funcionAgregada1;
  5.  
  6. //.. mas adelante
  7. function funcionAgregada2() { };
  8. arrFn[arrFn.length] = funcionAgregada2;
  9.  
  10. //finalmente
  11. document.onload = function(){
  12.             for ( var i = 0; i < arrFn.length; i = i + 1){
  13.                         arrFn[i]();
  14.             }
  15. }
  #10 (permalink)  
Antiguo 30/11/2011, 09:02
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 6 meses
Puntos: 310
Respuesta: Agregar Librerías de Javascript dinámicamente

Cita:
Iniciado por ryugen
Por otra parte framework como jquery permiten mas de una funcion bindeada al elemento onload y se ejecutan en orden.
Por otra parte framework como jquery el DOM permite más de una función bindeada al elemento onload y se ejecutan en orden.
jQuery lo puede hacer porque con DOM se puede hacer, no es un invento de jQuery.
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #11 (permalink)  
Antiguo 30/11/2011, 09:32
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 6 meses
Puntos: 14
Respuesta: Agregar Librerías de Javascript dinámicamente

El concepto de DOM es algo a lo que todavía estoy dando forma y definición.

Cuando hablamos de bindear (enlazar) una función tras otra en el Onload supongo que os estais refiriendo a esto:


Código:
<body onload="superF_1(); superF_2()">
o bien...
Código:
<script>
window.onload="superF_1(); superF_2()";
</script>
Esto por sí sólo no solventaría el problema de tener que cargar diferentes funciones desde diferentes partes de una página, pero si hago un array como el que indicas, Ryugen, puedo añadir al final de la página un onload cargando el array si contiene información.

He usado algo de JQuery, pero todavía estoy lejos de comprender sus códigos y prefiero evitarlos en la medida de lo posible. Me gusta entender lo que hago :)

Con esto creo que puedo ir avanzando. Gracias y nos vemos :)
  #12 (permalink)  
Antiguo 30/11/2011, 10:11
Avatar de ryugen
Colaborador
 
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Santa Fe
Mensajes: 350
Antigüedad: 16 años, 3 meses
Puntos: 187
Respuesta: Agregar Librerías de Javascript dinámicamente

cronos se referia a esto para agregar más de una funcion al evento load

Código Javascript:
Ver original
  1. window.addEventListener("load",superF_1);
  2. window.addEventListener("load",superF_2);

Agregará dos funciones al evento load y las ejecutará en el orden que se agregaron

Etiquetas: html, librerías
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 15:56.