Foros del Web » Programando para Internet » Javascript »

Simulando import / include en javascript

Estas en el tema de Simulando import / include en javascript en el foro de Javascript en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 20/10/2010, 05:36
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
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.
  #2 (permalink)  
Antiguo 20/10/2010, 12:43
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Simulando import / include en javascript

Supongo que en algún lugar definís ext_name. Si es así, el alert debería ser así:
Código PHP:
alert(this['ext_name']);//con comillas 
o así:
Código PHP:
alert(this.ext_name);//con sintaxis de puntos 
  #3 (permalink)  
Antiguo 20/10/2010, 12:54
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Simulando import / include en javascript

Hola Panino!
Gracias por responder.
ext_name es el string que se recibe por parámetro. Lo pongo asi this[ext_name] para que me cree una propiedad del objeto con el nombre que le paso por parámetro, aunque no está en el alert el error.

si en la misma funcion en la que llamo a loadExtension no hago nada más antes de que acabe la ejecución del script, funciona, pero sería poco funcional o 'utilizable'.
por ejemplo si llamo a basics.console en un evento tras crearlo (document.onkeydown p. ej), el script funciona correctamente.

Habría alguna forma de detectar si se han producido cambios en el DOM tras la ejecucion e una función? o como podría hacer esto??
  #4 (permalink)  
Antiguo 20/10/2010, 13:01
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Simulando import / include en javascript

Pasa que si hacés esto, obtenés un undefined:
Código PHP:
<script type="text/javascript">
var 
basics = {
     
     
loadExtension: function(m) {
         
 
            
alert(this[m]);
            
        
     }
 }
 
basics.loadExtension('algo');
</script> 
Para que funcionara tendrías que hacerlo de otra manera, ej:
Código PHP:
<script type="text/javascript">
var 
basics = {
     
     
loadExtension: function() {
         
 
            
alert(this['m']);
            
        
     }
 }
  
basics.m='algo';
 
basics.loadExtension();
</script> 
o así:
Código PHP:
<script type="text/javascript">
var 
basics = {
     
     
loadExtension: function(m) {
             
this.m=m;
 
            
alert(this['m']);
            
        
     }
 }
 
basics.loadExtension('algo');
</script> 

Etiquetas: import, include
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:39.