Я управлял DOM веб-страницы с помощью некоторых js-библиотек, которые изменили поведение onMouseup onMousedown и onMousemove, среди прочего, в чем я не могу быть уверен.

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

Итак, то, что я пытаюсь выяснить, - это способ сохранить, когда страница загружена, начальное состояние объекта «документ» (или, возможно, сохранить всю DOM?), Чтобы позже я смог восстановить его.

Моя наивная попытка:

var initial_state = document
document = initial_state

Угадай, что? Не получилось ... Итак ... что мне нужно знать и как я могу это сделать правильно?

ОБНОВЛЕНИЕ : теперь я знаю, что присвоение java осуществляется по ссылке, а не по значениям, поэтому теперь я экспериментирую с .extend (), но основной смысл этого вопроса заключается в том, является ли означает, что я смогу сохранить полное состояние модели DOM на ее начальном этапе (при получении страницы), а затем восстановить его во второй раз. Под полным состоянием я подразумеваю html, состояние javascript, свойства и методы объекта, чтобы при его восстановлении DOM была точно такой же, как та, которую вы получили в первый раз.

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

2
Redoman 3 Окт 2013 в 06:43
2
Объекты передаются по ссылке, нужно клонировать.
 – 
elclanrs
3 Окт 2013 в 06:46
Я пробовал с jQuery .clone (true, true) (первый bool: клонировать также все обработчики событий и данные, второй bool: рекурсивно клонировать для всех дочерних объектов). Но почему-то не сработало ..?
 – 
jj_
3 Окт 2013 в 06:52
.clone для коллекций jQuery, вам понадобится $.extend
 – 
elclanrs
3 Окт 2013 в 06:52
По какой причине вы просто не перезагружаете документ? Он будет извлекаться из кеша и быстро загружаться.
 – 
jfriend00
5 Окт 2013 в 00:14

1 ответ

Лучший ответ

Поскольку как работает JavaScript (объекты не копируются, а передаются по ссылке) initial_state var только что сохранил ссылку на документ DOM. Когда документ DOM обновляется, ваша переменная initial_state отразит эти изменения, потому что это просто ссылка, которая просто указывает на документ DOM, а не объект «сам по себе».

Чтобы получить копию объекта, который является «реальным» объектом, а не просто ссылкой на первый объект, вам необходимо клонировать .

Если вы используете jQuery, вы можете клонировать его с помощью функции расширения

// for simple cloning
var initDoc = $.extend({}, document);

// for deep cloning
var initDocument = $.extend(true, {}, document);

Если вы не заинтересованы в использовании jQuery.extend (), ознакомьтесь с этим связанным вопросом о клонировании объекта в JavaScript.

Как правильно клонировать объект JavaScript?

1
Community 23 Май 2017 в 15:00
Так что как только я это сделаю, var initDocument = $.extend(true, {}, document); как мне позже восстановить документ DOM? Что мне делать: document = $.extend({}, initDocument);? Поскольку это было глубокое клонирование, клонировало ли оно также все дочерние элементы документа DOM, то есть, на самом деле, всю страницу?
 – 
jj_
3 Окт 2013 в 15:27
Вы можете использовать document = initDocument для восстановления объекта DOM. Не DOM страниц.
 – 
Chokchai
3 Окт 2013 в 15:34
Почему это не тот же "ДОМ страниц"?
 – 
jj_
3 Окт 2013 в 15:53