2015-05-03 2 views
4

У меня есть html-страница, созданная javascript во время выполнения. В какой-то момент я хочу создать резервную копию этой страницы, чтобы позже ее восстановить. Страница описана DOM, поэтому логически необходимо сохранить сам DOM. Проблема в том, что нет никаких законных способов сделать это.Дамп всего дерева DOM (включая прослушиватели событий и наблюдателей мутаций)

Я нашел только интерфейс XMLSerializer, который можно использовать только для сериализации html (так что это не тот инструмент). Но мне нужно сохранить наблюдателей за мутациями и прослушивателей событий, такая «восстановленная» страница будет вести себя как ее предок.

Я также подумал о записи в файл журнала javascript над DOM. Но страница, которая строит себя во время выполнения, огромна и сложна, поэтому такой подход будет стоить много времени.

Любые идеи?

+1

Существует не волшебный способ сделать это - сохранить трек наблюдателей/прослушивателей событий, которые вы устанавливаете (сделать журнал массива), и добавить это к вашему дампу. –

+0

Обычно, как это делается, вы специально не сохраняете HTML и прослушиватели событий на странице, но, по мере того, как вы создаете страницу с помощью JS, вы создаете объект состояния, который описывает, что было сделано на странице. Затем вы пишете код, который может читать этот объект состояния, чтобы перестроить страницу таким же образом. Если вы действительно хороши, вы можете сделать код перестройки тем же кодом, что и код, который строит страницу в первый раз. – jfriend00

+0

Вы можете вспомнить проблему, такую ​​как код, который используется для поддержки стека отмены. Вместо сохранения целого состояния документа после каждого изменения, стек отмены обычно сохраняет инкрементные команды/данные, которые изменяют страницу, и вы можете вернуться в какое-либо конкретное состояние, просто повторно применив (или в случае отмены путем реверсирования) эти команды , Вы можете сделать то же самое для изменений в DOM. Команды более высокого уровня, которые вы сохраняете, тем меньше данных, которые вы обычно должны хранить. – jfriend00

ответ

0

Вся информация, включая слушатели, хранится в объекте окна. Вы можете проверить его: console.log (окно).

Чтобы сбросить объект окна, просто скопируйте его и отправьте его в api для его сохранения.

+0

Нет. Слушатели не хранятся на объекте 'window'. Кроме того, можете ли вы описать надежный способ сериализации «окна» (чтобы скопировать и отправить его)? 'JSON.stringify' не работает. – Bergi

+0

Я нашел еще один [пост] (http://stackoverflow.com/questions/4079653/stringify-domwindow-object#answer-29804164) в stackoverflow. Существует фрагмент для создания более сложных объектов. Но ваше право с слушателями событий. В противном случае вам нужно поставить их в очередь на создание и при восстановлении резервной копии вы можете повторно инициализировать хранимых прослушивателей событий. – webcodecs

+0

Да, вы могли бы использовать [такой] (http://stackoverflow.com/a/14145840/1048572), чтобы получить строчение, но на самом деле нет причин для строкового «окна», когда вы хотите DOM (который должен быть сериализован как XML, а не JSON) – Bergi