Síntoma: al establecer un valor para el interno de un elemento, si el código HTML proporcionado contiene scripts JS, muchas veces estos scripts no son válidos o son válidos en algún navegador, pero no en otros navegadores.
Causa: diferentes navegadores tienen diferentes formas de manejar scripts insertados en InnerHTML. Después de la práctica, se resume de la siguiente manera:
Para IE, primero, la etiqueta de script debe tener un atributo de diferir, y en segundo lugar, en el momento de la inserción, el nodo al que debe estar en el árbol dom.
Para Firefox y Opera, el nodo al que no se permite que InnerHTML esté en el árbol dom en el momento de la inserción.
Según la conclusión anterior, se da un método general para establecer InnerHTML:
La copia del código es la siguiente:
/*
* Descripción: Método InnerHTML Configuración de Browser
* Permite la inserción del código HTML para incluir script y estilo
* Parámetros:
* El: El nodo en el árbol dom, establece su interno
* HTMLCODE: código HTML insertado
* Navegadores probados: IE5+, Firefox1.5+, Opera8.5+
*/
var set_innerhtml = function (el, htmlcode)
{var ua = navigator.useragent.tolowercase ();
if (ua.indexof ('msie')> = 0 && ua.indexof ('ópera') <0)
{htmlcode = '<div style = "display: none"> para IE </div>' + htmlcode;
htmlcode = htmlcode.replace (/<script ([^>]*)>/gi, '<script $ 1 defer = "true">');
el.innerhtml = htmlcode;
El.removechild (El.Firstchild);
}
demás
{var el_next = el.nextsibling;
var el_parent = el.parentnode;
el_parent.removechild (el);
el.innerhtml = htmlcode;
if (el_next)
El_parent.insertbefore (El, el_next)
demás
El_parent.appendChild (El);
}
}
Hay otro problema con el código anterior: si el código HTML insertado contiene una declaración de documentos. Write, destruirá toda la página. Para este caso, se puede evitar redefiniendo document.write. El código es el siguiente:
La copia del código es la siguiente:
/*
Descripción: redefinir la función document.write.
Evite usar set_innerhtml, insertar el código HTML contiene documentos. Escribe las declaraciones, lo que hace que la página original esté dañada.
*/
document.write = function () {
var cuerpo = document.getElementsByTagName ('Body') [0];
para (var i = 0; i <arguments.length; i ++) {
argumento = argumentos [i];
if (typeof argumento == 'string') {
var El = Body.AppendChild (document.createElement ('div'));
set_innerhtml (el, argumento)
}
}
}