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

Ajax a PHP y luego a JavaScript

Estas en el tema de Ajax a PHP y luego a JavaScript en el foro de Frameworks JS en Foros del Web. No sé si este tema ya se ha debatido en algún post anterior, en cualquier caso planteo el tema para ver si me podéis ayudar: ...
  #1 (permalink)  
Antiguo 28/03/2009, 15:29
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Ajax a PHP y luego a JavaScript

No sé si este tema ya se ha debatido en algún post anterior, en cualquier caso planteo el tema para ver si me podéis ayudar:

Estoy desarrollando una web modular en php, y en uno de estos módulos tengo una llamada a un script que a su vez ejecuta un flash. Hace poco implementé un script en AJAX para evitar que la web se me reactualice cada vez que se pasa de una sección a otra, sin embargo ahora cuando cargo una sección con algún contenido en flash (y su script) no se visualiza, pero si lo ejecuto con la ruta directa (recargándose todo) si funciona.

¿Cual puede ser la solucción?
  #2 (permalink)  
Antiguo 28/03/2009, 18:00
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: Ajax a PHP y luego a JavaScript

Algunos scripts de incrustación flash utilizan el evento onload de la página. La solución es usar otro tipo de script que no requiera ese evento o pueda ser llamado cuando haga falta para reescribir el innerHTML del objeto que contiene al swf (como swfObject, por ejemplo).
  #3 (permalink)  
Antiguo 29/03/2009, 13:35
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ajax a PHP y luego a JavaScript

Gracias por tu colaboración pero he rastreado los archivos .js y no he encontrado ninguna función onload en uso... Para tratar de daros información más precisa sobre el problema, os introduciré parte del código:

Este es el código javascript con el que empleo para incrustar el flash:

Código js:
Ver original
  1. function insertaSWF(archivo, ancho, alto, alineacion, wmode, quality, allowScriptAccess) {
  2.  
  3. if(alineacion!=""){
  4. var alineacion_data=alineacion;
  5. }else{
  6. var alineacion_data="center";
  7. }
  8.  
  9. if(wmode!=""){
  10. var wmode_data=wmode;
  11. }else{
  12. var wmode_data="transparent";
  13. }
  14.  
  15. if(quality!=""){
  16. quality_data=quality;
  17. }else{
  18. quality_data="high";
  19. }
  20.  
  21. if(allowScriptAccess!=""){
  22. allowScriptAccess_data=allowScriptAccess;
  23. }else{
  24. allowScriptAccess_data="sameDomain";
  25. }
  26.  
  27. //Comprobamos versión del navegador
  28. if(document.all){//Si es Internet Explorer "quitamos el atributo DATA que no le gusta a IE".
  29. document.write('<object type="application/x-shockwave-flash" width='+ancho+' height='+alto+' align='+alineacion_data+'>\n');
  30. }else{//Si es Firefox
  31. document.write('<object type="application/x-shockwave-flash" data='+archivo+' width='+ancho+' height='+alto+' align='+alineacion_data+'>\n');
  32. }//Fin si
  33. document.write('<param name="allowScriptAccess" value='+allowScriptAccess_data+' />\n');
  34. document.write('<param name="movie" value='+archivo+' />\n');
  35. document.write('<param name="quality" value='+quality_data+' />\n');
  36. document.write('<param name="wmode" value='+wmode_data+' />\n');
  37. document.write('</object>\n');
  38. }

Con este script puedo visualizar el flash sin problema cuando hago llamadas "naturales" al archivo, ejemplo:
Cita:
myweb/index.php?mod=loquesea

Sin embargo cuando hago las llamadas a partir de AJAX para evitar la recarga de la web entera, no se me ejecuta el flash, el efecto es el mismo que si cortara el script que lo llama:

Cita:
<a href="index.php?mod=loquesea" onclick="processajax ('index.php?mod=loquesea','main','get',''); return false;">Page 1</a>
Este es el archivo de ajax sobre el que trabaja la función:

Código js:
Ver original
  1. //xmlhttp.js
  2.    
  3.     //Function to create an XMLHttp Object.
  4.     function getxmlhttp (){
  5.         //Create a boolean variable to check for a valid microsoft active X instance.
  6.         var xmlhttp = false;
  7.        
  8.         //Check if we are using internet explorer.
  9.         try {
  10.             //If the javascript version is greater than 5.
  11.             xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  12.         } catch (e) {
  13.             //If not, then use the older active x object.
  14.             try {
  15.                 //If we are using internet explorer.
  16.                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  17.             } catch (E) {
  18.                 //Else we must be using a non-internet explorer browser.
  19.                 xmlhttp = false;
  20.             }
  21.         }
  22.        
  23.         //If we are using a non-internet explorer browser, create a javascript instance of the object.
  24.         if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
  25.             xmlhttp = new XMLHttpRequest();
  26.         }
  27.        
  28.         return xmlhttp;
  29.     }
  30.    
  31.     //Function to process an XMLHttpRequest.
  32.     function processajax (serverPage, obj, getOrPost, str){
  33.         //Get an XMLHttpRequest object for use.
  34.         xmlhttp = getxmlhttp ();
  35.         if (getOrPost == "get"){
  36.             xmlhttp.open("GET", serverPage);
  37.             xmlhttp.onreadystatechange = function() {
  38.                 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  39.                     document.getElementById(obj).innerHTML = xmlhttp.responseText;
  40.                 }
  41.             }
  42.             xmlhttp.send(null);
  43.         } else {
  44.             xmlhttp.open("POST", serverPage, true);
  45.             xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
  46.             xmlhttp.onreadystatechange = function() {
  47.                 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  48.                     document.getElementById(obj).innerHTML = xmlhttp.responseText;
  49.                 }
  50.             }
  51.             xmlhttp.send(str);
  52.         }
  53.     }

Y esto creo que más o menos es todo, espero haber planteado el problema con más precisión.

Saludos.
  #4 (permalink)  
Antiguo 29/03/2009, 15:26
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: Ajax a PHP y luego a JavaScript

El hecho de usar document.write te está indicando que el script se ejecuta al cargarse la página (en realidad, al cargarse el script). Deberás buscar otro método de inserción que puedas llamar cuando readyState sea igual a 4, para regenerar los swfs (swfObject es una buena opción). No te servirá nada que use document.write, ya que cualquier llamada a ese método cuando la página ya ha sido servida reescribirá su contenido.
  #5 (permalink)  
Antiguo 30/03/2009, 02:54
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ajax a PHP y luego a JavaScript

Acabo de volver a intentarlo con swfobject.js y me sigue haciendo lo mismo:

en el head... (archivo layout)

Código HTML:
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("flash/0201-producto.swf", "ban_prod", "557", "104", "9.0.0", "flash/expressInstall.swf");
</script> 
en el body (parte de su correspondiente módulo)

Código HTML:
<div id="ban_prod">

<p><a href="adobe.com/go/getflashplayer"><img src="adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash 

player" /></a></p>

</div> 
La única novedad que he comprobado es que al principio tenía puesta una versión de flash muy alta y me tocó instalarla, ese mensaje alternativo también me salía en la llamada sobre ajax (lógico), pero el script sigue sin ejecutarse.

Saludos.
  #6 (permalink)  
Antiguo 30/03/2009, 03:21
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: Ajax a PHP y luego a JavaScript

Estás haciendo esto?:
Cita:
Deberás buscar otro método de inserción que puedas llamar cuando readyState sea igual a 4, para regenerar los swfs
Quizá te haya entendido mal y lo que necesitás es interpretar código javascript presente en la respuesta AJAX. Si eso es así, deberás tratar el responseText para solucionarlo

Última edición por Panino5001; 30/03/2009 a las 03:27
  #7 (permalink)  
Antiguo 31/03/2009, 08:59
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Pregunta Respuesta: Ajax a PHP y luego a JavaScript

He intentado hacer esto que me comentabas pero no lo he conseguido, esta vez prefiero subir los archivos para que lo veas tu mismo:


Sin embargo si pinchas sobre la etiqueta novedades o sobre algunas de las etiquetas de abajo (page 1 y page 2) el script no se carga, en este caso se hace la llamada a partir de Ajax, sobre el métodfo empleado subí sus archivos anteriomente en este mismo post.

Necesito hacerlo por ajax porque con la ruta directa, el menú flash de arriba en Flash siempre se me recarga, mientras que con ajax no pasa esto.

Saludos.

Última edición por AngelJ; 24/08/2009 a las 02:52
  #8 (permalink)  
Antiguo 31/03/2009, 09:35
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: Ajax a PHP y luego a JavaScript

En tu función procesaajax, tenés esto:
Código PHP:
...xmlhttp.responseText
Si querés que se evalúe el javascript que contenga esa respuesta, tenés que cambiarlo por esto:
Código PHP:
xmlhttp.responseText.tratarResponseText(); 
  #9 (permalink)  
Antiguo 31/03/2009, 10:26
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ajax a PHP y luego a JavaScript

Pues acabo de intentar 2 cosas y ninguna ha resultado:

Sobre el original (parte del GET de la función procesaajax)

Código PHP:
document.getElementById(obj).innerHTML xmlhttp.responseText
He transformado a:

a)

Código PHP:
document.getElementById(obj).innerHTML xmlhttp.responseText.tratarResponseText(); 
b)

Código PHP:
xmlhttp.responseText.tratarResponseText(); 
En la opción a) sigue haciéndo lo mismo de siempre (es lo que ahora está subido en la dirección que te dejé antes), en la opción b) sencillamente carga, pero no interpreta nada de ajax, no me deja pasar a ninguna otra sección empleando llamadas sobre AJAX.

La única novedad es que he localizado un pequeño error sobre la anterior, y es que no tenía subido el archivo externo.js (el que también empleas en tu tutorial), pero no creo que importe demasiado.
  #10 (permalink)  
Antiguo 31/03/2009, 10:35
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ajax a PHP y luego a JavaScript

Bueno, si que he visto que hace algo nuevo: a veces al pasar de novedades a inicio tarda algo más o se queda cerrado en un bucle infinito.

Por otra parte, ¿que sentido das a "evaluar" un script? Quizás en Argentina empleéis en estos aspectos alguna terminología algo diferente, al que yo no consigo sacar un significado exacto.

Saludos.
  #11 (permalink)  
Antiguo 31/03/2009, 11: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: Ajax a PHP y luego a JavaScript

No sé qué estarás haciendo para que suceda eso. Evaluar es hacer lo que hace la función eval (tomar un string y considerarlo como una expresión).
Veamos un ejemplo (podés testearlo aquí: http://www.disegnocentell.com.ar/ejemplo_/ejemplo.php y descargarlo aquí: http://www.disegnocentell.com.ar/ejemplo_/ejemplo.zip).
Este es código utilizado:
Código PHP:
<?php 
if(isset($_POST['p'])){
    switch(
$_POST['p']){
        case 
'uno':
        echo 
'
            <script type="text/javascript">
               var so = new SWFObject("ejemplo.swf", "ejemplo", "550", "400", "8", "#CCCCCC");
               so.addParam("quality", "high");
                so.addVariable("data","pagina 1");
               so.write("flashcontent");
            </script>
        '
;
        break;
        case 
'dos':
        echo 
'
            <script type="text/javascript">
               var so = new SWFObject("ejemplo.swf", "ejemplo", "550", "400", "8", "#CCCCCC");
               so.addParam("quality", "high");
                so.addVariable("data","pagina 2");
               so.write("flashcontent");
            </script>
        '
;
        break;
        default:
        echo 
'
            <script type="text/javascript">
               var so = new SWFObject("ejemplo.swf", "ejemplo", "550", "400", "8", "#CCCCCC");
               so.addParam("quality", "high");
                so.addVariable("data","inicio");
               so.write("flashcontent");
            </script>
        '
;
    }
    exit;
}
?>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>ejemplo</title>
<script src="swfobject.js"></script>
<script>
String.prototype.tratarResponseText=function(){
    var pat=/<script[^>]*>([\S\s]*?)<\/script[^>]*>/ig;
    var pat2=/\bsrc=[^>\s]+\b/g;
    var elementos = this.match(pat) || [];
    for(i=0;i<elementos.length;i++) {
        var nuevoScript = document.createElement('script');
        nuevoScript.type = 'text/javascript';
        var tienesrc=elementos[i].match(pat2) || [];
        if(tienesrc.length){
            nuevoScript.src=tienesrc[0].split("'").join('').split('"').join('').split('src=').join('').split(' ').join('');
        }else{
            var elemento = elementos[i].replace(pat,'$1','');
            nuevoScript.text = elemento;
        }
        document.getElementsByTagName('body')[0].appendChild(nuevoScript);
    }
    return this.replace(pat,'');
}
function http(){
    if(typeof window.XMLHttpRequest!='undefined'){
        return new XMLHttpRequest();    
    }else{
        try{
            return new ActiveXObject('Microsoft.XMLHTTP');
        }catch(e){
            alert('Su navegador no soporta AJAX');
            return false;
        }    
    }    
}
function request(url,callback,params){
    var H=new http();
    if(!H)return;
    H.open('post',url+'?'+Math.random(),true);
    H.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    H.onreadystatechange=function(){
        if(H.readyState==4){
            if(callback)
                callback(H.responseText);
            H.onreadystatechange=function(){}
            H.abort();
            H=null;
        }
    }
    var p='';
    for(var i in params){
        p+='&'+i+'='+escape(params[i]);    
    }
    H.send(p);

function evaluar(r){
    r.tratarResponseText();
}
</script>
</head>

<body>
<div id="flashcontent">
</div>
<script type="text/javascript">
   var so = new SWFObject("ejemplo.swf", "ejemplo", "550", "400", "8", "#CCCCCC");
       so.addParam("quality", "high");
    so.addVariable("data","inicio");
   so.write("flashcontent");
</script>
<a href="#" onclick="request('',evaluar,{'p':'uno'})">pagina 1</a> | <a href="#" onclick="request('',evaluar,{'p':'dos'})">pagina 2</a> |<a href="#"  onclick="request('',evaluar,{'p':'cualquiercosa'})"> inicio
</a>
</body>
</html>

Última edición por Panino5001; 31/03/2009 a las 11:55
  #12 (permalink)  
Antiguo 31/03/2009, 13:24
 
Fecha de Ingreso: febrero-2009
Mensajes: 35
Antigüedad: 15 años, 8 meses
Puntos: 0
Bueno, pues creo que he encontrado el problema que me estaba molestando, parece una bobada, pero tal y como ha sido, es lógico que no me hubiera funcionado nada.

Ahora he descargado el ejemplo que me has dejado, lo he ejecutado como servidor local y funcionaba sin problema, igual que en el link de prueba que me dejaste. Posteriormente he tratado de hacer funcionar este mismo sistema con otra aplicación copiando y pegando parte de código, sin embargo he estado dando vueltas y vueltas y no ha habido manera de ejecutarlo.

El problema finalmente fue el archivo swfobject.js, este archivo le tenía de algunos intentos anteriores pero no era el mismo que el que adjuntabas en tu .zip (se nota por el tamaño de archivo). Sustituyo el archivo original por el que adjuntabas y funcionaba perfectamente, luego lógico que los intentos anteriores de estos días también fracasaran.

He cambiado todos los swfobject.js por el de tu paquete, pero sigue sin funcionar, pero creo que lo que voy a hacer es reempezar de nuevo toda la estructura modular a partir de tu código de eval, que me convence mucho más que el que tenía, y he visto que si introduzco un flash en la página, este no se actualiza cuando cambio en contenido del flascontent.

En cualquier caso te añado la dirección de donde saqué el swfobject.js que no me funcionaba, por si te sirve de referencia.

http://code.google.com/p/swfobject/

Saludos y gracias por tu ayuda, ya te informaré de como acaba la cosa.

Pues de momento he conseguido alguna cosa más, pero no es suficiente.

Cuando entro desde este link funciona bien, si me voy a otra sección y vuelvo a novedades ya no se ve el flash, pero si pulso a página 1 (abajo, encima del chupachups), ya se ve el flash. Es algo lógico porque el div donde se inserta el flas sólo existe en esa sección, pero lo que me interesaría conseguir es un link que me mandara sin recargar el resto de la aplicación a novedades, y que en esta apareciera el flash cargado de inicio (sin tener que pulsar abajo).

Ahora por ejemplo logro que se quede, pero tan sólo un instante.

Última edición por AngelJ; 03/09/2009 a las 05:34
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 01:42.