Tento článek byl původně napsán pro DigitalOcean .
Úvod
V Porozumění stromu a uzlům DOM jsme prošli, jak je DOM strukturován jako strom objektů nazývaných uzly a že uzly mohou být text, komentáře nebo prvky. Obvykle, když přistupujeme k obsahu v DOM, bude to prostřednictvím uzlu prvku HTML.
Abyste byli zběhlí v přístupu k prvkům v DOM, je nutné mít pracovní znalost selektorů CSS, syntaxe a terminologie a také rozumět prvkům HTML. V tomto tutoriálu si projdeme několik způsobů přístupu k prvkům v DOM:pomocí ID, třídy, tagu a selektorů dotazů.
Přehled
Zde je tabulkový přehled pěti metod, kterými se budeme v tomto tutoriálu zabývat.
Získává | Syntaxe selektoru | Metoda |
---|---|---|
ID | #demo | getElementById() |
Třída | .demo | getElementsByClassName() |
Značka | demo | getElementsByTagName() |
Výběr (jeden) | querySelector() | |
Výběr (vše) | querySelectorAll() |
Při studiu DOM je důležité psát příklady na svém počítači, abyste se ujistili, že rozumíte a uchováte si informace, které se naučíte.
Tento soubor HTML, access.html
, můžete uložit , na svůj vlastní projekt, abyste prošli příklady spolu s tímto článkem. Pokud si nejste jisti, jak pracovat s JavaScriptem a HTML lokálně, přečtěte si náš návod Jak přidat JavaScript do HTML.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Accessing Elements in the DOM</title>
<style>
html {
font-family: sans-serif;
color: #333;
}
body {
max-width: 500px;
margin: 0 auto;
padding: 0 15px;
}
div,
article {
padding: 10px;
margin: 5px;
border: 1px solid #dedede;
}
</style>
</head>
<body>
<h1>Accessing Elements in the DOM</h1>
<h2>ID (#demo)</h2>
<div id="demo">Access me by ID</div>
<h2>Class (.demo)</h2>
<div class="demo">Access me by class (1)</div>
<div class="demo">Access me by class (2)</div>
<h2>Tag (article)</h2>
<article>Access me by tag (1)</article>
<article>Access me by tag (2)</article>
<h2>Query Selector</h2>
<div id="demo-query">Access me by query</div>
<h2>Query Selector All</h2>
<div class="demo-query-all">Access me by query all (1)</div>
<div class="demo-query-all">Access me by query all (2)</div>
</body>
</html>
V tomto HTML souboru máme mnoho prvků, ke kterým budeme přistupovat s různými document
metody. Když vykreslíme soubor v prohlížeči, bude vypadat podobně jako toto:
K přístupu k dostupným prvkům v souboru použijeme různé metody, které jsme nastínili v Přehledu výše.
Přístup k prvkům podle ID
Nejjednodušší způsob, jak získat přístup k jednomu prvku v DOM, je pomocí jeho jedinečného ID. Můžeme zachytit prvek podle ID pomocí getElementById()
metoda document
objekt.
document.getElementById()
Aby byl prvek HTML zpřístupněn pomocí ID, musí mít id
atribut. Máme div
prvek s ID demo
.
<div id="demo">Access me by ID</div>
V Konzoli , získáme prvek a přiřadíme jej k demoId
proměnná.
const demoId = document.getElementById('demo');
Protokolování demoId
do konzole vrátí celý náš HTML element.
console.log(demoId);
Konzole<div id="demo">Access me by ID</div>
Změnou border
si můžeme být jisti, že přistupujeme ke správnému prvku vlastnost na purple
.
demoId.style.border = '1px solid purple';
Jakmile tak učiníme, naše aktivní stránka bude vypadat takto:
Přístup k prvku pomocí ID je efektivní způsob, jak rychle získat prvek v DOM. Má však nevýhody; ID musí být pro stránku vždy jedinečné, a proto budete mít vždy přístup pouze k jednomu prvku najednou pomocí getElementById()
metoda. Pokud byste chtěli přidat funkci k mnoha prvkům na stránce, váš kód by se rychle stal opakujícím se.
Přístup k prvkům podle třídy
Atribut třídy se používá pro přístup k jednomu nebo více konkrétním prvkům v DOM. Všechny prvky s daným názvem třídy můžeme získat pomocí getElementsByClassName()
metoda.
document.getElementsByClassName()
Nyní chceme přistupovat k více než jednomu prvku a v našem příkladu máme dva prvky s demo
třída.
<div class="demo">Access me by class (1)</div>
<div class="demo">Access me by class (2)</div>
Pojďme k našim prvkům v Konzoli a vložte je do proměnné s názvem demoClass
.
const demoClass = document.getElementsByClassName('demo');
V tomto okamžiku si můžete myslet, že můžete upravit prvky stejným způsobem, jako jste to udělali v příkladu ID. Pokud se však pokusíme spustit následující kód a změnit border
vlastnost demo prvků třídy na oranžovou, dostaneme chybu.
demoClass.style.border = '1px solid orange';
KonzoleUncaught TypeError: Cannot set property 'border' of undefined
Důvod, proč to nefunguje, je ten, že místo pouhého získání jednoho prvku máme objekt prvků podobný poli.
console.log(demoClass);
Konzole(2) [div.demo, div.demo]
Pole JavaScriptu musí být přístupné s číslem indexu. Můžeme tedy změnit první prvek tohoto pole pomocí indexu 0
.
demoClass[0].style.border = '1px solid orange';
Obecně při přístupu k prvkům podle třídy chceme použít změnu na všechny prvky v dokumentu s touto konkrétní třídou, ne pouze na jednu. Můžeme to udělat vytvořením for
smyčka a procházení každé položky v poli.
for (i = 0; i < demoClass.length; i++) {
demoClass[i].style.border = '1px solid orange';
}
Když spustíme tento kód, naše aktivní stránka se vykreslí takto:
Nyní jsme vybrali každý prvek na stránce, který má demo
třídu a změnil border
vlastnost na orange
.
Přístup k prvkům podle značky
Méně specifickým způsobem přístupu k více prvkům na stránce by byl název značky HTML. K prvku přistupujeme po značce s getElementsByTagName()
metoda.
document.getElementsByTagName()
V našem příkladu značky používáme article
prvky.
<article>Access me by tag (1)</article>
<article>Access me by tag (2)</article>
Stejně jako při přístupu k prvku pomocí jeho třídy getElementsByTagName()
vrátí objekt prvků podobný poli a každou značku v dokumentu můžeme upravit pomocí for
smyčka.
const demoTag = document.getElementsByTagName('article');
for (i = 0; i < demoTag.length; i++) {
demoTag[i].style.border = '1px solid blue';
}
Po spuštění kódu bude aktivní stránka upravena takto:
Smyčka změnila border
vlastnost všech article
prvků na blue
.
Výběry dotazů
Pokud máte nějaké zkušenosti s jQuery API, možná znáte metodu jQuery pro přístup k DOM pomocí CSS selektorů.
$('#demo') // returns the demo ID element in jQuery
Totéž můžeme udělat v prostém JavaScriptu s querySelector()
a querySelectorAll()
metody.
document.querySelector()
document.querySelectorAll()
Pro přístup k jednomu prvku použijeme querySelector()
metoda. V našem souboru HTML máme demo-query
prvek
<div id="demo-query">Access me by query</div>
Selektor pro id
atribut je symbol hash (#
). Prvku můžeme přiřadit pomocí demo-query
id na demoQuery
proměnná.
const demoQuery = document.querySelector('#demo-query');
V případě selektoru s více prvky, jako je třída nebo značka, querySelector()
vrátí první prvek, který odpovídá dotazu. Můžeme použít querySelectorAll()
metoda pro shromáždění všech prvků, které odpovídají konkrétnímu dotazu.
V našem vzorovém souboru máme dva prvky s demo-query-all
třída, která se na ně vztahuje.
<div class="demo-query-all">Access me by query all (1)</div>
<div class="demo-query-all">Access me by query all (2)</div>
Selektor pro class
atribut je tečka nebo tečka (.
), takže ke třídě můžeme přistupovat pomocí .demo-query-all
.
const demoQueryAll = document.querySelectorAll('.demo-query-all');
Pomocí forEach()
můžeme použít barvu green
na border
vlastnost všech odpovídajících prvků.
demoQueryAll.forEach(query => {
query.style.border = '1px solid green';
});
S querySelector()
, hodnoty oddělené čárkami fungují jako operátor OR. Například querySelector('div, article')
bude odpovídat div
nebo article
, podle toho, co se v dokumentu objeví jako první. S querySelectorAll()
, hodnoty oddělené čárkami fungují jako operátor AND a querySelectorAll('div, article')
bude odpovídat všem div
a article
hodnoty v dokumentu.
Použití metod selektoru dotazů je extrémně výkonné, protože můžete přistupovat k jakémukoli prvku nebo skupině prvků v DOM stejným způsobem jako v souboru CSS. Úplný seznam selektorů naleznete v části Selektory CSS na Mozilla Developer Network.
Úplný kód JavaScript
Níže je kompletní scénář práce, kterou jsme provedli výše. Můžete jej použít pro přístup ke všem prvkům na naší vzorové stránce. Uložte soubor jako access.js
a načtěte jej do souboru HTML těsně před závěrečnou body
tag.
// Assign all elements
const demoId = document.getElementById('demo')
const demoClass = document.getElementsByClassName('demo')
const demoTag = document.getElementsByTagName('article')
const demoQuery = document.querySelector('#demo-query')
const demoQueryAll = document.querySelectorAll('.demo-query-all')
// Change border of ID demo to purple
demoId.style.border = '1px solid purple'
// Change border of class demo to orange
for (i = 0; i < demoClass.length; i++) {
demoClass[i].style.border = '1px solid orange'
}
// Change border of tag demo to blue
for (i = 0; i < demoTag.length; i++) {
demoTag[i].style.border = '1px solid blue'
}
// Change border of ID demo-query to red
demoQuery.style.border = '1px solid red'
// Change border of class query-all to green
demoQueryAll.forEach((query) => {
query.style.border = '1px solid green'
})
Můžete pokračovat v práci na těchto souborech šablon a provést další změny pomocí přístupu k prvkům HTML.
Závěr
V tomto tutoriálu jsme prošli 5 způsoby přístupu k prvkům HTML v DOM – podle ID, třídy, názvu značky HTML a selektoru. Metoda, kterou použijete k získání prvku nebo skupiny prvků, bude záviset na podpoře prohlížeče a na tom, s kolika prvky budete manipulovat. Nyní byste měli mít jistotu přístupu k jakémukoli prvku HTML v dokumentu s JavaScriptem prostřednictvím DOM.