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