Как заменить документ в окне? - PullRequest
6 голосов
/ 31 декабря 2011
var newDoc = document.implementation.createHTMLDocument('someTitle');
// swap newDoc with document

DOMImplementation.createHTMLDocument

  • Возможно ли заменить текущий документ новым документом?
  • Есть ли разумные основания для этого?это?

Ответы [ 3 ]

5 голосов
/ 02 января 2012

Нельзя заменить текущий объект документа или любой объект документа на объект Document, созданный методом createHTMLDocument.

createHTMLDocument впервые был представлен в одном из черновиков DOM Level 2 Core, но позже был удален из окончательной рекомендации.

Позднее он был добавлен в спецификацию HTML5, поскольку не было программного способа создания документа HTML.

Некоторые варианты использования, предусмотренные для программного создания HTML-документа, были:

  • Создание неотрисованного HTML-документа для загрузки через XMLHttpRequest (вместоотправка документа XML).

  • Функциональное тестирование HTML DOM в коде библиотеки таким образом, чтобы избежать побочных эффектов в отображаемом документе.

  • Создание изолированного неотрисованного документа из области редактирования расширенного текста, чтобы можно было выполнить очистку на стороне клиента перед загрузкой, не нарушая динамический DOM, который пользователь может продолжать редактировать.

  • Реализация алгоритма синтаксического анализа HTML5 на стороне клиента в JavaScript для целей тестирования и сравнения, а также для виртуализации или защиты на основе возможностей объекта.

    Невидимый iframe можно использовать для большинства из этих целей, но это болеедорого с точки зрения ресурсов. Список рассылки W3C

Беседа в списках рассылки W3C, которая вернула метод обратно в спецификацию, [Bug7842] Новое: нет программного способа создания HTML-документа - рассмотрите возможность добавления createHTMLDocument

2 голосов
/ 24 июля 2012

В document есть вещи, которые на самом деле не связаны с деревом DOM, которое оно содержит, такие как document.cookie, location и URL. Намного безопаснее, если мы не сможем заменить глобальные объекты, такие как window и document.

Но то, что вы ищете, может быть эффективно достигнуто путем замены основного document documentElement другим document 'documentElement. Он будет иметь тот же эффект, что и вы. *

document.replaceChild(
    document.importNode(newdoc.documentElement, true),
    document.documentElement
);

Что касается причин сделать это, я до сих пор нашел один , который не может быть достигнут с помощью iframe.

* Обратите внимание, что если типы документов отличаются, вам придется заменить тип документа основного документа. узел с узлом типа документа другого документа отдельно.

1 голос
/ 22 февраля 2012

Если вы сериализовали документ в HTML, вы можете заменить документ текущей страницы на document.open, document.write и document.close.

На самом деле вы даже можете изменить режим Quirks на стандартный, добавив <!doctype html>.

Например: http://jsbin.com/anusul/2

<html>    
    <script>
        alert('now in compatMode '+document.compatMode);
        if (document.compatMode==='BackCompat') {
            setTimeout(function() {
        var markup= '<!DOCTYPE html>New Page';
                document.open();
                document.write(markup);
                document.close();
            }, 0);
        }
    </script>
</html>​​​​​​

Я бы не советовал использовать такую ​​хитрость без особого сценария, но он работает.

source: Переключение Javascript с режима quirks на стандартный + Нужна помощь с: jquery prepend dopeype to html

...