Web-fejlesztés 2.
Visnovitz Márton
egyetemi tanársegéd
visnovitz.marton@inf.elte.hu
@elte-fi/courses-tt-webprog
Eddig: a canvas
HTML elem programozása a Canvas API segítségével
Most: tetszőleges HTML elem programozása a DOM API segítségével
document
A forrás és a DOM eltérhet egymástól.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<p>Lorem ipsum.</p>
<p class="active">
Dolor sit amet.
</p>
</body>
</html>
┣ DOCTYPE: html
┣ HTML
┣━━ HEAD
┣━━━━ #text:
┣━━━━ META charset="utf-8"
┣━━━━ #text:
┣━━━━ TITLE
┣━━━━ #text:
┣━━ #text:
┣━━ BODY
┣━━━━ #text:
┣━━━━ P
┣━━━━━━ #text: Lorem ipsum.
┣━━━━ #text:
┣━━━━ P class="active"
┣━━━━━━ #text: Dolor sit amet.
┣━━━━ #text:
┗━━ #text:
CSS szelektorral:
Egy elem: | document.querySelector(sel) |
Több elem: | document.querySelectorAll(sel) |
Name:
<input id="name" value="Luke">
<button>Click me!</button>
<script>
console.log( document.querySelector("#name") );
console.log( document.querySelectorAll("form > *") );
</script>
névvel | button |
azonosítóval | #navbar |
stílusosztállyal | .important |
attribútummal | [name=password] |
univerzális | * |
kombinálva | input.error[type=text] |
közvetlen gyerek | form >input |
leszármazott | #wrapper div |
következő testvér | ul + p |
utána jövő testvérek | ul ~ p |
<ul>
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
const listItems = document.querySelectorAll("ul > li");
// Array-like object (NodeList)
for (const li of listItems) { /*...*/ } // OK
listItems.map(li => /*...*/); // Wrong: not an array
// Transforming to array
const listItemsArray = Array.from(listItems); // OK
listItemsArray.map(li => /*...*/); // OK
elem.querySelector(sel)
elem.querySelectorAll(sel)
<div class="first">
<span>Apple</span>
</div>
<div class="second">
<span>Pear</span>
</div>
const secondDiv = document.querySelector("div.second");
const spanInSecondDiv = ✒>secondDiv<✒.querySelector("span");
HTML attribútum | DOM tulajdonság |
---|---|
type |
type |
value |
value |
readonly |
readOnly |
maxlength |
maxLength |
innerHTML
, innerText
: az elem nyitó- és záróelem közötti HTML vagy szöveg<p>This is a <span>text</span></p>
const p = document.querySelector("p");
// Reading
p.innerHTML; // "This is a <span>text</span>"
p.innerText; // "This is a text"
// Writing
p.innerHTML = "This is a <strong>new</strong> text";
Name:
Name: <input type="text" id="name">
<button id="hello">Say hello!</button>
<br>
<span id="output"></span>
function greet(name) {
return `Hello, ${name}!`;
}
// Reading
const input = document.querySelector('#name');
const name = input✒>.value<✒;
// Writing
const output = document.querySelector('#output');
output✒>.innerHTML<✒ = greet(name);
Eddig: globális eseménykezelés, nincs elemhez rendelve
Most: egy adott elemen történő eseménykezelés
elem.addEventListener("eventType", eventHandler)
const button = document.querySelector("button");
function handleButtonClick() {
console.log("clicked");
}
✒>button<✒.addEventListener("click", handleButtonClick);
Name: <input type="text" id="name">
<button id="hello">Say hello!</button>
<br>
<span id="output"></span>
function greet(name) {
return `Hello ${name}!`;
}
const input = document.querySelector("#name");
const output = document.querySelector("#output");
const hello = document.querySelector("#hello");
function handleHelloClick() {
const name = input.value;
const greeting = greet(name);
output.innerHTML = greeting;
}
hello.addEventListener("click", handleHelloClick);
// Typical JavaScript program:
// Reading (from DOM)
// Processing (independent from I/O)
// Writing (to DOM)
<!-- Reading -->
<input type="checkbox" id="accept" checked>
<script>
const elfogad = document.querySelector("#accept").checked;
</script>
<!-- Writing -->
<img src="" id="image">
<script>
const url = "http://images.io/example.png";
const image = document.querySelector("#image");
image.src = url;
</script>
<input type="radio" name="gender" value="male" checked> Male
<input type="radio" name="gender" value="female"> Female
Maiden name: <input id="maidenName">
<script>
// Reading
const femaleRadio =
document.querySelector("[name=gender][value=female]");
const isFemale = famaleRadio.checked;
// Writing
document.querySelector("#maidenName").hidden = !isFemale;
</script>
document.querySelector("selector")
elem.addEventListener("click", handleElemClick)
value
)innerHTML
, innerText