Ver Mensaje Individual
  #28 (permalink)  
Antiguo 03/05/2007, 09:02
Asyolath
 
Fecha de Ingreso: abril-2006
Mensajes: 80
Antigüedad: 18 años, 1 mes
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