Сохранение данных, записанных в объект DOM после cloneNode()

#javascript #dom

#javascript #dom

Вопрос:

В тот момент, когда я записываю (комплексное) значение в объект узла dom, значение теряется при выполнении cloneNode на узле, см. Пример:http://codepen.io/anon/pen/ohGDy

Есть ли способ сохранить эти данные с помощью cloneNode()?

Имейте в виду, что как клонируемый узел, так и устанавливаемое значение могут быть намного сложнее, чем в примере (т. Е. значение может быть установлено на подузле клонируемого узла и может быть объектом, а не строкой).

Ответ №1:

cloneNode копирует htmlDomObject, у htmlDomObject есть атрибуты html, у него нет свойств, подобных обычному объекту javascript. Javascript, будучи javascript, позволит вам назначить свойство domObject, потому что это позволит вам делать все, что вы хотите.

Однако cloneNode конкретно имеет дело с domObjects, а domObject не может иметь свойство string, которое, если вы это сделаете typeof foo.bar , вы увидите, что это действительно typeof string .

Я изменил ваш код на этот:

 var foo = document.getElementById("foo");
foo.setAttribute('bar', 'foobar');
var foo2 = foo.cloneNode(true);
document.write("foo: "   foo.getAttribute('bar')   "<br>");
document.write("foo2: "   foo2.getAttribute('bar'));
  

И для обоих он распечатывается foobar , поэтому вы можете видеть, что атрибут html, установленный на узле, копируется cloneNode.

отредактированный codepen:http://codepen.io/anon/pen/Ltiov

Комментарии:

1. Правильно, и это отлично работает для простых значений, но не для сложных значений. Если только вы не хотите начать кодирование / декодирование значений. По сути, мне интересно, есть ли способ записать пользовательские свойства в объект html dom.

2. @Naatan не со стандартным html. Но есть способы обойти это, это в значительной степени то, что делают angular и ember. Они связывают сложные значения (модели) с элементами dom.