Foros del Web » Programando para Internet » Javascript »

Problemas con scripts dinámicos

Estas en el tema de Problemas con scripts dinámicos en el foro de Javascript en Foros del Web. Un saludo a todos los foreros y paso al tema en cuestión. Necesito cargar scripts dinamicamente en aras de ahorrar recursos innecesarios en la carga ...
  #1 (permalink)  
Antiguo 30/05/2011, 07:16
 
Fecha de Ingreso: febrero-2010
Ubicación: Bizkaia
Mensajes: 22
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta Problemas con scripts dinámicos

Un saludo a todos los foreros y paso al tema en cuestión.

Necesito cargar scripts dinamicamente en aras de ahorrar recursos innecesarios en la carga de datos que quizás no se utilicen.

Hasta ahora cargaba los datos en objetos JSON en en HEAD de la página y todo funciona estupendamente, he pensado que como el tema que trato va de resultados futbolísticos y los ejercicios anteriores no son importantes a menos que se quiera conocer algún dato, esos datos los puedo cargar bajo demanda.
He dividido los objetos en varios archiovos .js para cargarlos cuando se necesiten, el problema que tengo es el mismo que en este [URL="http://www.forosdelweb.com/f13/cargar-scripts-dinamicamente-622349/"]post[/URL] antiguo.

La función que utilizo es esta:

Código:
function cargaSRC (src,callback) {

  var scripts = document.getElementsByTagName('script');
  var cargado = false;
    for (var i = 0, script; script = scripts[i]; i++) {
     if (script.src == src) {
        cargado = true;
        break;
      }
    }
    
  if (!cargado) { 
      var elemento = document.createElement('script');
      elemento.setAttribute('type', 'text/javascript');
      
  if (elemento.readyState){ // Internet Explorer
    elemento.onreadystatechange = function(){
      if (elemento.readyState == "loaded" || elemento.readyState == "complete") {
        elemento.onreadystatechange = null;
        callback ();
      }
    };
  } else { // Otros navegadores
    elemento.onload = function(){
    callback();
  };
}      
      
      elemento.setAttribute('src', src);
      document.getElementsByTagName("head")[0].appendChild(elemento);
  }
}
Como tengo funciones dependientes que llaman a esos datos me da error la primera vez que la utilizo (tengo try catch en las funciones), en cambio la segunda vez es correcta.

El caso es que si anulo callback y coloco la función de la siguiente manera funciona correctamente.

Código:
    };
  } else { // Otros navegadores
    elemento.onload = function(){
    MIFUNCION (Param1,Param2,Param3);
  };
¿ A que se puede deber?

de esta forma llamo a la función así: (la que funciona)

cargaSR (el archivo .js);

de la otra forma llamo a la función así: (funciona la segunda vez)

cargaSRC (el archivo .js, MIFUNCION (Param1,Param2,Param3));

Espero haberme explicado correctamente, un saludo y gracias.

PD: Con la función dynamicLoader de Caerolus me pasa exactamente lo mismo, sólo que esta vez funciona a la segunda de las dos formas.
  #2 (permalink)  
Antiguo 30/05/2011, 08:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problemas con scripts dinámicos

Código Javascript:
Ver original
  1. cargaSRC (el archivo .js, MIFUNCION (Param1,Param2,Param3));

En vez de pasar una función como callback, estás pasando el resultado de ejecutar esa función.
Es decir, a menos que MIFUNCION devuelva un objeto de función, este código intenta ejecutar algo que no es ejecutable. Si tu función es algo como esto:
Código Javascript:
Ver original
  1. function MIFUNCION(....) { ..... return 1; }
la llamada a callback termina siendo "1()" (llamar a un entero como función) lo cual es claramente incorrecto.

Para que funcione como querés, tenés que "envolver" la llamada en una función, tal y como estás haciendo en el segundo bloque de código que pusiste.

Para saber por qué funciona la segunda vez, hay que ver qué es lo que hace MIFUNCION

La solución simple es escribir:
Código Javascript:
Ver original
  1. cargaSRC('archivo.js', function() { MIFUNCION(...); });

Saludos.

Última edición por AlvaroG; 30/05/2011 a las 11:06 Razón: corregir detalle
  #3 (permalink)  
Antiguo 30/05/2011, 08:36
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Problemas con scripts dinámicos

el problema es callback() no es una función. prueba así
Cita:
cargaSRC ('x.js', function() {fnc()});
uppssss, perdona AlvaroG
  #4 (permalink)  
Antiguo 30/05/2011, 11:07
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problemas con scripts dinámicos

jeje choque frontal, no problemo
  #5 (permalink)  
Antiguo 30/05/2011, 11:49
 
Fecha de Ingreso: febrero-2010
Ubicación: Bizkaia
Mensajes: 22
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Problemas con scripts dinámicos

Muchas gracias IsaBelM y AlvaroG por vuestra pronta y acertada respuesta, si era eso, ahora funciona perfecto.
Tambien quisiera conocer, si existe la forma de saber si la carga del script es fallida desde un servidor, para por ejemplo cargarlo desde otro, un evento tipo onerror.

Muchas gracias y un saludo.
  #6 (permalink)  
Antiguo 30/05/2011, 14:19
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Problemas con scripts dinámicos

prueba a usar el operador typeof(). pasale un tercer parámetro (nombre de la función)
Cita:
elemento.onload = function(){
if(typeof(window[foo])=='function') {callback();} else {alert('función no cargada')}
};
con esto sabrás si existe la función o no
  #7 (permalink)  
Antiguo 30/05/2011, 18:49
 
Fecha de Ingreso: febrero-2010
Ubicación: Bizkaia
Mensajes: 22
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Problemas con scripts dinámicos

Cita:
Iniciado por IsaBelM Ver Mensaje
prueba a usar el operador typeof(). pasale un tercer parámetro (nombre de la función)

Código:
elemento.onload = function(){
if(typeof(window[foo])=='function') {callback();} else {alert('función no cargada')}
};
con esto sabrás si existe la función o no
Entiendo que lo quieres decir es que compruebe si está cargada una función alojada en el script que quiero inluir dinamicamente y que foo tengo que sustituirlo por el nombre de la función esperada, pero como ya he citado anteriormente yo en los scripts sólo incluyo objetos JSON (datos), las funciones las cargo en el head y he probado a sustituir ...

elemento.onload = function(){
if(typeof(window[OBJETO JSON])=='object') {callback();} else {alert('función no cargada')}
};

.... y no funciona, supongo que el fallo será por window.

Gracias por la ayuda y un saludo.

Etiquetas: scripts
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 20:41.