document
let p = document.querySelector("p")// HTML parser, pozor na XSS!p.innerHTML = "<strong>toto je test</strong>"// jen textp.textContent = "<strong>toto je test</strong>"
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.
...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
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)
class
let p = document.querySelector("p")p.className = "class1"p.classList.add("class2")p.classList.remove("class3")p.classList.contains("class2") // truep.classList.toggle("class4")p.classList.toggle("class4", x > 15)
let func = function(e) { alert("...")}document.body.addEventListener("click", func, false)
Co je na událostech zajímavého?
addEventListener
?target
(místo události), currentTarget
(místo posluchače), timeStamp
, type
stopPropagation
a preventDefault
keydown
, keypress
, keyup
ctrlKey
, altKey
, shiftKey
, metaKey
key
code
key
Staré, zpětně kompatibilní API
keyCode
charCode
String.fromCharCode
převede na znakmousedown
, mouseup
, click
, mouseover
, mouseout
, mousemove
clientX
a clientY
– souřadnice kurzoru vůči průhledubutton
je tlačítko (0 = levé, 1 = prostřední, 2 = pravé)touchstart
, touchmove
, touchend
, (gesturechange
)touches
– pole všech dotykůchangedTouches
– pole změněných dotykůtargetTouches
– pole dotyků na cílovém prvkuHybrid mezi mouse
a touch
. Společné pro myš, dotyk, stylus…
pointerdown
, pointermove
, pointerup
pointerenter
, pointerleave
element.setPointCapture()
, element.releasePointCapture()
pointer-events
focus
, blur
input
, change
, submit
scroll
, resize
DOMContentLoaded
addEventListener
je useCapture, nebo konfigurační objekt (viz dále)stopPropagation()
stopImmediatePropagation()
preventDefault()
s tím nijak nesouvisíload
, unload
focus
, blur
Třetí parametr může být též objekt s vlastnostmi:
once
capture
passive
: slib, že posluchač nezavolá preventDefault()
signal
: instance funkce AbortSignal
, použitelná k odebrání posluchače...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
Varianta 1: posluchač je funkce
window.addEventListener("load", function(e) { alert(e.currentTarget == this)});
this
je prvek, na kterém je posluchač zavěšen (nikoliv ten, kde událost vznikla)bind
Varianta 2: posluchač je objekt
let obj = { handleEvent(e) { alert(this == obj) }}window.addEventListener("load", obj)
obj
musí mít metodu handleEvent
this
je posluchačclass
dataset
<li data-order-status="shipped">...</li>
let li = document.querySelector("li")console.log(li.dataset.orderStatus) // "shipped"
<ul> <li>...</li> <li>...</li> <li>...</li></ul>
let ul = document.querySelector("ul")ul.addEventListener("click", e => { console.log("kliknuto na", ...) // ???})
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)})
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)})
?