Разработка передней стороны всегда была о манипулировании доме. В прошлом мы использовали библиотеки, такие как jQuery и Zepto, чтобы манипулировать домом. Позже после кадва, таких как Vue, угловые и реагирование, мы контролировали DOM путем манипулирования данными (большую часть времени), менее и меньше, чтобы напрямую манипулировать домом, не говоря уже о том, чтобы использовать родные JS для манипулирования домом.
Однако не обязательно постоянно знакомиться с этими библиотеками, необходимо понимать некоторые базовые JS-методы манипулирования DOM. Вот обзор знакомых, но незнакомых функций манипулирования DOM в JS.
Запрос
Запрос по идентификатору
document.getElementById(id) // лучшая совместимость
// demo
// HTMl
<body>
<div id="main">
<div id="content"></div>
</div>
</body>
// Script
const mainDom = document.getElementById('main');
const contentDom = document.getElementById('content');
Запрос по классу
element.getElementsByClassName // ie9+
element.querySelectorAll // ie8
траверс //ie7-
// demo
// HTMl
<body>
<div id="main">
<div id="content">
<p class="info test">info1</p>
<p class="info">info2</p>
<p class="info">info3</p>
</div>
</div>
</body>
// Script
const mainDom = document.getElementById('main');
const infoDomList1 = mainDom.querySelectorAll('.info.test');
const infoDomList2 = mainDom.getElementsByClassName('info test');
Поиск по тегу
element.getElementsByTagName // ie6+
// demo
// HTMl
<body>
<div id="main">
<div id="content">
<p class="info test">info1</p>
<p class="info">info2</p>
<p class="info">info3</p>
</div>
</div>
</body>
// Script
const divDom = document.getElementsByTagName('div');
const pDom = divDom[0].getElementsByTagName('p');
Запрос по атрибуту
element.querySelector //ie8+
element.querySelectorAll() //ie8+
querySelector возвращает один элемент DOM, querySelectorAll возвращает NodeList
querySelector
Синтаксис очень похож на селектор в jquery,querySelector
а такжеquerySelectorAll
Использование одинаково, поэтому некоторые из следующих утверждений применимы к обоим.
// demo
// HTMl
<body>
<div id="main">
<div id="content">
<p class="info test">info1</p>
<p class="info">info2</p>
<p class="info">info3</p>
</div>
</div>
</body>
// Script
const infoDom = document.querySelectorAll('.info');
const infoDom2 = document.querySelectorAll('.info:not(.test)');
querySelectorAll и querySelector не совпадают с jquery под запросом, подробности см.Элемент DOM querySelectorAll может дать вам неожиданное поведениеПроще говоря
document.querySelector("#my-id").querySelectorAll("div div");
, прямое ощущение - запрос#my-id
подэлементыdiv div
изdom
, не на самом деле, а#my-id
, а также соответствует глобальной области видимостиdiv div
изdom
.
получить родительский элемент
element.parentNode // в принципе совместимый
получить дочерний элемент
element.childNodes // в основном совместимы
element.childNodes
не только получитьDOM
, также получит текст и т. д., только когдаnodeType === 1
выражается, когдаDOM
.
Получить одноуровневые узлы
Получить предыдущий родственный узел
element.previousSibling//Базовая совместимость
Чтобы получить все предыдущие одноуровневые узлы, нужно пройтиpreviousSibling
, доnull
.
Браузер Kernel Gecko вставит текстовый узел в документ в теге в исходном коде. Итак, используйте такие методы, как Node.firstChild и Node.previous, могут ссылаться на пустой текстовый узел символа не узел, который ожидается пользователь.
Получить следующий родственный узел
element.nextSibling//В основном совместим
Получить все и обратить внимание на обоих иpreviousSibling
Такой же
Манипуляции с DOM
Создать DOM
document.createElement(tagName)
Добавить DOM
Последнее добавление, добавленное к дочернему узлу
paranetElement.appendChild(child);
добавить в начало узла
paranetElement.insertBefore(newElement, Element)
пройти черезinsertBefore
метод может бытьnewElement
вставить вElement
спереди, еслиElement
даnull
будуnewElement
вставить вparanetElement
хвост.
еслиnewElement
это уже существующий документDOM
, insertBefore
появится, чтобы переместитьDOM
(Все события будут сохранены).
Добавление к узлу
Без этой функции 😶 Это можно смоделировать с помощью метода insertBefore и nextSibling.
parentDiv.insertBefore(sp1, sp2.nextSibling);
еслиsp2
нет следующего узла, тогда он должен быть последним узлом, тогдаsp2.nextSibling
вернутьnull
,а такжеsp1
вставляется в конец списка дочерних узлов (т.е.sp2
Позади)
смотрите подробностиNode.insertBefore()
Изменить DOM
Изменить текст DOM
Element.innerHTML // получить все содержимое внутри тега Element.innerText // получить только текстовое содержимое внутри тега, не включая тег
изменить css
element.style.cssAttribute
Изменить свойства
element.setAttribute()
element.removeAttribute()
element.className
удалить DOM
paranetElement.removeChild(element)
очистить дочерние узлы
Специальной функции нет, вы можете пройти через removeChild, чтобы добиться
var element = document.getElementById("top");
while (element.firstChild) {
element.removeChild(element.firstChild);
}
конец
оDOM
Операция широко используемая, я пока так много думаю, я подумаю об этом позже, а затем медленно добавлю