Lezione 2
L’oggetto principale per l’interazione con il browser è window: esso rappresenta una finestra che contiene un documento HTML. Quindi ciascuna finestra o tab ha associato un proprio oggetto window e, allo stesso modo, a ciascun frame definito in una pagina HTML corrisponde un oggetto window.
Questo oggetto, oltre ad identificare l’elemento visivo del browser, rappresenta anche il contesto di esecuzione globale per JavaScript, cioè l’oggetto all’interno del quale vengono definite variabili e funzioni globali. Esso è inoltre l’oggetto associato alla parola chiave this quando non esiste un contesto specifico.
window.innerWidth; // LARGHEZZA DELLA FINESTRA CORRENTE
window.innerHeight; // ALTEZZA DELLA FINESTRA CORRENTE
window.screen.width; // LARGHEZZA DELLO SCHERMO
window.screen.height; // ALTEZZA DELLO SCHERMO
Le proprietà innerHeight e innerWidth ci consentono di ottenere le dimensioni interne dell’area occupata dalla finestra espresse in pixel.
La proprietà screen dell’oggetto window ci fornisce informazioni su alcune caratteristiche dello schermo del dispositivo corrente. Possiamo ad esempio conoscere le dimensioni in pixel utilizzando le proprietà width e height.
alert( 'Questo è un messaggio di avviso' );
confirm( 'Questo è un messaggio di richiesta di conferma.' );
var nome = prompt("Inserisci il tuo nome");
if (nome != null) {
// ...
}
window.open("https://www.kaleidoscope.it", "_blank");
// _blank => nuova finestra
// _self => stessa finestra
function avvisa() {
alert('Timer eseguito!');
}
let myTimer = setTimeout(avvisa, 5000);
let x = 0;
let myTimer;
function eseguiIntervallo() {
x++;
if ( x > 10 ) {
clearInterval(myTimer);
}
}
myTimer = setInterval( eseguiIntervallo, 1000);
Il metodo setTimeout() crea un timer che eseguirà la funzione specificata come primo parametro dopo N millisecondi. Il valore restituito dalla funzione è l’identificatore del timer appena creato.
Per eseguire una funzione ad intervalli regolari facciamo ricorso a setInterval().
history.back(); // TORNA ALLA PAGINA PRECEDENTE
history.go(-3); // TORNA ALLA TERZ'ULTIMA PAGINA
// ESEMPIO: https://www.kaleidoscope.it:8080/articoli/articolo.php?id=123#paragrafo
location.href; // restituisce https://www.kaleidoscope.it:8080/articoli/articolo.php?id=123#paragrafo
location.protocol; // restituisce https
location.hostname; // restituisce www.kaleidoscope.it
location.port; // restituisce 8080
location.origin; // restituisce https://www.kaleidoscope.it:808
location.pathname; // restituisce /articoli/articolo.php
location.search; // restituisce ?id=123
location.hash; //restituisce #paragrafo
location.reload(); // ricarica la pagina
L’oggetto window del browser ci fornisce anche alcuni meccanismi per gestire e controllare la navigazione dell’utente: history, per tenere traccia della navigazione e location che ci permette di gestire l’URL corrente.
Il DOM fornisce una rappresentazione del documento come una composizione gerarchica di oggetti, spesso chiamata DOM tree. Questo albero di oggetti è pensato per essere facilmente accessibile tramite JavaScript non soltanto in lettura, ma anche per poter cambiare dinamicamente la sua struttura, il contenuto e lo stile.
<!DOCTYPE html>
<html>
<head>
<title>Pagina d'esempio</title>
</head>
<body>
<div>
<h1>Titolo</h1>
<p>Questo è un paragrafo</p>
<img src="img.jpg" alt="Immagine">
</div>
</body>
</html>
Possiamo accedere agli elementi della pagina utilizzando diversi criteri di selezione.
Se nella pagina corrente abbiamo un elemento con un certo valore per l’attributo id, possiamo utilizzare il metodo getElementById() dell’oggetto document per selezionarlo.
Tra le novità più introdotte più di recente nelle specifiche del DOM c’è la possibilità di selezionare gli elementi di una pagina utilizzando i selettori CSS. Due sono i metodi che consentono questo approccio: querySelector() e querySelectorAll(). L’uno restituisce il primo elemento trovato, l’altro l’elenco di tutti gli elementi individuati dal selettore.
// index.html
<p id="mioParagrafo">Questo è un paragrafo</p>
<p>Questo è un altro paragrafo</p>
// main.js
let p = document.getElementById("mioParagrafo");
let listaParagrafi = document.querySelectorAll("p");
Una volta individuato l’elemento o gli elementi presenti su una pagina, possiamo modificarne il contenuto o altre caratteristiche sfruttando proprietà e metodi specifiche dei nodi di tipo elemento. Ad esempio, la proprietà innerHTML rappresenta il contenuto HTML di un elemento ed è accessibile sia in lettura che in scrittura.
let p = document.getElementById("mioParagrafo");
p.innerHTML = "Testo del paragrafo";
p.style.color = "red";
Alcuni metodi del DOM ci consentono di analizzare e muoverci all’interno della struttura di un documento. Ad esempio, la proprietà childNodes di un elemento contiene l’elenco dei nodi figli dell’elemento sotto forma di NodeList.
// index.html
<div id="mainDiv">
<h1>Titolo</h1>
<p>Un paragrafo</p>
<p>Un altro paragrafo</p>
</div>
// main.js
let div = document.getElementById("mainDiv");
for (let i = 0; i < div.childNodes.length; i++) {
console.log(div.childNodes[i].innerHTML);
}
Oltre a modificare il contenuto HTML e gli attributi di un elemento, il DOM ci consente di modificare la struttura di un documento. Possiamo ad esempio creare elementi ed attributi e aggiungerli al DOM avendo un effetto immediato sulla pagina HTML.
// index.html
<div id="mainDiv">
<h1>Titolo</h1>
<p>Un paragrafo</p>
<p>Un altro paragrafo</p>
</div>
// main.js
let mainDiv = document.getElementById("mainDiv");
let img = document.createElement("img");
let srcAttr = document.createAttribute("src");
srcAttr.value = "default.png";
img.setAttributeNode(srcAttr);
mainDiv.appendChild(img);
Per associare eventi ad elementi (quali sono click, doppio click, over del mouse, ecc.) ed eseguire funzioni ad esse associate, si possono usare 3 metodi:
- via js, con l'istruzione addEventListener
- via html attraverso alcuni attributi
// main.js
elemento.addEventListener(evento, callback, [useCapture]);
// index.html
<a href="#" id="test">test</a>
// main.js
function clickOnTest(event){
alert('Click su test');
}
let test = document.getElementById('test');
test.addEventListener('click', clickOnTest);
// index.html
<a href="#" onclick="alert('ciao')">Link</a>
<a href="#" onclick="alert(this.innerHTML)">Ciao</a>
L’evento load si verifica quando un oggetto viene caricato dal browser.
Altri eventi che possiamo classificare come eventi legati al browser sono l’evento scroll e l’evento resize.
Il primo si verifica quando il contenuto di un elemento scorre per consentirne la visualizzazione, mentre il secondo si verifica quando cambiano le dimensioni di un elemento.
// main.js
function inizializza() {
alert('Pagina inizializzata!');
}
window.addEventListener("load", inizializza);
function scrollInCorso() {
console.log(window.pageXOffset + "," + window.pageYOffset);
}
window.addEventListener("scroll", scrollInCorso);
window.onresize = function() {
console.log(window.innerWidth + "," + window.innerHeight);
};
<script>
let myParagrafo = document.getElementById("paragrafo");
myParagrafo.ondblclick = function(e) {
e.target.innerHTML = "Hai fatto doppio click sul paragrafo!";
};
</script>
<p id="paragrafo">Clicca su questo paragrafo</p>
clientX e clientY : coordinate del mouse rispetto alla finestra
pageX e pageY : coordinate del mouse rispetto alla pagina
// index.html
// RENDIAMO L'IMMAGINE TRASCINABILE
<img id="miaImmagine" src="images/img.jpg" draggable="true""/>
<div id="target"></div>
// main.js
let img = document.getElementById("miaImmagine");
// L'EVENTO ON DRAG START, CI PERMETTE DI INTERCETTARE
// IL MOMENTO IN CUI L'UTENTE STA INIZIANDO A TRASCINARE L'ELEMENTO
img.ondragstart = function(e) {
e.dataTransfer.setData("text", e.target.id);
}
let divTarget = document.getElementById("target");
divTarget.ondragover = function(e) {
e.target.className = "overClass";
e.preventDefault();
}
divTarget.ondrop = function(e) {
var data = e.dataTransfer.getData("text");
e.target.appendChild(document.getElementById(data));
}
// main.js
txtInput.onkeypress = function(e) {
let keyCode = e.keyCode;
alert('Premuto il tasto numero: ' + keyCode );
}
// 8 => BACKSPACE
// 9 => TAB
// 13 => ENTER
// 32 => SPACE