Symptôme: Lors de la définition d'une valeur pour l'interhtml d'un élément, si le code HTML fourni contient des scripts JS, ces scripts sont souvent invalides ou sont valides sur un navigateur, mais pas sur d'autres navigateurs.
Cause: Différents navigateurs ont différentes façons de gérer les scripts insérés dans InnerHTML. Après l'entraînement, il est résumé comme suit:
Pour IE, d'abord, la balise de script doit avoir un attribut de différence, et deuxièmement, au moment de l'insertion, le nœud auquel InnerHTML doit être dans l'arbre Dom.
Pour Firefox et Opera, le nœud auquel InnerHTML n'est pas autorisé à être dans l'arbre Dom au moment de l'insertion.
Selon la conclusion ci-dessus, une méthode générale pour définir InnerHTML est donnée:
La copie de code est la suivante:
/ *
* Description: Méthode de configuration de croisement
* Permet l'insertion du code HTML pour inclure le script et le style
* Paramètres:
* El: le nœud dans l'arbre Dom, réglez son innerhtml
* htmlcode: code HTML inséré
* Browsers testés: IE5 +, Firefox1.5 +, Opera8.5 +
* /
var set_innerhtml = fonction (el, htmlcode)
{var ua = navigator.useragent.tolowercase ();
if (ua.indexof ('msie')> = 0 && ua.indexof ('opéra') <0)
{htmlcode = '<div style = "affiche: aucun"> pour ie </div>' + htmlcode;
htmlcode = htmlcode.replace (/ <script ([^>] *)> / gi, '<script $ 1 defer = "true">');
el.innerhtml = htmlcode;
El.Removechild (El.Firstchild);
}
autre
{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)
autre
el_parent.appendChild (el);
}
}
Il y a un autre problème avec le code ci-dessus: si le code HTML inséré contient une instruction Document.Write, elle détruira toute la page. Pour ce cas, il peut être évité en redéfinissant Document.Write. Le code est le suivant:
La copie de code est la suivante:
/ *
Description: Redéfinissez la fonction Document.Write.
Évitez d'utiliser set_innerhtml, l'insertion du code HTML contient des instructions Document.Write, provoquant la corruption de la page d'origine.
* /
document.write = function () {
var body = document.getElementsByTagName ('body') [0];
pour (var i = 0; i <arguments.length; i ++) {
argument = arguments [i];
if (typeof argument == 'string') {
var el = body.appendChild (document.CreateElement ('div'));
set_innerhtml (el, argument)
}
}
}