Тема: ownerDocument
Показать сообщение отдельно
  #10 (permalink)  
Старый 13.05.2011, 15:22
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Хм-м… попытаюсь объяснить и я. Интересно, получится?

DOM — «Document Object Model», то-бишь, объектная модель документа. Модель — это не имплементация. В модель не входит программирование непосредственно, а лишь описание объектов, свойств и методов и того, как они должны работать.

Пример: Javascript
document.documentElement.appendChild(document.createElement("body")).setAttribute("class", "my");

Пример: PHP
$document->documentElement->appendChild($document->createElement("body"))->setAttribute("class", "my");


Языки разные, имена методов одинаковые, результат и там и там одинаковый — в корневой элемент документа вставляется новый элемент body, которому сразу присваивается класс.
И про то и про другое можно сказать, это DOM.

Но можно ли вставить напрямую объект DOM из одного языка в документ на другом языке?
Нет. Можно, конечно, перевести в XML в одном месте и вставить из XML в другом, но это что угодно, а не «напрямую».

Теперь представьте, что Вы написали свой собственный движок DOM на php. С нуля, мегакрутой, шустрее и менее затратный по памяти, чем libxml+DOMDocument.
Естественно, Ваши методы и свойства будут называться так же: appendChild, insertBefore, parentNode, и т.д. И ожидаемые значения и действия их будут такими же. Иначе какая ж это модель DOM, хехе?

Вопрос номер два: можно ли вставить элемент класса MyMegaCoolDOMEngineElement как childNode объекту DOMElement (стандартному)?
В общем случае нет, Вас мягко пошлют, ссылаясь на то, что вы попытались вставить в документ какой-то инопланетянский объект.

Вот и выходит, что DOM как модель над имплементацией себя не властна. А значит, может гарантировать лишь то, что всё это будет работать только в пределах одного отдельного документа.

Как это реализовать? При создании любой ноды задавать ей свойство ownerDocument, которое содержит ссылку на тот документ, в котором она была создана. Не обязательно, прикреплена, именно создана. И если ownerDocument ссылается на что угодно, кроме текущего документа, при попытке, скажем, appendChild отвечаем мягким но настойчивым отказом (Exception ERR_WRONG_DOCUMENT), ибо за последствия такого действия отвечать никто не станет.

Так было до DOM версии 3. В третьем DOM появились методы adoptNode и importNode, позволяющие присваивать и копировать (соответственно) ноды из других элементов. Изменяя при этом ownerDocument, разумеется. Да еще и приписка «если производитель движка уверен, что все будет ОК, можно применять эти методы автоматически, не утруждая программера пониманием того, что есть из себя ownerDocument». Ну, а если не «OK», то ловите по-старинке Exception ERR_WRONG_DOCUMENT.

Ну… как-то так.
Ответить с цитированием