DOM Manipulation может сделать веб-приложения настраиваемыми, а данные веб-страницы могут быть обновлены без обновления страницы. С помощью манипуляций с DOM мы можем добавлять, изменять и удалять любые элементы или атрибуты HTML, а также стили CSS, связанные с ними. К элементу также можно привязать любое событие.
Давайте узнаем, что такое модель DOM и как она создается.
Что такое модель DOM?
DOM (объектная модель документа) - это объектно-ориентированное представление документа HTML или XML в логической древовидной структуре, где каждый узел содержит объект, представляющий часть документа.
Узел также может иметь прикрепленные к ним события, при срабатывании которых выполняется прикрепленный к ним обработчик событий. DOM также действует как интерфейс между JavaScript и документом HTML или XML, который позволяет создавать настраиваемые веб-страницы.
Как создается модель DOM?
Браузер считывает HTML-код веб-страницы в формате необработанных байтов и преобразует их в отдельные символы. Затем строка символов преобразуется в отдельные токены, как указано W3C. Знаки для строки между угловыми скобками ‹› имеют особое значение и имеют свой собственный набор правил. После создания токенов они преобразуются в объекты, у которых есть свои свойства и правила. Эти объекты структурированы в виде древовидной структуры с родительско-дочерними отношениями в соответствии с тегами в разметке HTML, которая является DOM.
Процесс выглядит следующим образом:
Методы манипулирования DOM
Методы DOM предоставляют доступ к дереву, с помощью которого мы можем вносить изменения в структуру DOM и манипулировать DOM по мере необходимости. Ниже приведены наиболее распространенные методы и способы управления DOM.
- document.createElement (tagName) - динамически создает новый узел элементов HTML в вашем коде JavaScript.
var paraEle = document.createElement(‘p’);
- document.createTextNode (текст) - создать текстовый узел.
var node = document.createTextNode(“This is a para”);
- document.createDocumentFragment () -. Фрагмент документа - это, по сути, виртуальный невидимый HTML-элемент . .createDocumentFragment () используется для создания фрагмента документа, добавления элементов к фрагменту документа, а затем добавления фрагмента документа в дерево DOM. . В дереве DOM фрагмент документа заменяется всеми его дочерними элементами.
var fragment = document.createDocumentFragment();
- Если мы пишем страницу, которая выполняет большое количество манипуляций с DOM, использование этого метода может значительно повысить производительность вашей страницы. Добавление дочерних элементов к фрагменту предотвращает переформатирование пользовательского интерфейса, что увеличивает производительность, и поэтому createElement () отличается от createDocumentFragment ().
- parentElement.appendChild (newElement): этот метод вставляет дочерний узел (переданный в аргументе) как последний дочерний узел родительского элемента. т.е. он добавляет элемент дочернего узла к элементу родительского узла
paraEle.appendChild(node); fragment.appendChild(paraEle); document.body.appendChild(fragment);
- parentElement.insertBefore (newElement, element): позволяет вставить новый элемент дочернего узла (переданный в качестве первого аргумента) в существующий элемент родительского узла перед одним из его дочерних узлов ( передается как второй аргумент) в родительском элементе.
const list = document.createElement('ul'); document.body.insertBefore(list, paraEle);
- Node.setAttribute (имя, значение): динамически устанавливает атрибут элемента в HTML.
paraEle.setAttribute('class','paragraph');
Затем мы можем установить CSS для абзаца класса, и стили будут применены к элементу.
- Node.textContent (): Позволяет устанавливать и получать текстовое содержимое узла (обычно известного как элемент ).
const para = document.getElementByClassName('paragraph'); console.log(para.textContent); // console the para text para.textContent = "This is the changed paragraph" ; /*set the paragraph text*/
- Node.innerHTML (): установите внутреннее содержимое HTML.
para.innerHTML = '<em>This is the changed paragraph</em>'; // text will be italics
Разница между innerHTML () и textContent () заключается в том, что innerHTML () может устанавливать как HTML-теги, так и текст внутри элемента, но в текстовом Content () может быть установлен только текст.
- Node.classList: позволяет изменять классы, прикрепленные к элементу.
console.log(paraEle.classList); //console all the classes attached paraEle.classList.add('myClass') //styles of myClass class will be applied paraEle.classList.remove('myClass'); // remove the class paraEle.classList.replace('myClass1','myClass2'); //replaces one class with other; paraEle.classList.toggle('myClass') //if class present removes it, else if not present attaches the class to the element; paraEle.classList.contains('myClass') //returns true or false whether the class is in the classList or not
- Node.dataset: позволяет устанавливать и получать значения настраиваемых атрибутов данных, которые у нас есть в элементах HTML.
//HTML file <div id="myDiv" data-name="Item" data-item-price="10"></div> //JavaScript const myDiv = document.getElementById('myDiv'); console.log(myDiv.dataset) //{name:"Iteml", item-price:"10"} myDiv.dataset.name = "new Item1" //changes the name property of myDiv.removeAttribute('data-name') //removes the name attribute of data
- Node.cloneNode: позволяет сделать копию или клонировать узел.
var paraCopy = paraEle.cloneNode(); //It doesn't include the childNode by default it only copies the current node which is <p></p> var paraCopy = paraEle.cloneNode(true); //deep copy happends i.e. childNode will also be copied document.body.appendChild(paraCopy);
- Node.nextElementSibling: дает следующий элемент вызываемого вами элемента.
- Node.nextSibling: предоставляет следующий узел. Он также учитывает любые типы узлов, включая текстовые, но nextElementSibling этого не делает.
- Element.getBoundingClientRect (): этот метод возвращает объект, содержащий свойства элемента, такие как ширина, высота, верхнее, левое, правое, нижнее значение, а также x , y -координаты.
console.log(paraEle.getBoundingClientRect());
- Element.outerHTML: предоставляет внешний HTML-код, который является тегом элемента, включая идентификатор, классы и т. д.
- document.getElementById ( idname ): позволяет найти элемент с предоставленным идентификатором.
- document.getElementByClassName ( classname ): позволяет найти элемент с указанным ClassName.
- Element.querySelector ( селектор ): позволяет найти первый элемент, соответствующий селектору CSS.
document.querySelector('#myDiv'); //gives element with the above selector i.e. id of myDiv document.querySelector('.myClass'); //gives element with the above selector i.e. class of myClass
- Element.querySelectorAll ( селектор ) - позволяет найти список элементов, соответствующих селектору CSS.
document.querySelectorAll('.myClass'); //gives the array of element with the above selector
- window.parent: документ равен window.parent.document, ссылаясь на наш HTML-документ.
Прежде чем браузер отобразит страницу, создается модель DOM. В результате нам необходимо обеспечить максимально быструю доставку HTML в браузер. Чрезмерные манипуляции с DOM приводят к тому, что страница снова и снова отображается, вызывая перекомпоновку пользовательского интерфейса, что является дорогостоящим и требует высокой производительности.
Поэтому мы должны гарантировать отсутствие чрезмерных манипуляций с DOM. Кроме того, есть некоторые библиотеки, такие как React, которые используют виртуальную модель DOM, поэтому производительность не снижается, а веб-страницы являются динамическими.