| ||||
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 |
| ||||
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: Código PHP: connection closed.
__________________ Maborak Technologies |
| ||||
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. |
| ||||
Re: sobre ajax, porque no lo hace ? loading.......... un intento mas: y si haces: Código PHP: Sino, usa JSON del lado de javascript para convertir esa cadena en un objeto. www.json.org connection closed.
__________________ Maborak Technologies |
| ||||
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.. |
| ||||
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: Código PHP: QUE SERA ????? |
| ||||
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. |
| ||||
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); } |
| ||||
Re: sobre ajax, porque no lo hace ? loading............ Eso no es Crossbrowser supongo. connection closed.
__________________ Maborak Technologies |
| ||||
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.. |
| ||||
Re: sobre ajax, porque no lo hace ? Cita: Para los que somos un poco mas torpes, podrias poner un ejemplo funcional, con todo su codigo, gracias
Iniciado por erlingfiallos 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); } bichomen
__________________ "Se sabe con exactitud, con cuanta imprecisión, se sabe algo" Linux Registered User #320332 |
| |||
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. |
| ||||
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> Código PHP: |
| ||||
Re: sobre ajax, porque no lo hace ? Donde llamas a la funcion:
Código:
y supongo que le pasas el getdata(frm);
Código:
elemento_res getdata(elemento_res); bichomen
__________________ "Se sabe con exactitud, con cuanta imprecisión, se sabe algo" Linux Registered User #320332 |
| ||||
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. |
| |||
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> Código HTML: Peticion Ajax correcta <script type="text/javascript"> alert('hola'); </script> Saludos!! |
| ||||
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.. |
| |||
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 |
| ||||
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.. |
| |||
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> 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> Código PHP: |
| ||||
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: 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- |
| ||||
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 |
| |||
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 ;) |
| |||
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>Por lo tanto si se encontraba algo así: <script type="text/javascript">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">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: Código PHP: Código PHP: Código PHP: 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 |
| ||||
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:
simplemente eso se incluye en la pagina de donde se hace la peticion y con eso debe de funcionar..<script type="text/javascript" src="js/mootools.v1.00.js"></script> 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:
me robe un trozo de prototype.. precisamente lo que permite ejecutar esos codigos..<script>...</script>
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]; }); } }); |
| ||||
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(); 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(); |