• Что представляет из себя пространство между данными объектами?

    @Dimon123 Автор вопроса
    Новичок, разбираюсь в веб-программировании
    На первую часть вопроса мне помогли ответить толковые ребята с тостера. На вторую часть вопроса, а именно
    2. Зачем браузер запихивает лишние текстовые узлы между моих узлов? Зачем-то же это придумали разработчики. я отвечу сам.

    Браузер расценивает любые символы (числа, буквы, пробел, перевод строки, табуляцию…), которые не лежат в элементе, как текстовый узел. В моем документе HTML ВСЕ ВЫВОДИТСЯ НА ЭКРАН (кроме служебных элементов), и, когда я ввожу символы какие-то ВНЕ служебных элементов, то браузер думает «Ага, он хочется, чтобы я их вывел. Стоп, но они же не внутри элемента, тогда выведу их, как обычный текстовый узел (у которого объектом-прототипом является объект-прототип Text)». Я раньше сталкивался с подобной ситуацией, но не понимал, почему так. Например, я пишу код:
    …
    <body>
    	Привет
    	<div>123</div>
    …

    Вот этот текст «Привет» как раз и запихнули в такой объект-узел текстовый. Поэтому «Привет» и вывелся на экран, хотя я думал «Почему он выводится, он же не в элементе?». Но помни, что текст-тексту рознь (про это написано в следующем курсе по JavaScript). У этого объекта-узла «Привет» объект-прототип Text. Если же я создаю джаваскриптом переменную-объект с использованием функции-конструктора String(), то у этого объекта объект–прототип (а значит, свойства и методы совсем другие) совсем другой – String{…}.
    То есть, ВСЯ РАЗМЕТКА НЕСЛУЖЕБНОЙ ЧАСТИ МОЕГО ХТМЛ-ДОКУМЕНТА ВМЕСТЕ С СИМВОЛАМИ МЕЖДУ САМИМИ ЭЛЕМЕНТАМИ РАЗМЕТКИ (пробел, табуляция, перевод строки…) расценивается браузером как то, ЧТО Я ХОЧУ ВЫВЕСТИ НА ЭКРАН, преобразуется в объекты-узлы дерева DOM (подчеркиваю, что именно объекты-УЗЛЫ – они ВЫВОДЯТСЯ НА ЭКРАН, а не просто объекты дерева BOM) и ВПЛЕТАЮТСЯ в BOM. Я написал «вплетаются», так как создаются еще и промежуточные объекты-контейнеры («неузлы») – например, если пишу элемент <div id=”first”></div>, а в него кидаю еще два элемента <div></div>, то в BOM два СООТВЕТСТВУЮЩИХ объекта div будут лежать не на первом уровне вложенности, а на ВТОРОМ по отношению к первому объекту div – в «более упорядоченном» объекте-посреднике, на который ссылается свойствоdocument.getElementById(“first”).childNodes; . Плюс, стилевая часть содержимого моего хтмл-документа образует другое дерево – дерево CSSOM, которое также «вплетается» (вкладывается) в BOM. Это дерево объектов, которые НЕ ОТОБРАЖАЮТСЯ на экране (а помогают понять браузеру, как отобразить объекты-узлы DOM, которые отображаются на экране). Деревья DOM и CSSOM входят в общее дерево BOM.
    Когда я пишу разметку, то для ЧИТАБЕЛЬНОСТИ я ее форматирую – делаю табуляцию, пробелы могу поставить и переводы строк МЕЖДУ ЭЛЕМЕНТАМИ. Эти табуляции, пробелы и переводы строк браузер и перегоняет в текстовые узлы DOM. Например, если я напишу такой код:
    <!DOCTYPE HTML><html><head><style>.qq{width:100px;height:100px;border:1px solid black;}</style></head><body><div class="qq" id="first">1</div><div class="qq" id="second">2</div></body></html>

    То есть, код БЕЗ ТАБУЛЯЦИЙ И ПЕРЕВОДОВ СТРОК, то эти загадочные текстовые объекты-узлы дерева DOM ИСЧЕЗНУТ (если взять, например, и посмотреть «более упорядоченный» объект-список объектов-узлов-детей объекта-узла body из кода выше, то там будет только два объекта div, а текстовых объектов-узлов уже не будет). Но такой код нечитабельный совсем, поэтому надо их либо удалять, либо задавать им font-size:0px. Плюс, еще надо помнить, что, если у меня объект-узел является inline-block, то он подчиняется ЗАКОНАМ СТРОК – этот объект рассматривается, КАК БУКВА. Например, у него появляется верхний отступ межстрочный, и, чтобы его убрать, надо написать line-height:0px.
    Ответ написан
  • Как взаимодействует объект, например, HTMLParagraphElement с объектом HTMLElement?

    @Dimon123 Автор вопроса
    Новичок, разбираюсь в веб-программировании
    1. Во цепи объектов прототипов лежат дефолтные свойства и методы. По цепи прототипов эти свойства и методы передаются ("стекают вниз") объектам, которые из элементов документа создаются в процессе анализа страницы (объекты p, div....).
    2. В объекты p, div.... запихиваются свойства, которые создаются из одноименных атрибутов при анализе документа (надо правило верблюжьей нотации соблюдать при обращении). Эти свойства перекрывают некоторые дефолтные свойства, идущие по цепи прототипов. Это и определяет внешний вид документа.
    3. На самом деле, во всех объектах-прототипах сидят не "просто свойства" (типа name:1), а геттеры и сеттеры (ФУНКЦИИ) ,которые имитируют свойство и позволяют "РАССЧИТАТЬ СВОЙСТВО НА ЛЕТУ" при, например, обращении к нему (или при изменении свойства) в коде. А ДЛЯ ФУНКЦИЙ ВАЖЕН КОНТЕКСТ ИСПОЛНЕНИЯ - ИЗНУТРИ КАКОГО ОБЪЕКТА ФУНКЦИЯ ЧЕРЕЗ ТОЧКУ ВЫЗЫВАЕТСЯ, так как в функциях куча ключевых слов this может быть. Поэтому попытка вызвать "типа свойство", например,
    document.getElementById("red").__proto__.parentNode;
    , а на самом деле это это вызов функции-геттера приведет к тому, что функция-геттер parentNode вызывается изнутри не того объекта, изнутри которого через точку она должна вызываться (контекст не тот). Поэтому выдаст illegal invocation.
    Ответ написан
    Комментировать
  • Где лежат объекты-прототипы, например, объект HTMLParagraphElement?

    @Dimon123 Автор вопроса
    Новичок, разбираюсь в веб-программировании
    1. parentNode – это «типа свойство», а не обычное свойство. Для программиста оно кажется обычным свойством, а на самом деле – это пара геттер плюс сеттер, которые являются функциями и имитируют обычное свойство. Вызываться «типа свойство»parentNode может ТОЛЬКО ИЗНУТРИ, например, объекта-параграфа p(document.getElementById("red"). parentNode;) и аналогичных – изнутри объектов, которые из элементов документа при анализе получились, так как геттеры и сеттеры у «типа свойств» имеют this и эти геттеры и сеттеры запрограммированы только для вызова изнутри параграфа р и других объектов, которые из элементов получились. То есть, во всей цепи прототипов геттеры и сеттеры стоят в основном, расчет свойств для объектов (для объекта-параграфа p (document.getElementById("red"). parentNode;) и аналогичных – изнутри объектов, которые из элементов документа при анализе получились) ведется на лету в ДИНАМИКЕ. то есть, они рассчитываются только при обращении к ним, а не постоянно там "сидят", как обычные свойства. А когда я писал document.getElementById("red").__proto__.parentNode; , то КОНТЕКСТ был не тот, в котором "типа свойство" parentNode запрограммировано работать (там куча this). Вот и выдавало фигню Illegal invocation.
    2 Я хотел узнать, где в дереве BOM лежат следующие объекты: а) Функции-конструкторы для объектов-прототипов function HTMLИмяElement(), function HTMLElement(), function Element(), function HTMLDocument(), function Document(), function CharacterData(), function Text(), function Comment(), function Attr(), function Node() + б) Одноименные объекты-прототипы HTMLИмяElement, HTMLElement, Element, HTMLDocument, Document, CharacterData, Text, Comment, Attr, Node, которые создаются соответствующими одноименными функциями-конструкорами + в) функции-конструкторы созданных программистом объектов (Array, Number, Function, Object..., объекты-прототипы созданных программистом объектов (Array.prototype, Number.prototype, Function.prototype, Object.prototype ...
    И ошибочно использовал для этого "типа свойства" (а на самом функции геттеры и сеттеры), которые маскируются под обычные свойства (например, name:1) parentNode, firstChild, firstElementChild и другие из объектов-прототипов Node, Element, HTMLElement... Думал, раз свойство определено, то оно должно работать даже в самом объекте-прототипе (в его контексте, то есть изнутри его). Но я тогда не знал про геттеры и сеттеры.
    КУДА конкретно они прикреплены к объекту window – не узнать, так как нет для этого специальных свойств и методов.
    Ответ написан
    Комментировать