Хм-м… попытаюсь объяснить и я. Интересно, получится?
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
.
Ну… как-то так.