Ver Mensaje Individual
  #28 (permalink)  
Antiguo 03/05/2007, 09:02
Asyolath
 
Fecha de Ingreso: abril-2006
Mensajes: 80
Antigüedad: 20 años, 6 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 
xmlhttp= false;
     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(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);
        
ajax.setRequestHeader("Content-type", "text/html");
        
ajax.setRequestHeader("Content-length", parametros.length);
        
parametros= '';
    }
    else
    {
        
ajax.open(metodo, origen, true);
        
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)
    {
        
restohtml= script.substring(script.indexOf("/script")+7, script.length);
        
script= script.substring(script.indexOf("<script")+7, script.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="')!=-1 && script.indexOf('src="')<script.indexOf(">"))
        {
            
archivo= script.substring(script.indexOf('src="')+5, script.indexOf('">'));
            
cargarDatos('get', archivo, '')
        }
        
script= script.substring(script.indexOf(">")+1, script.length);

        
// Luego se ejecutan los scripts que hay entre las etiquetas
        
instalar(script);
        
script= restohtml;
    }
} 
Código PHP:
function instalar(scripts)
{
        
scripts = scripts.replace("<!--","");
        
scripts = scripts.replace("//-->","");
        if (
window.execScript)
            
window.execScript(scripts);
        else
            
window.setTimeout(scripts, 0);
} 
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