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

sobre ajax, porque no lo hace ?

Estas en el tema de sobre ajax, porque no lo hace ? en el foro de Frameworks JS en Foros del Web. Alguien sabe porque cuando se regresa un request con ajax y dentro de ese request va algun codigo de javascript como un alert('hola'), este no ...

  #1 (permalink)  
Antiguo 30/03/2007, 16:30
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
sobre ajax, porque no lo hace ?

Alguien sabe porque cuando se regresa un request con ajax y dentro de ese request va algun codigo de javascript como un alert('hola'), este no se ejecuta ???
  #2 (permalink)  
Antiguo 31/03/2007, 03:12
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 9 meses
Puntos: 772
Re: sobre ajax, porque no lo hace ?

Hola erlingfiallos

Esto te lo contestarán mejor en el foro de AJAX.

Movido desde JavaScript.

Saludos,
  #3 (permalink)  
Antiguo 01/04/2007, 10:30
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Nadie tiene al menos una idea remota de como hacer funcionar un script regresado por un ajax entonces ??
  #4 (permalink)  
Antiguo 01/04/2007, 11:16
Avatar de demiurgo_daemon  
Fecha de Ingreso: diciembre-2006
Ubicación: Querétaro
Mensajes: 184
Antigüedad: 17 años, 11 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

hola,

antes que nada déjame ver si te entiendo:

recibes una respuesta AJAX que contiene, por ejemplo:

Código:
ajax = "alert('hola')";
y quieres ejecutar eso.

Puedes intentarlo con eval:
Código:
eval(ajax);
es lo mismo que

Código:
eval("alert('hola')");
Ahora bien, no sé qué tan seguro sea recibir código ejecutable mediante AJAX, tal vez quieras pensar en otra implementación.

saludos
  #5 (permalink)  
Antiguo 03/04/2007, 11:17
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

mmm..!!

sigue sin funcionar..

lo que quiero hacer es mandar datos a una pagina y recibir la respuesta mediante ajax.. ahora lo mas interesante es que la respuesta de ajax contenga codigo javascript que me permita ejecutar funciones.

Por ej..
Envio datos a procesar.php y este regresa un mensaje, lo que trato de hacer es que el mensaje que me regresa procesar.php aparezca usando un efecto de moo.fx

Lo malo es que no se porq ajax no ejecuta codigo javascript, incluso le digo a procesar.php que regrese esto y no pasa nada.

$output = '<script language="Javascript">eval(\'alert("Hola")\');</script>';

entonces ajax escribe

<script language="Javascript">eval('alert("Hola")');</script>

pero nunca se ejecuto ese script
  #6 (permalink)  
Antiguo 03/04/2007, 13:49
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 6 meses
Puntos: 35
Re: sobre ajax, porque no lo hace ?

loading............


podrias ILUSTRARNOS el como quieres evaluar tu javascript?
y como te dijeron si recibes el texto

Código PHP:
var larespuestaajax"alert('asdadasd');"
y luego haces

Código PHP:
eval (larespuestaajax); 
TIENE QUE FUNCIONAR;

connection closed.
__________________

Maborak Technologies
  #7 (permalink)  
Antiguo 03/04/2007, 16:52
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

pues ninguna llamada a un script ha funcionado hasta el momento.. pense que sabia JScript hasta este momento que me quede pegao en el tema..

Pero bueno, asi como han escrito el eval deberia de mostrarme el alert que se regresa mediante el ajax.. la cosa es que no lo hace..

Cualquier tipo de script que deba regresar con ajax lo omite y no lo ejecuta.. mi pregunta es que si saben el porque pasa esto o como se puede solucionar..

Y claro que podria hacerlo si modificara mi libreria de ajax, solo seria cosa de ponerle algo de codigo en evento onreadystatechange, pero el caso es que no quiero hacerlo porq mi libreria no debe de ser especificamente solo para imprimir mensajillos con efectos de la libreria moo.fx.

En si lo que quiero hacer se puede.. pienso yo.. pero debe de haber alguna forma de ejecutar codigo de javascript regresado en un ajax.
  #8 (permalink)  
Antiguo 03/04/2007, 18:29
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 6 meses
Puntos: 35
Re: sobre ajax, porque no lo hace ?

loading..........


un intento mas:

y si haces:

Código PHP:
eval("var algo="+larespuestaajax);
alert(algo); 
debería darte como resultado un objeto

Sino, usa JSON del lado de javascript para convertir esa cadena en un objeto.

www.json.org



connection closed.
__________________

Maborak Technologies
  #9 (permalink)  
Antiguo 03/04/2007, 20:15
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Esto se me hace chistoso.. porque sigue sin funcionar.. desconozco la razon por la cual no me permita hacer lo que quiero..

y pues un intento mas que no ha funcionado.. ahora vere si con json puedo lograrlo..
  #10 (permalink)  
Antiguo 03/04/2007, 20:55
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Esto se me hace chistoso.. porque sigue sin funcionar.. desconozco la razon por la cual no me permita hacer lo que quiero.. ahora posteare un ultrasuperlight ejemplo que hice.. unicamente son 2 archivos..

archivo ejemplo.php
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<
html>
    <
head>
        <
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <
script type="text/javascript" src="http://jack.xtremdesign.net/blog/bblog/blogfiles/ajaxdcod.js"></script>
        <script type="text/javascript" src="http://jack.xtremdesign.net/blog/bblog/blogfiles/json.js"></script>
        <script language='javascript'>
        var yo = {
              nombre: "Jack",          
              saludar: function() {
                  return "Coño.. porque no funcionas.";
              }
          };
          alert(yo.saludar());
          </script>
    </head>
<body>
<a href="javascript:void(0)" onclick="javascript:MakeRequest('get', 'post.php', 'numero=1&cadena=Jack&booleano=true', 'resplace');">Click para enviar llamado</a><br /><br />
<div id="resplace" name="resplace"></div>
</body>
</html> 
archivo post.php
Código PHP:
<?php
echo "<pre>";
print_r($_GET);
echo 
"</pre>";

echo 
"<script language='javascript'>
    var yo = {
              nombre: 'Jack',          
              saludar: function() {
                  return 'Coño.. porque no funcionas.';
              }
          };
          alert(yo.saludar());
    </script>"
;
?>
como veran las librerias tanto de ajax como de json ya estan incluidas con toda su ruta completa.. en el post.php lo que hago es supuestamente enviar la impresion de un alert.. lo cual no lo hace.. en ejemplo esta misma funcion la uso y funciona de maravilla.. pero al regresarla con ajax.. no pela para nada.. para quienes usen firefox y tengan instalado firebug.. veran como ajax regresa todo el codigo tal y como esta en el archivo post.php.. pero no ejecuta nada..

QUE SERA ?????
  #11 (permalink)  
Antiguo 04/04/2007, 11:27
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Por lo visto nadie tuvo solucion a esto.. entonces les explicare brevemente porque pasa eso..

Segun encontre cualquier tipo de script que venga en la respuesta de un ajax no se ejecutara por motivos de seguridad por lo cual hay que parsear la respuesta en busca de scripts y luego ejecutarlos pero desde la aplicacion que usa el ajax.. se ve algo complejo.. pero no lo es tanto asi..

var scripts = document.getElementById('contenedorajax').innerHTM L;
scripts = script.extractScripts();

esto existe y es para encontrar todos los javascript incluidos en una pagina

ahora para ejecutar los script

window.execScript(scripts);

esto no termina aqui, ya que debe de haber un ciclo for para obtener el numero de scripts encontrados y dentro de ese for hacer que se ejecuten.. cuando lo termine se los posteare para que vean como ha quedado.
  #12 (permalink)  
Antiguo 09/04/2007, 11:49
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Y pues como lo habia prometido, lo que estuve intentando hacer la semana pasada ya esta completamente funcional, al fin supe ejecutar scripts enviados en un request para ajax.. y el codigo es el siguiente.. no puse todo el codigo, pero ahi esta lo mas importante..

Código:
// se guarda la respuesta pedida mediante ajax
result = http_request.responseText;
// cargo en mi elemento destino la respuesta
document.getElementById(elemento_res).innerHTML = result;
// ahora en busca de scripts para ser ejecutados
buscarscripts(elemento_res);

function buscarscripts(elemento_res) {
	var script = document.getElementById(elemento_res).innerHTML;
	script = script.extractScripts();
	for(i=0;i<script.length;i++)
		instalar(script[i]);
}

function instalar(script) {
	script = script.replace("<!--","");
	script = script.replace("//-->","");
	if (window.execScript)
		window.execScript(script);
	else
		window.setTimeout(script, 0);
}
  #13 (permalink)  
Antiguo 10/04/2007, 12:20
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 6 meses
Puntos: 35
Re: sobre ajax, porque no lo hace ?

loading............

Eso no es Crossbrowser supongo.

connection closed.
__________________

Maborak Technologies
  #14 (permalink)  
Antiguo 10/04/2007, 15:38
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

las funciones que ven como el extractScripts() y el execScript() son totalmente crossbrowser aunque tienen ciertos problemas con el parseo de algunas etiquetas como el src.. pero en delante son parte de un estandar segun lei.. ahora.. no solo estas funciones se pueden utilizar.. tambien encontre que prototype tiene las mismas funciones implementadas de forma diferente dando el mismo resultado.. por si no funciona una funciona la otra..
  #15 (permalink)  
Antiguo 17/04/2007, 02:16
Avatar de bichomen  
Fecha de Ingreso: junio-2003
Ubicación: Barcelona y alrededores, España
Mensajes: 877
Antigüedad: 21 años, 5 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

Cita:
Iniciado por erlingfiallos Ver Mensaje
Y pues como lo habia prometido, lo que estuve intentando hacer la semana pasada ya esta completamente funcional, al fin supe ejecutar scripts enviados en un request para ajax.. y el codigo es el siguiente.. no puse todo el codigo, pero ahi esta lo mas importante..

Código:
// se guarda la respuesta pedida mediante ajax
result = http_request.responseText;
// cargo en mi elemento destino la respuesta
document.getElementById(elemento_res).innerHTML = result;
// ahora en busca de scripts para ser ejecutados
buscarscripts(elemento_res);

function buscarscripts(elemento_res) {
	var script = document.getElementById(elemento_res).innerHTML;
	script = script.extractScripts();
	for(i=0;i<script.length;i++)
		instalar(script[i]);
}

function instalar(script) {
	script = script.replace("<!--","");
	script = script.replace("//-->","");
	if (window.execScript)
		window.execScript(script);
	else
		window.setTimeout(script, 0);
}
Para los que somos un poco mas torpes, podrias poner un ejemplo funcional, con todo su codigo, gracias

bichomen
__________________
"Se sabe con exactitud, con cuanta imprecisión, se sabe algo"
Linux Registered User #320332
  #16 (permalink)  
Antiguo 23/04/2007, 09:22
 
Fecha de Ingreso: octubre-2005
Mensajes: 2
Antigüedad: 19 años, 1 mes
Puntos: 0
Gracias


Tenia el mismo problema cuando queria procesar un formulario con un action del tipo (javascript:consultar()). Que me servia cuando lo procesaba directamente a traves de URL pero cuando lo cargaba en un div contenedor me salia un error de objeto inexistente en javascript. Como me temia y como me lo confirmaste el problema era el procesar codigo javascript en un request.
Gracias por la solucion.
  #17 (permalink)  
Antiguo 23/04/2007, 10:25
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Aqui les dejo el funcionamiento de javascript con ajax.

Se crean el archivo ejemplo.php y el archivo proc.php y pegan sus respectivos codigos, incluyo una funcion que he estado haciendo para el uso de ajax que se llama MakeRequest, esta de mas explicar como funciona.. la pagina proc.php responde con un arreglo de las variables enviadas desde ejemplo.php usando GET y tambien imprime un pequeño script alert. Hasta aqui todo funciona bien y cuando hacen click sobre el link que puse en la pagina ejemplo.php veran impreso el arreglo de variables y el mensaje de "Hola mundo.." como alert. Ahora en la funcion MakeRequest si comentan donde dice "buscarscripts(elemento_res);" el alert ya no aparecera.. ese es el problema o duda que se habia tenido hasta el momento.

Para poder usar la funcion buscarscripts() hay que tener incluida la libreria de prototype y yo lo tome directamente desde la pagina web, por si alguno no la tiene. Si hay dudas aqui seguimos para aclararlas..

Suerte..

ejemplo.php
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Cargar JavaScript con Ajax</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://www.prototypejs.org/javascripts/prototype.js" type="text/javascript"></script>
<style type="text/css">
/*<![CDATA[*/
	body {font-family: Arial, Helvetica, sans-serif;font-size: 13px;color: #404040;font-weight: bold;}
/*]]>*/
</style>
<script language="JavaScript">
//<![CDATA[
	var http_request = false;   
	   
	function MakeRequest(metodo, url, parametros, elemento_res) {
		http_request = false;
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
			http_request = new XMLHttpRequest();
			if (http_request.overrideMimeType) {
				// se anticipa a que el tipo regresaro sera un mime ('text/xml');
				http_request.overrideMimeType('text/html');
			}
		} else if (window.ActiveXObject) { // IE
			try {
				http_request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		if (!http_request) {
			alert('No se puedo crear una instancia de XMLHTTP');
			return false;
		}
	  
		if (metodo == 'post') {
			http_request.open('POST', url, true);
			http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			http_request.setRequestHeader("Content-length", parametros.length);      	
		}
		else {
			http_request.open('GET', url+"?"+parametros, true);
			http_request.setRequestHeader("Content-type", "text/html");
			http_request.setRequestHeader("Content-length", parametros.length);
		}
		http_request.setRequestHeader("Connection", "close");
		http_request.send(parametros);
		http_request.onreadystatechange = function() {			
			if (http_request.readyState == 4) {
				if (http_request.status == 200) {
					result = http_request.responseText;
					document.getElementById(elemento_res).innerHTML = result;
					buscarscripts(elemento_res);
				} else {
					alert('Error al hacer request.');
				}
			}
			else {
				document.getElementById(elemento_res).innerHTML = "Cargando...";
			}
		}
	}
	   
	function getdata(frm) {
		var parametros = '';		
		for (i=0; i<=document.getElementById(frm).elements.length-1; i++) {  			
			elemento = document.getElementById(frm).elements[i];
			if (elemento.type != 'submit')
				parametros = parametros + elemento.id+"="+elemento.value+"&";			
		}
		parametros = parametros.substring(0,parametros.length-1);
		return parametros;		
	}
	
	function buscarscripts(elemento_res) {
		var script = document.getElementById(elemento_res).innerHTML;
		script = script.extractScripts();
		for(i=0;i<script.length;i++)
			instalar(script[i]);
	}
	
	function instalar(script) {
		script = script.replace("<!--","");
		script = script.replace("//-->","");
		if (window.execScript)
			window.execScript(script);
		else
			window.setTimeout(script, 0);
	}
//]]>
</script>
</head>
<body>
	<h2>Cargar usando GET</h2>
	<a href="javascript:void(0)" onclick="javascript:MakeRequest('get', 'proc.php', 'valor0=ajax&valor1=web2.0&valor3=javascript', 'respuesta');">Click aqui</a><br />
	<div id="respuesta" name="respuesta"></div>
</body>
</html> 
proc.php
Código PHP:
<?php
echo "<pre>";
print_r($_GET);
echo 
"</pre>";

echo 
"<script>";
echo 
"alert('Hola mundo');";
echo 
"</script>";
?>
  #18 (permalink)  
Antiguo 24/04/2007, 01:53
Avatar de bichomen  
Fecha de Ingreso: junio-2003
Ubicación: Barcelona y alrededores, España
Mensajes: 877
Antigüedad: 21 años, 5 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

Donde llamas a la funcion:

Código:
getdata(frm);
y supongo que le pasas el

Código:
elemento_res

getdata(elemento_res);

bichomen
__________________
"Se sabe con exactitud, con cuanta imprecisión, se sabe algo"
Linux Registered User #320332
  #19 (permalink)  
Antiguo 25/04/2007, 15:21
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Bueno, no quize explicar todo el codigo para no hacerlo mas complejo, pero la funcion getdata() la uso cuando envio datos por el POST usando un formulario.. Si ven bien lo que hace esta funcion es leer todos los elementos que estan dentro de un form y armar una cadena donde se contatena el id del control y su valor.. lo que retorna es la cadena parecida a las que se pasan por la url. Esta funcion sigue en desarrollo y optimizacion. Si alguien tiene una idea de mejorar la funcion, pues bienvenido sea.
  #20 (permalink)  
Antiguo 27/04/2007, 09:28
 
Fecha de Ingreso: julio-2003
Mensajes: 141
Antigüedad: 21 años, 4 meses
Puntos: 5
Re: sobre ajax, porque no lo hace ?

Hola!
Habeis probado con la libreria de Prototype?, resuelve muy bien los problemas que comentais de Request que tienen JavaScripts ...

Os adjunto un ejemplo ...
Código HTML:
 <script type="text/javascript" src="http://url/to/prototype.js"></script>
    <script type="text/javascript">
      window.onload = inicio;
      function inicio() {
        Event.observe('div_uno','click',peticion,false);
      }
      function peticion() {
        var opciones = { evalScripts: true };
        var url = 'hola.html';
        new Ajax.Updater("resp",url,opciones);
      }
    </script>

<body>

<div id="div_uno"  style="border: 1px solid black;">
Haz click en este div y recibiras un alert via Ajax;
</div>
<br />
<div id="resp" style="font-weight: bold; border: 1px solid blue;">
Esperando ...
</div>

</body> 
Y el fichero hola.html contiene:
Código HTML:
Peticion Ajax correcta
<script type="text/javascript">
alert('hola');
</script> 
Espero sirva ...
Saludos!!
  #21 (permalink)  
Antiguo 30/04/2007, 12:37
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

En efecto prototype esta muy bueno para esas cosas.. mas porque me permite ejecutar scripts que vienen con la respuesta de ajax.. Por ahora lo que hice fue utilizar mootools e integrar la funcion que hace que esos scripts se ejecute.. y algo que me gusta de mootools es que no es necesario refrescar un area con la respuesta, sino que se puede guardar a una variable y ya con eso manipularla de muchas maneras..
  #22 (permalink)  
Antiguo 30/04/2007, 13:39
 
Fecha de Ingreso: noviembre-2006
Mensajes: 98
Antigüedad: 18 años
Puntos: 0
Re: sobre ajax, porque no lo hace ?

hola yo tengo un problema parecido ya que envio esto:
echo " <a href=javascript:ajax('$paginam')>Siguiente</a>"
por ajax desde un php esto me da 3 links cuando doy en uno hace lo que deberia de hacer pero al dar en otro no pasa nada significa que lee el codigo javascript pero solo una vez no se porque

agradeceria mucho que me dieran la razon de esto y un poco de ayuda con las funciones para instalar y buscar scripts ya que no se si es diferente por estar en un linkn o es igual
  #23 (permalink)  
Antiguo 02/05/2007, 16:21
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Ya no recuerdo si al inicio de este post estuve exponiendo el problema de ejecutar scripts que venian en codigo pedido mediante ajax.. pero bueno, por razones de seguridad.. no se permite ejecutar cualquier javascript que venga con ajax.. por las mismas razones.. Para evitar esto prototype creo una funcion que lo que hace es buscar las etiquetas de <script></script> y todo lo que esta dentro de ellas las ejecutara usando una funcion llamada execScript(). Ahora si tu escribes javascript:ajax('$paginam'); aunque sigue siendo javascript no se ejecutara nunca porque no esta compliendo con la condicion que pone prototype..

Ahora la pregunta.. la funcion ajax la tienes local en la pagina de donde llamas a tu ajax ??? porque el codigo que escribiste no es necesario que se ejecute hasta que se le haya dado click..
  #24 (permalink)  
Antiguo 02/05/2007, 18:37
 
Fecha de Ingreso: abril-2006
Mensajes: 80
Antigüedad: 18 años, 7 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

He conseguido que se ejecuten los scripts llamados vía AJAX de otra manera, sin necesidad de ninguna librería. Es muy fácil, aunque lo he escrito así al vuelo. Habría que arreglarlo un poco:

ejemplo.html:
Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Ejecutar Javascript desde una petición AJAX</title>
    <script type="text/javascript">
      function nuevoObjetoAjax()
      {
	    var xmlhttp= false;
 	    try
	    {
 		  xmlhttp= new ActiveXObject("Msxml2.XMLHTTP");
 	    }
	    catch (excepcion)
	    {
 		  try 
		  {
 			xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
 		  }
		  catch (excepcion)
	      {
 			xmlhttp= false;
 		  }
  	    }

	    if (!xmlhttp && typeof XMLHttpRequest!='undefined')
	    {
 	  	  xmlhttp= new XMLHttpRequest();
	    }
	    return xmlhttp;
      }

      function cargarDatos(metodo, origen, parametros, destino, cargando)
      {
	    var ajax= nuevoObjetoAjax();
    	if(!ajax)
	    {
		  alert("No se puede ejecutar este proceso: Error de navegador");
		  return false;
	    }
	    metodo= metodo.toUpperCase();
	    if (metodo=='GET')
	    {
	  	  ajax.open(metodo, origen+'?'+parametros, true);
		  parametros= '';
	    }
	    else
	    {
		  ajax.open(metodo, origen, true);
		  ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	    }
	    ajax.onreadystatechange= function() {
		  if (ajax.readyState==1)
		  {
			if (cargando){document.getElementById(destino).innerHTML = cargando;}
		  }
		  if (ajax.readyState==4)
		  {
			document.getElementById(destino).innerHTML = ajax.responseText;
			scripts= ajax.responseText;
			while (scripts.indexOf("<script>")!=-1)
			{
			  restohtml= scripts.substring(scripts.indexOf("/script")+7, scripts.length);
			  scripts= scripts.substring(scripts.indexOf("<script>")+8, scripts.indexOf("/script")-1);
			  eval(scripts);
			  scripts= restohtml;
			}
		  }
	    }
	    ajax.send(parametros);
      }
    </script>
  </head>
  <body>
    <div id="div"  style="border: 1px solid black;">
      Haz click <span style="color:blue" onclick="cargarDatos('get', 'ejemplo2.html', '', 'div')">aquí</span> y recibiras un form y un codigo javascript ejecutable via Ajax
    </div>
  </body>
</html> 
ejemplo2.html:
Código HTML:
<form name="form">
	<input name="texto" type="text" title="Hola Mundo!" value="Hola Mundo!"/>
</form>
<script>
document.form.texto.onfocus= function(){if (this.value==this.title) this.value= '';}
</script>
<p>Si haces click en el input se borrara el texto por defecto.</p>
<script>
document.form.texto.onblur= function(){if (this.value=='') this.value= this.title;}
</script>
<p>Y si quitas el foco del input se restablecera el texto por defecto.</p> 
Los scripts de ejemplo2.html se ejecutan gracias a esta porción de codigo:
Código PHP:
scriptsajax.responseText;
while (
scripts.indexOf("<script>")!=-1)
{
  
restohtmlscripts.substring(scripts.indexOf("/script")+7scripts.length);
  
scriptsscripts.substring(scripts.indexOf("<script>")+8scripts.indexOf("/script")-1);
  eval(
scripts);
  
scriptsrestohtml;

Ya sé que es un poco bruto, pero funciona
  #25 (permalink)  
Antiguo 02/05/2007, 21:19
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 20 años, 2 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

Es un pequeño concejito

Pero.... mi función ejecuta codigo JavaScript como parte de una respuesta.

http://my.opera.com/JALF/

Ahi encuentras la función que he escrito, solo basta con hacer lo siguiente

Código PHP:
echo "EVAL-->alert('hola')"
Y listo, entonces cuando recibes eso de respuesta se ejecuta, pero recuerda que eso funciona utilizando la función que he escrito

Intentalo y me dices si te sirve o que¿?

Salu2
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #26 (permalink)  
Antiguo 03/05/2007, 04:37
Avatar de bichomen  
Fecha de Ingreso: junio-2003
Ubicación: Barcelona y alrededores, España
Mensajes: 877
Antigüedad: 21 años, 5 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

Muy buena Asyolath ya me funcionaba el codigo de erlingfiallos pero de esta manera me ahorro el prototype


bichomen
__________________
"Se sabe con exactitud, con cuanta imprecisión, se sabe algo"
Linux Registered User #320332
  #27 (permalink)  
Antiguo 03/05/2007, 07:33
 
Fecha de Ingreso: abril-2006
Mensajes: 80
Antigüedad: 18 años, 7 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

He corregido mi código para que funcione bien como el de erlingfiallos, y lo he mejorado porque tenía un problema. Ya lo explicaré luego, acabo de limpiar el código y lo posteo ;)
  #28 (permalink)  
Antiguo 03/05/2007, 09:02
 
Fecha de Ingreso: abril-2006
Mensajes: 80
Antigüedad: 18 años, 7 meses
Puntos: 2
Re: sobre ajax, porque no lo hace ?

Bueno... el código de antes sólo funcionaba si los scripts estaban escritos de la siguiente manera:
<script>
...código...
</script>
Por lo tanto si se encontraba algo así:
<script type="text/javascript">
...código javascript...
</script>
no se ejecutaba.

Luego había otro problema, con la función eval() no se ejecutan las declaraciones de las funciones. Por ejemplo:
eval("function hola(nombre) {alert('Hola '+nombre+'!');}");
no hace nada (por lo menos a mí no me funciona). La solución es utilizar la función execScript(), como proponía erlingfiallos.

El tercer y último problema consiste en que, tanto con mi código como con el de erlingfiallos sólo se ejecutan los scripts que están escritos en el archivo php o html. Si se encuentra una etiqueta como la siguiente:
<script type="text/javascript" src="archivo.js">
...código javascript...
</script>
el código que contiene archivo.js no se ejecuta.

Después de varios quebraderos de cabeza conseguí arreglar las funciones para solucionarlo:
Código PHP:
function nuevoObjetoAjax()
{
    var 
xmlhttpfalse;
     if (
window.XMLHttpRequest// Firefox, Opera...
    
{
        
xmlhttp = new XMLHttpRequest();
        if (
xmlhttp.overrideMimeType) {xmlhttp.overrideMimeType('text/html');}
    }
    else if (
window.ActiveXObject// IE
    
{
        try {
            
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (
e)    {
            try {
                
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (
e) {}
        }
    }
    return 
xmlhttp;

Código PHP:
function cargarDatos(metodoorigenparametrosdestinocargando)
{
    var 
ajaxnuevoObjetoAjax();
    if(!
ajax)
    {
        
alert("No se puede ejecutar este proceso: Error de navegador");
        return 
false;
    }
    
    
metodometodo.toUpperCase();
    if (
metodo=='GET')
    {
        
ajax.open(metodoorigen+'?'+parametrostrue);
        
ajax.setRequestHeader("Content-type""text/html");
        
ajax.setRequestHeader("Content-length"parametros.length);
        
parametros'';
    }
    else
    {
        
ajax.open(metodoorigentrue);
        
ajax.setRequestHeader("Content-Type""application/x-www-form-urlencoded");
        
ajax.setRequestHeader("Content-length"parametros.length);
    }
    
ajax.setRequestHeader("Connection""close");
    
    
ajax.onreadystatechange= function() {
        if (
ajax.readyState==1) {if (cargando){document.getElementById(destino).innerHTML cargando;}}
        else if (
ajax.readyState==4)
        {
            
//if (ajax.status==200)
            //{
                
if (destino)
                {
                    
document.getElementById(destino).innerHTML ajax.responseText;
                    
buscarScripts(destino);
                    
// Se buscan los scripts y se ejecutan
                
}
                
// Si el archivo al que se ha llamado tiene extensión .js
                // se llama la función que ejecuta su contenido
                
else if (origen.indexOf('.js')==origen.length-3) {instalar(ajax.responseText);}
            
//}
        
}
    }
    
ajax.send(parametros);

Esta es la función más importante, que he modificado para no tener que usar la librería prototype y para que se ejecute todo el código. Las demás están casi igual:
Código PHP:
function buscarScripts(elemento)
{
    var 
script document.getElementById(elemento).innerHTML;
    
    
// Mientas haya alguna etiqueta <script>
    
while (script.indexOf("<script")!=-1)
    {
        
restohtmlscript.substring(script.indexOf("/script")+7script.length);
        
scriptscript.substring(script.indexOf("<script")+7script.indexOf("/script")-1);

        
// Si la etiqueta <script> tiene atributo src se lee su valor y se
        // ejecutan los códigos que contiene el archivo
        
if (script.indexOf('src="')!=-&& script.indexOf('src="')<script.indexOf(">"))
        {
            
archivoscript.substring(script.indexOf('src="')+5script.indexOf('">'));
            
cargarDatos('get'archivo'')
        }
        
scriptscript.substring(script.indexOf(">")+1script.length);

        
// Luego se ejecutan los scripts que hay entre las etiquetas
        
instalar(script);
        
scriptrestohtml;
    }

Código PHP:
function instalar(scripts)
{
        
scripts scripts.replace("<!--","");
        
scripts scripts.replace("//-->","");
        if (
window.execScript)
            
window.execScript(scripts);
        else
            
window.setTimeout(scripts0);

Bueno, espero que esté bien explicado. Testeadlo y me decís que tal va.

Saludos!

Última edición por Asyolath; 03/05/2007 a las 09:12 Razón: No sé porqué si pones el if (ajax.status==200) no funciona, aseguraoss de quitarlo
  #29 (permalink)  
Antiguo 03/05/2007, 10:18
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

bueno, que yo sepa y segun mis pruebas.. no es necesario enviar en una respuesta de ajax algo como
Código:
<script type="text/javascript" src="js/mootools.v1.00.js"></script>
simplemente eso se incluye en la pagina de donde se hace la peticion y con eso debe de funcionar..

y lo que ha escrito Asyolath se mira muy bonito.. no lo he probado pero puedo apostar que funciona..

yo lo que habia hecho para no tener que usar prototype y poder ejecutar scripts en forma

Código:
<script>...</script>
me robe un trozo de prototype.. precisamente lo que permite ejecutar esos codigos..

Código:
function buscarscripts(elemento_res) {
	var script = document.getElementById(elemento_res).innerHTML;
	script = script.extractScripts();
	for(i=0;i<script.length;i++)
		instalar(script[i]);
}

function instalar(script) {
	script = script.replace("<!--","");
	script = script.replace("//-->","");
	if (window.execScript)
		window.execScript(script);
	else
		window.setTimeout(script, 0);
}

var proo = {  
  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
  emptyFunction: function() {},  
}

Object.extend(String.prototype, {
  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(proo.ScriptFragment, 'img');
    var matchOne = new RegExp(proo.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  }  
});
  #30 (permalink)  
Antiguo 07/05/2007, 11:42
Avatar de erlingfiallos  
Fecha de Ingreso: febrero-2005
Ubicación: Mexico ahora
Mensajes: 499
Antigüedad: 19 años, 9 meses
Puntos: 9
Re: sobre ajax, porque no lo hace ?

Y para terminar creo que estaba un poco errado en cuanto a lo de copiar una funcion de prototype y usarlas con mootools.. puesto que mootools trae una funcion similar.. llamada evalscript.. por aqui les dejo el codigo de como se utiliza..

Código HTML:
var ajax = new Ajax('request.php',{
  postBody: 'data=0&access=true',
  onComplete: function(responseText){
    console.log('Respuesta satisfactoria');
  },
  evalScripts: true, // esta inclusion es lo que permite evaluar la respuesta con script
  update:$('infomsg')
}).request();
y esta es otra forma de hacerlo.. aunque ya en casos de extrama locura donde solo se regrese javascript puro.

Código HTML:
var ajax = new Ajax('request.php',{
    onComplete:function(r)
    {
        new Element('script')
           .setProperty('type','text/javascript')
           .setHTML(r)
           .injectInside($E('head'));
    }
}).request();
y claro.. esto es usanso mootools.. version 1.0
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:16.