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!