KAJ 04

DOM, události

Vybrané partie DOM API

DOM: úpravy podstromu

let p = document.querySelector("p")
// HTML parser, pozor na XSS!
p.innerHTML = "<strong>toto je test</strong>"
// jen text
p.textContent = "<strong>toto je test</strong>"

DOM: tvorba nových prvků

let p = document.querySelector("p")
let strong = document.createElement("strong")
p.appendChild(strong)
let text = document.createTextNode("toto je test")
p.appendChild(text)
let input = document.createElement("input")
input.type = "number"
input.id = "foo"

Metody createTextNode, appendChild (a jejich sourozenci) dnes patří spíš do muzea.

DOM: "nové" rozhraní ParentNode

...i DOM prochází průběžnou modernizací.

let p = document.querySelector("p")
let strong = document.createElement("strong")
p.append("AAA", strong, "BBB")
p.prepend(strong, "test")
console.log(p.children) // pouze značky, nikoliv text

DOM: "nové" rozhraní ChildNode

let p1 = document.querySelector("p")
p1.remove()
let p2 = document.querySelector("p")
p2.replaceWith(p1, "test")
p2.before("AAA", "BBB", p3)
p2.after("AAA", "BBB", p3)

DOM: práce s atributem class

let p = document.querySelector("p")
p.className = "class1"
p.classList.add("class2")
p.classList.remove("class3")
p.classList.contains("class2") // true
p.classList.toggle("class4")
p.classList.toggle("class4", x > 15)

Události: opáčko

Události: opáčko

let func = function(e) {
alert("...")
}
document.body.addEventListener("click", func, false)

Události: opáčko

Co je na událostech zajímavého?

Události: objekt události

Události klávesnice

Události klávesnice

Staré, zpětně kompatibilní API

Události myši

Události dotykové

Pointer events

Hybrid mezi mouse a touch. Společné pro myš, dotyk, stylus…

Události ostatní

Capture a bubble #1

Capture a bubble #2

Capture a bubble #3

Konfigurační objekt

Třetí parametr může být též objekt s vlastnostmi:

Odebrání posluchače pomocí AbortSignal

...není zásadně užitečné, ale bude se hodit příště.

let controller = new AbortController()
node.addEventListener("click", f, {signal: controller.signal})
/* ... */
controller.abort() // odebrani posluchace

Posluchače událostí

Varianta 1: posluchač je funkce

window.addEventListener("load", function(e) {
alert(e.currentTarget == this)
});

Posluchače událostí

Varianta 2: posluchač je objekt

let obj = {
handleEvent(e) {
alert(this == obj)
}
}
window.addEventListener("load", obj)

data-* atributy

<li data-order-status="shipped">...</li>
let li = document.querySelector("li")
console.log(li.dataset.orderStatus) // "shipped"

Delegování událostí

<ul>
<li>...</li>
<li>...</li>
<li>...</li>
</ul>
let ul = document.querySelector("ul")
ul.addEventListener("click", e => {
console.log("kliknuto na", ...) // ???
})

Delegování událostí

AKA Event Delegation

<ul>
<li data-product-id="42">...</li>
</ul>
ul.addEventListener("click", e => {
let li = e.target.closest("[data-product-id]")
let productId = li.dataset.productId
console.log("kliknuto na", productId)
})

Delegování událostí

AKA Event Delegation

<ul>
<li data-product-id="42">
<button name="confirm">...</button>
<button name="delete">...</button>
</li>
</ul>
ul.addEventListener("click", e => {
let button = e.target.closest("button[name]")
if (!button) { return }
let li = button.closest("[data-product-id]")
console.log(button.name, li.dataset.productId)
})

Prostor pro otázky

?