Симптом: при установлении значения для innerhtml элемента, если предоставленный HTML -код содержит сценарии JS, много раз эти сценарии недействительны или действительны в некоторых браузерах, но не в других браузерах.
Причина: разные браузеры имеют разные способы обработки сценариев, вставленных в Innerhtml. После практики это суммируется следующим образом:
Для IE, во -первых, тег сценария должен иметь атрибут DEFE, а во -вторых, в момент введения узел, к которому должен находиться innerhtml в дереве DOM.
Для Firefox и Opera узел, на который innerhtml не разрешается находиться в дереве DOM в момент введения.
Согласно вышеуказанному выводу, дается общий метод установки Innerhtml:
Кода -копия выглядит следующим образом:
/*
* Описание: Метод Cross-Browser Innerhtml
* Позволяет вставить HTML -код для включения скрипта и стиля
* Параметры:
* EL: Узел в дереве DOM, установите свой innerhtml
* htmlCode: вставлен HTML -код
* Протестированные браузеры: IE5+, Firefox1.5+, Opera8.5+
*/
var set_innerhtml = function (el, htmlcode)
{var ua = navigator.useragent.tolowercase ();
if (ua.indexof ('msie')> = 0 && ua.indexof ('Opera') <0)
{htmlcode = '<div style = "display: none"> для т.е. </div>' + htmlcode;
htmlcode = htmlcode.replace (/<script ([^>]*)>/gi, '<script $ 1 defer = "true">');
el.innerhtml = htmlcode;
El.RemoveChild (El.Firstchild);
}
еще
{var el_next = el.nextibling;
var el_parent = el.parentnode;
el_parent.removechild (el);
el.innerhtml = htmlcode;
if (el_next)
el_parent.insertbefore (el, el_next)
еще
el_parent.appendchild (el);
}
}
Существует другая проблема с приведенным выше кодом: если вставленный HTML -код содержит документ. Для этого случая его можно избежать путем переосмысления Document.write. Код заключается в следующем:
Кода -копия выглядит следующим образом:
/*
Описание: переопределить функцию документа. Написание.
Избегайте использования set_innerhtml, вставка HTML -кода содержит операторы Document.Write, что приводит к повреждению исходной страницы.
*/
document.write = function () {
var body = document.getelementsbytagname ('body') [0];
for (var i = 0; i <arguments.length; i ++) {
аргумент = аргументы [i];
if (typeOf argirt == 'string') {
var el = body.appendchild (document.createElement ('div'));
set_innerhtml (el, аргумент)
}
}
}