Какие еще варианты замены всего HTML-документа с помощью W3C DOM?

Мне любопытно, как люди заменяют весь документ во время выполнения в веб-приложении Ajax. . Это редко, но я обнаружил несколько ситуаций, когда приложение требует полной перестройки страницы и все присутствует локально без необходимости повторного обращения к серверу.

Я могу легко подготовить новый документ как либо новое дерево DOM, либо в виде строки. Итак, я оцениваю компромиссы для различных подходов.

Если я хочу использовать подход String, это, похоже, сработает:

document.open();
document.write(newStringDoc);
document.close();

Большинство браузеров справляются с этим нормально, но многие имеют небольшое мерцание при повторном рендеринге. Я' Я заметил, что во второй раз Firefox 4.0b7 просто сидит и крутится, как будто он загружается. Кажется, что нажатие кнопки остановки на адресной строке завершает рендеринг страницы. ( Изменить: похоже, что это исправлено в 4.0b8). Также этот метод, похоже, не позволяет пользователю нажимать кнопку «Обновить» для перезагрузки текущего URL (он перезагружает динамически сгенерированную страницу).

Если я использую новый подход к дереву DOM (который имеет разные преимущества / недостатки в гибкости и скорости), то он, кажется, работает:

document.replaceChild(newDomDoc, document.documentElement);

Большинство браузеров, кажется, справляются с этим отлично, без мерцания. К сожалению, бета-версия IE9 выдает «Исключение DOM: HIERARCHY_REQUEST_ERR (3)» на replaceChild и никогда не завершается. Я не пробовал последний предварительный выпуск, чтобы убедиться, что это просто новая исправленная ошибка. ( Изменить: похоже, что это исправлено в RC1.)

Мой вопрос: есть ли у кого-нибудь другой подход, чем любой из этих? Есть ли у кого-нибудь другие предостережения, когда, возможно, конкретный браузер в корне не работает с одним из этих подходов?

Обновление: Возможно, это добавит контекст и поможет воображению. Рассмотрим ситуацию, когда приложение отключено. Нет сервера для перенаправления или обновления. Необходимое состояние приложения уже загружено (или сохранено) на стороне клиента. Пользовательский интерфейс построен на основе клиентских шаблонов.

Я считаю, что Gmail использует фреймы, встроенные в корневой документ. Похоже, что исходный документ по крайней мере для некоторых из этих фреймов - это простой документ HTML5, которым затем управляет родительский документ.

Использование iframe было бы еще одним вариантом требования заменить текущий документ путем замены всего дочернего iframe или только его документа. Такая же ситуация существует, несмотря на то, какой подход к прикреплению нового документа к iframe.

20
задан 12 revs 4 March 2011 в 01:59
поделиться