Ответ 1
Думаю, я отвечу на это своими собственными выводами, поскольку я завершаю свои исследования по этому вопросу.
Поскольку два браузера, у которых есть проблемы с одним из этих методов, являются бета-версиями, я открыл отчеты об ошибках, которые, надеюсь, разрешат их до их полной версии:
- Firefox 4 Beta: https://bugzilla.mozilla.org/show_bug.cgi?id=615927
Изменить: Исправлено в FF 4b8. - Internet Explorer 9 Beta: https://connect.microsoft.com/IE/feedback/details/626473
Изменить: Исправлено в IE9 RC1.
Я также нашел довольно последовательно, что это...
document.replaceChild(newDomDoc, document.documentElement);
... на 2-10x быстрее, чем это...
var doc = document.open("text/html");
doc.write(newStringDoc);
doc.close();
... даже при включении времени, необходимого для сборки узлов DOM, или сборки строки HTML. Это может быть причиной мерцания или, возможно, только одного аргумента поддержки для подхода DOM. Chrome не имеет никакого мерцания ни с одним из методов.
Обратите внимание на тонкое изменение хранения возвращаемого document
, который обходит ошибку в Firefox 4.0b7.
Также обратите внимание, что этот добавленный тип MIME, который заявляет IE docs, "требуется".
Наконец, Internet Explorer, похоже, немного справляется с устранением тегов ссылок, которые были созданы до того, как новый документ будет заменен. Назначение ссылки href back to itself появляется, чтобы исправить ее.
// IE requires link repair
if (document.createStyleSheet) {
var head = document.documentElement.firstChild;
while (head && (head.tagName||"") !== "HEAD") {
head = head.nextSibling;
}
if (head) {
var link = head.firstChild;
while (link) {
if ((link.tagName||"") === "LINK") {
link.href = link.href;
}
link = link.nextSibling;
}
}
}
Можно было бы покрыть все базы и объединить их вот так...
var doc = document;
try {
var newRoot = newDoc.toDOM();
doc.replaceChild(newRoot, doc.documentElement);
// IE requires link repair
if (doc.createStyleSheet) {
var head = newRoot.firstChild;
while (head && (head.tagName||"") !== "HEAD") {
head = head.nextSibling;
}
if (head) {
var link = head.firstChild;
while (link) {
if ((link.tagName||"") === "LINK") {
link.href = link.href;
}
link = link.nextSibling;
}
}
}
} catch (ex) {
doc = doc.open("text/html");
doc.write(newDoc.toString());
doc.close();
}
... если у вас есть возможность выбрать ваш подход как я делаю.