Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema con evalScript() al intentar cargar javascript desde AJAX

Estas en el tema de Problema con evalScript() al intentar cargar javascript desde AJAX en el foro de Frameworks JS en Foros del Web. Hola. Este es mi primer mensaje en el foro y espero estar haciéndolo de la forma correcta. He estado siguiendo los HOWTO y distintos temas ...
  #1 (permalink)  
Antiguo 25/02/2009, 18:58
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Pregunta Problema con evalScript() al intentar cargar javascript desde AJAX

Hola. Este es mi primer mensaje en el foro y espero estar haciéndolo de la forma correcta. He estado siguiendo los HOWTO y distintos temas para poder ejecutar javascript de una página llamada desde otra con AJAX.

El caso es que me he encontrado en que al hacer:

Código:
var scs=pagecnx.responseText.extractScript();
document.getElementById(id).innerHTML =pagecnx.responseText;
scs.evalScript();
Firebug me muestra un error en scs.evalScript() que dice "scs undefined". El código utilizado es el mismo que habéis publicado en este foro tantas veces (ajax.js e interpretadorAjax.js).

La página html a la que llamo desde la principal utiliza la librería de NiftyCube (no sé si os sonará) para lograr el redondeado de esquinas y otros efectos para utilizar en DIVs. He puesto un alert también para ver si se ejecuta. Con IE no se ejecuta y da error "Argumento no válido", pero con Firefox llega al alert, firebug se queja del error y no termina de ejecutar la librería de Nifty. En la página principal también la utilizo y no hay ningún problema, pero la de la página llamada no funciona.

Dichos los síntomas, os dejo el código (interpretadorAjax.js no me deja publicarlo por algo de enlaces o direcciones a los "nuevos"... pero vamos, es exactamente el mismo que habéis publicado):

ajax.js
Código:
document.write("<p>Espere mientras carga la página.</p>");

function loadurl(url,id){
	var pagecnx = createXMLHttpRequest();
	pagecnx.onreadystatechange=function(){
		if (pagecnx.readyState == 4 && (pagecnx.status==200 || window.location.href.indexOf("http")==-1))
		var scs=pagecnx.responseText.extractScript();
		document.getElementById(id).innerHTML =pagecnx.responseText;//.stripScript();
		scs.evalScript(); 
			//document.getElementById(id).innerHTML=pagecnx.responseText;
	}
	pagecnx.open('GET',url,true);
	pagecnx.send(null);
}

function loadurlkey(e,url,id){ //Enlace accesible...
	tecla = (document.all) ? e.keyCode : e.which;
	if (tecla==13)
		loadurl(url,id);
}

function createXMLHttpRequest(){
	var xmlHttp=null;
	if (window.ActiveXObject) 
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	else if (window.XMLHttpRequest) 
		xmlHttp = new XMLHttpRequest();
	return xmlHttp;
}
páginal principal "index1.html" (os dejo parte...)
Código HTML:
<link rel="stylesheet" type="text/css" href="css/niftyCorners.css">
<script type="text/javascript" src="js/niftycube.js"></script>
<script type="text/javascript">
window.onload=function(){
Nifty("div#cabecera","transparent");
Nifty("div#anuncios","transparent");
//loadurl('contenido_onload.html','contenido');
}
</script>

<td width="313">
		<p><a href="javascript:loadurl('contenido_enlace.html','contenido')">Enlace_1</a></p>
</td>
<td width="1552">
   <div id="contenido">
	<noscript>JavaScript está desactivado, AJAX no podrá ser usado</noscript>
	<script type="text/javascript" src="js/interpretadorAjax.js"></script>
	<script src="js/ajax.js" type="text/javascript"></script>
   </div>
</td> 
Y la página llamada "contenido_enlace.html" (también en parte...)
Código HTML:
<div id="box">
<script type="text/javascript" src="js/niftycube.js"></script>
<script type="text/javascript">
window.onload=function(){
Nifty("div#box","big");
}
</script>
<script>alert("hola");</script>

<link href="css/niftyCorners.css" rel="stylesheet" type="text/css" />
	<h1>Nifty Corners Cube&trade;</h1>
	<p>One call. Two parameters. Three sizes.</p>
</div> 

¿Sabrían decirme qué puede estar provocando ese error y cómo podría solucionarlo?

Muchas gracias de antemano. Un saludo.

Última edición por windzefiro; 26/02/2009 a las 18:33 Razón: Correción de código
  #2 (permalink)  
Antiguo 26/02/2009, 13:37
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Pregunta Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Hola de nuevo.
He conseguido que funcione metiendo todo en un DIV y quitando el resto de código html de la página a la que llamo. Es decir, solo he quedado en la página el DIV.

Sin embargo, ésto sólo funciona en Firefox y no en el Internet Explorer del infierno. Además, en Firefox, Firebug sigue chivándose del error "scs is undefined" e IE se queja de "Argumento no válido".

Sigo esperando algún consejo a seguir.
Un saludo y gracias.
  #3 (permalink)  
Antiguo 26/02/2009, 14:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

El problema puede estar en tu responseText que tenga algún contenido invalido, si ya estas usando el firebug revisa cual es tu respuesta, ya que es probable que de ahí venga el error.

Saludos
  #4 (permalink)  
Antiguo 26/02/2009, 16:19
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Pregunta Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Jeje! Me faltaban llaves en if de la función loadurl() de ajax.js:

Código:
pagecnx.onreadystatechange=function(){
	if (pagecnx.readyState == 4 && (pagecnx.status==200 || window.location.href.indexOf("http")==-1)){ //este corchete...
                alert('pagecnx.responseText: '+pagecnx.responseText);
		var scs=pagecnx.responseText.extractScript();
                alert(pagecnx.responseText.extractScript());
		document.getElementById(id).innerHTML =pagecnx.responseText;
		scs.evalScript();
	}//...y este corchete
}
Ya no sale el error en Firebug y funciona en Firefox... PERO no en IE, y se sigue quejando de "Argumento no válido".

En el HOWTO de Maborak propone que para que funcione en IE habría que quitar stripScript(), pero lo hice y nada.

He incluido unos alerts para ver el contenido del responseText y y del mismo con extractScript. El resultado es: con el primer alert me muestra el contenido de la página a llamar (es decir, me muestra el contenido del DIV) y el segundo me muestra todos las lineas de tag script. Con lo cual, creo que están realizando bien su función.

Pero ese error en IE y que no funcione... no sé.

¿Qué opináis? Gracias de nuevo y un saludo.
  #5 (permalink)  
Antiguo 26/02/2009, 16:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Haz identificado en donde se produce el error?, puede que no sea en esa parte si no en otra parte de tu código.

Saludos
  #6 (permalink)  
Antiguo 26/02/2009, 17:15
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Gracias por contestar.
Firebug no me da ninguna pista, ya que en Firefox funciona correctamente. La función scs.evalScript(); me devuelve true. Sin embargo, he puesto un alert() inmediatamente después de ella, y en IE no llega a ejecutarse dicho alert(). Un alert() antes de scs.evalScript(); sí funciona.

¿Se te ocurre como podría averiguar porqué se queja IE y no funciona?

Gracias otra vez. Un saludo.
  #7 (permalink)  
Antiguo 26/02/2009, 18:13
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Pregunta Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Bien. Ya he acotado un poco más el error. Resulta que entra en la función evalScript() y ahí es donde falla (el código es de interpretadorAjax.js). He puesto unos alerts, y os pongo el código y comento el resultado de los alerts a modo de secuencia de ejecución.

En ajax.js
Código:
scs.evalScript();
alert('aki: '+scs+' ----EVAL: '+scs.evalScript()); 
En interpretadorAjax.js
Código:
Array.prototype.evalScript = function(extracted)
{
var s=this.map(function(sr){
alert('dentro');
var sc=(sr.match(new RegExp(tagScript, 'im')) || ['', ''])[1];
alert('SC: '+sc);
if(window.execScript){
alert('window.execScript: '+window.execScript);
alert('window.execScript(sc): '+window.execScript(sc));
window.execScript(sc);
}
else
{
alert('window.setTimeout(sc,0): '+window.setTimeout(sc,0));
window.setTimeout(sc,0);
}
});
return true;
};
Con Firefox siempre entra en el else, con lo cual siempre ejecuta window.setTimeout(sc,0);
Sin embargo, IE accede por el if a window.execScript(sc); y ahí es donde se queja.

Los alerts en IE muestran:

dentro.
SC:
window.execScript(sc): function execScript(sc){[native code]}

y sale el error.

Los alerts en Firefox:
dentro
SC:
window.setTimeout(sc,0): 2
dentro
SC:
window.setTimeout(sc,0): 4
dentro
SC: Nifty("div#box","big");
window.setTimeout(sc,0): 6
dentro
SC: var slider1=new accordion.slider("slider1"); slider1.init("slider");
window.setTimeout(sc,0): 8
dentro
SC:
window.setTimeout(sc,0): 10
dentro
SC:
window.setTimeout(sc,0): 12
dentro
SC: Nifty("div#box","big");
window.setTimeout(sc,0): 14
dentro
SC: var slider1=new accordion.slider("slider1"); slider1.init("slider");
window.setTimeout(sc,0): 16


Ya continuación el alert que hay en ajax.js
aki: <script type="text/javascript" src="js/script_acordeon.js"></script>,<script type="text/javascript" src="js/niftycube.js"></script>,<script>Nifty("div#box","big");</script>,<script type="text/javascript">
var slider1=new accordion.slider("slider1");slider1.init("slider") ;</script>
----EVAL: true


Y se ejecuta correctamente.

¿Podría ser que esa función "window.execScript(sc)" no funcionara? ¿Le véis alguna solución?

Gracias. Un saludo.

Última edición por windzefiro; 26/02/2009 a las 18:18 Razón: Resaltado de codigo
  #8 (permalink)  
Antiguo 27/02/2009, 10:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Mmmm: http://msdn.microsoft.com/en-us/libr...20(VS.85).aspx

Es probable que alguno de los scripts que pones este causando ese error en IE..
  #9 (permalink)  
Antiguo 28/02/2009, 06:10
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Hola de nuevo.

Parece que al quitar las referencias a los archivos js de la página a llamar y dejándolos sólo en la página principal, funciona correctamente en ambos exploradores.

Mi pregunta ahora es... dados los problemas que ha dado para reconocer los archivos js ¿el código de interpretadorAjax.js sólo funciona para scripts embebidos en el código html?

Además, el css incluido en la página llamada, ya sea un archivo css como incluido en el código html, se mezcla con con el de la página principal... creando un poco de caos "estético". ¿La solución sería la misma que con los scripts?

Gracias y un saludo.
  #10 (permalink)  
Antiguo 28/02/2009, 14:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Así es y si puedes ver no es en sí problema de interpretadorAjax, si no de como IE maneja el exec, a lo mejor se podría "parchar" un poco interpretadorAjax para que cheque si el script esta vacio y no lo ejecute y solo guarde la referencia.

En cuanto a los CSS, en efecto siempre es mejor traer solo el contenido que vas a cambiar y no toda una pagina web, es un concepto que se conoce como "too much ajax" cuando rompes con la navegación de un sitio web por implementar demasiado AJAX.

Saludos
  #11 (permalink)  
Antiguo 28/02/2009, 14:28
 
Fecha de Ingreso: febrero-2009
Mensajes: 7
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

Muchas gracias por tu respuesta y tu ayuda.

Un saludo.
  #12 (permalink)  
Antiguo 12/04/2009, 22:33
 
Fecha de Ingreso: mayo-2007
Mensajes: 16
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con evalScript() al intentar cargar javascript desde AJAX

hoal amigos soy novato en esto, veo tantos codigos de interpretadorAjax.js y de ajax.js, bueno yo tambien kisiera k al dar clik en un link me carue una pagna k contiene scripts e un div, peuden decirme como, y cuales son los codigos finales de interpretadorAJAX.js y ajax. js k debo usar, gracias
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:48.