Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/10/2010, 05:36
Avatar de SetheR
SetheR
 
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 13 años
Puntos: 44
Simulando import / include en javascript

Hola muy buenas.
Estoy haciendo un script que consiste en un objeto que agrego al DOM y al cual le puedo añadir "extensiones" en forma de más objetos.
Os dejo el código simplificado para que veáis a lo que me refiero.

Éste es el único script que carga el HTML al principio. Crea el objeto 'basics' con el metodo loadExtension. Este método recibe un string que será el nombre de la extensión y añade una etiqueta SCRIPT en el head con el código de dicha extensión. El método es más extenso, tiene validación de nombre etc, pero quiero que veáis el problema:

Código Javascript:
Ver original
  1. var basics = {
  2.  
  3.      loadExtension: function( ext_name ) {
  4.          if(!this[ext_name]){
  5.             var script_tag = document.createElement('script');
  6.             script_tag.type = 'text/javascript';
  7.             script_tag.src = 'js/prueba/ext/'+ext_name+'.js';
  8.             document.getElementsByTagName('head')[0].appendChild(script_tag);
  9.  
  10.             alert(this[ext_name]);
  11.             alert(this[ext_name]);
  12.            
  13.          }else {
  14.              //this.console.writeError('This extension has been already loaded!');
  15.          }
  16.      }
  17.  }
  18. window.addEventListener('load', main, false);
  19. function main(){
  20.     basics.loadExtension('console');
  21.     basics.console.writeError('hola');
  22. }

Y el código de la extensión:

Código Javascript:
Ver original
  1. basics.console = {
  2.     writeError: function( msg ) {
  3.         alert(msg);
  4.     }
  5. }

El problema viene a que me tira un error en la segunda línea del main. Lo más raro es que si pongo UN SOLO alert dentro de la función loadExtension , la aplicación funciona. Si pongo DOS, el segundo ya me alerta de que eso es un objeto (tal y como lo tengo en el código que os puse).

Si quito los alert, el error persiste, no funciona, pero cuando acaba de ejecutarse el main(), el DOM tiene cargado mi objeto basics.console.

Con lo que deduzco que alert() produce algún tipo de evento o interrupción que haga que el navegador "lea" ese archivo javascript.

¿Alguna idea de como solucionar este problema? Se me ocurrió usar una función auxiliar que haga lo mismo que alert pero sin soltar la ventanita, pero no se me ocurre como implementarlo.

También me vale alguna forma alternativa de hacer esto.

Muchas gracias por adelantado!

PD: Ya sé que no todos los navegadores soportan la carga dinámica de scripts, pero ese no es el tema.