Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   ownerDocument (https://javascript.ru/forum/events/17171-ownerdocument.html)

cool 08.05.2011 22:02

ownerDocument
 
Обясните суть смысла данного атрибута node.ownerDocument?
Для чего он используется, чем хорош.

Kolyaj 08.05.2011 22:09

Суть смысла (масло масляное) данного атрибута в том, что он ссылается на документ-владельца текущего элемента. Используется, чтобы получить ссылку на документ, в котором лежит элемент. Этим и хорош.

cool 09.05.2011 19:30

Это я в интернете прочитал, а на примере можно показать. Не могу понять. Это тоже самое, что вызвать parentNode элемента узла в котором он находится?

Matre 09.05.2011 19:42

parentNode вернёт родительский элемент (который в DOM выше на 1 уровень), а ownerDocument вернёт "самый" родительский элемент (который в DOM на 1 уровне), т.е. объект document.

with-love-from-siberia 09.05.2011 20:55

cool,
Цитата:

Сообщение от Kolyaj
ссылается на документ-владельца текущего элемента

Сказать node.ownerDocument все равно, что пальцем на Адама показать. )))

Kolyaj 09.05.2011 21:08

with-love-from-siberia,
что значит сей каламбур?

cool 13.05.2011 10:57

Короче, я так понял вы сами не понимаете этого.
Те вещи которые понятны нам, нужно уметь объяснять. Вы можете сказать, я же точно так же описал, только мне понятно и хорошо, а вы сами догадывайтесь.

Другими словами у нас существует объект или документ:
xmlDoc.documentElement
window.frames[0].document

document = element.ownerDocument

Предположим, что мы не знаем кто является у нас главным, мы используем метод ownerDocument, чтоб определить родителя всей структуры.

Это тоже самое что вызвать node.parentNode, чтоб узнать кто является родителем элемента.

Kolyaj 13.05.2011 11:32

Причём здесь parentNode?

dmitriymar 13.05.2011 13:47

Цитата:

Сообщение от cool
Короче, я так понял вы сами не понимаете этого.

то что ты не понял сказанное тебе-говорит лишь только об одном-о твоей ограниченности,но не говорит о том что здесь не знают ответ:D

subzey 13.05.2011 15:22

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

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.

Ну… как-то так.


Часовой пояс GMT +3, время: 19:57.