Мне любопытно, как люди сталкиваются с заменой всего документа во время выполнения в веб-приложении Ajax. Это редко, но я нашел несколько ситуаций, когда для приложения требуется полная перестройка страницы, и все присутствует локально, не нуждаясь в другом сервере в оба конца.
Я могу легко подготовить новый документ как новое дерево DOM или как String. Поэтому я оцениваю компромиссы для различных подходов.
Если я хочу использовать метод String, это работает:
document.open();
document.write(newStringDoc);
document.close();
Большинство браузеров делают это очень хорошо, но многие из них слегка мерцают при повторном рендеринге. Я заметил, что во второй раз через Firefox 4.0b7 будет просто сидеть и вращаться, как будто он загружается. Нажатие кнопки остановки на панели местоположения, похоже, завершает визуализацию страницы. ( Изменить:, это исправлено в 4.0b8). Этот метод, по-видимому, не позволяет пользователю удалять обновление, чтобы перезагрузить текущий URL (он перезагружает динамически сгенерированную страницу).
Если я использую новый подход дерева DOM (который имеет разные преимущества/недостатки в гибкости и скорости), то это, похоже, работает:
document.replaceChild(newDomDoc, document.documentElement);
Большинство браузеров, похоже, отлично справляются с этим без мерцания. К сожалению, IE9 beta выбрасывает "DOM Exception: HIERARCHY_REQUEST_ERR (3)" на replaceChild
и никогда не завершается. Я не пробовал последнюю версию предварительного просмотра, чтобы убедиться, что это только новая ошибка, которая исправлена. ( Изменить: это исправлено в RC1.)
Мой вопрос: Есть ли у кого-то другой подход, чем любой из этих? У кого-нибудь есть какие-либо другие оговорки, где, возможно, конкретный браузер принципиально ломается с одним из этих подходов?
Обновление: Возможно, это добавит контекст и поможет воображению. Рассмотрим ситуацию, когда приложение отключено. Для перенаправления или обновления сервер недоступен. Необходимое состояние приложения уже загружено (или сохранено) на стороне клиента. Пользовательский интерфейс построен из клиентских шаблонов.
Я считаю, что Gmail использует iframe, встроенные в корневой документ. Похоже, что начальный документ, по крайней мере, для некоторых из этих iframe - это просто пустой документ HTML5, который затем обрабатывает родительский документ.
Использование iframe было бы еще одним вариантом требования заменить текущий документ, заменив весь дочерний iframe или только его документ. Такая же ситуация существует и в том, какой подход прикрепить новый документ к iframe.