...

Lezione7_Eventi

by user

on
Category: Documents
24

views

Report

Comments

Transcript

Lezione7_Eventi
Gestire Gli Eventi
Roberto Bruni e Daniela Giorgetti
Capire gli eventi
• JS è un linguaggio fortemente event-driven
– l’utente interagisce con la pagina muovendo il
mouse, cliccando, digitando, etc
– la pagina cerca di reagire opportunamente a
queste sollecitazioni
– il gestore dell’evento è una funzione che
risponde alla “mossa” dell’utente (o
dell’ambiente)
– possiamo catturare eventi e gestirli
Bruni e Giorgetti
2
Dove vivono i gestori?
• vengono “celati” tra gli attributi dei tag
HTML
• La sintassi solitamente è del tipo
< … onEvento=“comandoJS” … >
• il comando può essere
– la semplice invocazione di una funzione,
– ma anche una sequenza di comandi complessi
(sconsigliato)
Bruni e Giorgetti
3
Avvertenza
• Usando codice in-line (sconsigliato)
piuttosto che chiamate a funzioni (meglio) il
gestore può essere specificato su più linee
usando “;” per separare i comandi
• centralizzare il codice nella head del documento
rende più facile la manutenzione e l’aggiornamento
• Abbiamo già visto esempi di eventi e
gestori… rivediamoli in dettaglio
Bruni e Giorgetti
4
onLoad
• L’apertura di una pagina o di un frameset è
il momento ideale per far partire routine JS
• usare tag <BODY> o <FRAMESET>
• l’evento load viene lanciato quando il browser
finisce di caricare una pagina o tutti i frame della
pagina
• l’oggetto window è l’unico che può gestire questo
evento
• es. controllo del browser in uso
Bruni e Giorgetti
5
L’eccezione
• Anche l’oggetto Image ha il gestore di
evento onLoad
• scatta quando l’immagine viene visualizzata dal
browser
• notare quindi che non avviene durante il
caricamento, ma solo al momento della
presentazione nella pagina
Bruni e Giorgetti
6
onUnload
• Scatenato appena prima di uscire dal
documento
• gestito a livello di <BODY> o <FRAMESET>
• es. pulire l’ambiente chiudendo finestre aperte
durante la visita… anche se magari l’utente potrebbe
non apprezzare. In questi casi meglio chiedere
conferma
• es. per essere cordiali con i visitatori della vostra
pagina: benvenuto, arrivederci
Bruni e Giorgetti
7
Prompt, alert e… confirm
• Un altro metodo per interagire con l’utente
– finestra confirm
– pone una domanda con due sole risposte
possibili: si o no!
– confirm(domanda) apre una nuova finestrella
con la domanda e due pulsanti (ok e annulla)
• se l’utente preme ok, restituisce true
• se l’utente preme annulla, restituisce false
Bruni e Giorgetti
8
onError
• Supportato da JS1.1+
• Gli oggetti Window e Image prevedono un
gestore di errori che permette di accorgersi
di errori di caricamento del documento o
dell’immagine
• errore di sintassi JS
• errore runtime JS
• non cattura errori del browser (es. server
che non risponde)
Bruni e Giorgetti
9
onAbort
• Supportato da JS1.1+ per oggetti Image
• a seconda delle dimensioni di un’immagine,
l’utente potrebbe decidere di interromperne
il caricamento prima che sia completato
• si può catturare l’evento “abort” del caricamento
dell’immagine
• es. per far comparire un messaggio di alert che
spieghi che la pagina risulterà incompleta
Bruni e Giorgetti
10
onClick
• Scatenato quando l’utente “clicca” su un elemento
(cliccabile) della pagina
• avviene dopo il rilascio del pulsante del mouse!
• si applica a pulsanti,
• <input type=“button” onclick=“…” />
• <input type=“submit” onclick=“…” />
• <input type=“reset” onclick=“…” />
• checkbox (<input type=“checkbox” onclick=“…” />),
• radio button ( <input type=“radio” onclick=“…” /> ),
• e link (<a onclick=“…” > … </a>)
– Per pulsanti di reset e submit, checkbox, radio e link
è opportuno restituire false per cancellare l’azione o
true per confermarla (es. può essere usato per richieste
di conferma prima di eseguire l’azione)
Bruni e Giorgetti
11
Immagini dinamiche
• Una caratteristica interessante di JS è la possibilità
di cambiare le immagini dinamicamente e quindi
rendere la pagina più “vivace”
• Limitazioni:
– si possono cambiare le immagini ma non aggiungerne
di nuove o rimuoverle (trucchi possibili: altezza e
larghezza negative, DHTML e layers)
– si possono variare le dimensioni ma bisogna stare
attenti all’effetto sull’impaginazione del documento
– ogni immagine dovrà essere scaricata dal server (non
molto pratico per animazioni complesse e immagini
troppo grandi)
Bruni e Giorgetti
12
Click su immagini
• Abbiamo già visto come associare il cambio delle
immagini al click su un pulsante
• Spesso è utile (ed elegante) associare delle azioni
ad immagini piuttosto che a pulsanti
• ma lo standard non prevede che il tag <IMG />
possa rispondere al click del mouse
• la gestione può avvenire attraverso link (2 modi)
1) <a href=“javascript:funzioneJS()”>
<img src=“URLfig” border=0 /></a>
2) <a onclick=“funzioneJS()”>
<img src=“URLfig” border=0 /></a>
Bruni e Giorgetti
13
onMouseOver
• Avviene quando si passa sopra un link o una
area (onMouseOut è complementare)
• Come navigatori web avrete notato che muovendo il
cursore sopra i link si fa comparire la URL associata
• Analogamente, catturando l’evento onMouseOver
possiamo, ad esempio, visualizzare dei messaggi
nella barra di stato
• Con JS1.1+ onMouseOver e onMouseOut sono
gestibili anche sulle aree di mappe immagine
• Per usare la barra di stato
(window.status=“testo”) bisogna
restituire true
Bruni e Giorgetti
14
Abuso dello standard
• La danza dei dinosauri sfrutta gli eventi
onMouseOver direttamente nei tag
immagine (non nelle aree o nei link)
• Anche l’evento onClick può essere
catturato nei tag <img /> (con IE funziona)
• Però è sempre meglio cercare di non uscire
dalle specifiche standard!
Bruni e Giorgetti
15
Rollovers I
• L’uso più diffuso di immagini dinamiche avviene
con i rollover
– immagini che cambiano quando il cursore si sposta
sopra di loro e che tornano allo stato originale quando il
cursore le abbandona
• generalmente si usano le controparti “negative”, o con colori
diversi, o con bordi speciali
• solitamente le immagini con rollover sono
associate a link (formano un menu di navigazione)
– l’effetto rollover evidenzia il link che stiamo per
scegliere
Bruni e Giorgetti
16
Rollovers II
<body>
<a href=“cani.html”
onmouseover=“basset();”
onmouseout=“bulldog();”>
<img name=“cane” id=“cane”
border=“0” width=“100” height=“100”
src=“bulldog_big_barking_md_wht.gif” /></a>
<a href=“dinosauri.html”
onmouseover=“gallim();”
onmouseout=“dino();”>
<img name=“dinosauro” id=“dinosauro”
border=“0” width=“100” height=“100”
src=“cute_dino_hopping_md_wht.gif” /></a>
</body>
Bruni e Giorgetti
17
Rollovers III
<script type=“text/javascript”>
<!-function basset() {
document.cane.src = “basset_howl_md_wht.gif”;
}
function bulldog() {
document.cane.src = “bulldog_big_barking_md_wht.gif”;
}
function gallim() {
document.dinosauro.src = “gallimim_threat_md_wht.gif”;
}
function dino() {
document.dinosauro.src=“cute_dino_hopping_md_wht.gif”;
}
//-->
</script>
Bruni e Giorgetti
18
Quiz riassuntivi
– Quale attributi NON potrebbero essere associati al tag
<IMG /> ?
• onload
• onabort
• onunload
• onclick
• onmouseover
– Come si fa a evitare che un utente esca dalla nostra pagina
main.html?
• non si può
• aggiungendo nel tag di <body> il gestore
onload=“window.location.href=‘main.html’”
• aggiungendo nel tag di <body> il gestore
onunload=“window.location.href=‘main.html’”
• aggiungendo nel tag di <body> il gestore
onunload=“window.open(‘main.html’)”
Bruni e Giorgetti
19
Esercizi
Bruni e Giorgetti
20
Eventi e Form
onSubmit
• scatenato dal click sul pulsante di submit
di una form
• deve essere catturato nel tag <FORM>
• Importante: restituire true o false
• con true la submit avverrà
• con false la submit sarà annullata
• es. validazione di form prima della
spedizione
Bruni e Giorgetti
22
onClick+onSubmit
• onSubmit avviene subito dopo che
onClick sul pulsante di submit è andato a
buon fine
FORM
Submit
NO
non spedita
onClick
NO
YES
onSubmit
non spedita
YES
ACTION
Bruni e Giorgetti
23
onReset
• supportato da JS1.1+
• scatenato dal click sul pulsante di reset
• gestibile dal tag <FORM>
• es. chiedere conferma dell’azzeramento dei dati
immessi
Bruni e Giorgetti
24
Form con conferme I
<body>
<form onsubmit=“return sicuroFormSubmit();”
onreset=“return sicuroFormReset();”
method=“POST” action=“mailto:[email protected]”>
Scegli un numero da 0 a 99:
<input type=“test” name=“numero” value=“0”
size=“2” maxlength=“2” />
<input type=“submit”
onclick=“return sicuroButtonSubmit();” />
<input type=“reset”
onclick=“return sicuroButtonReset();” />
</form>
</body>
Bruni e Giorgetti
25
Form con conferme II
<head><title>Sicuro Sicuro Sicuro?</title>
<script type="text/javascript">
<!-function sicuroButtonSubmit() {
return confirm(“Sicuro del Submit?”); }
function sicuroFormSubmit() {
return confirm(“Sicuro sicuro del Submit?"); }
function sicuroButtonReset() {
return confirm(“Sicuro del Reset?"); }
function sicuroFormReset() {
return confirm("Sicuro sicuro del Reset?"); }
//-->
</script>
</head>
Bruni e Giorgetti
26
onFocus
• Ricezione del “focus” da parte di un campo
• es. l’utente si sposta con tab oppure col mouse
(cliccando)
• gestito a livello di singolo campo
• in ogni momento, al più un oggetto ha il focus
• es. selezionare automaticamente il contenuto del
campo in risposta all’evento (gli eventi possono
anche essere scatenati dal codice, eh eh!)
• In JS1.1+ si applica anche ad oggetti
window, frame e frameset
• nel qualcaso deve essere gestito nel tag <BODY>
Bruni e Giorgetti
27
onChange
• Scatenato dalla modifica di alcuni dati
• Si verifica quando viene cambiato il valore di un
campo della form ed il campo perde il focus
– validazione di campo piuttosto che della form completa
– es. garantire che il contenuto di un certo campo sia
sempre in lettere maiuscole/minuscole
<form name=“modulo”>
<input type=“text” name=“cognome”
onchange=“document.modulo.cognome.value =
document.modulo.cognome.value.toUpperCase()” />
</form>
Bruni e Giorgetti
28
onBlur
• Scatenato dalla perdita del focus (duale di
onFocus)
• con JS1.1+ si applica anche ad oggetti window,
frame e frameset, gestendolo nel <BODY>
• es. garantire che un campo non rimanga vuoto
• simile ad onChange:
• onChange si verifica meno spesso
• onBlur permette un controllo più accurato
Bruni e Giorgetti
29
onFocus+onChange+onBlur
• La sequenza con cui vengono generati è la
seguente (immaginiamo di andare
sull’elemento 1, modificarlo e poi passare
all’elemento 2 di una form)
elemento 1
elemento 2
onFocus
onChange
onFocus
onBlur
Bruni e Giorgetti
30
onSelect
• Il nome non tragga in confusione: non si
riferisce al tag <SELECT>!
• Avviene quando l’utente seleziona il testo di
una casella di input di tipo text oppure di
una textarea
• Raramente gestito
• utile invece scatenare l’evento select dal codice JS
per suggerire all’utente di modificare
completamente il contenuto del campo.
Bruni e Giorgetti
31
Eventi e elementi delle form
onblur
onchange onclick
onfocus
text



password



file



button



submit



reset



checkbox



radio



select



textarea



Bruni e Giorgetti
32
Eventi e elementi delle pagine
body
onload
onunload
img
onabort
onerror
onload
link
onmouseout
onmouseover
onclick
form
onreset
onsubmit
• Ma in IE4+ tutti gli elementi HTML hanno molti
altri eventi associati (non sempre supportati allo
stesso modo da NN)
–
–
–
–
onclick, ondblclick,
onkeydown, onkeypress, onkeyup,
onmouseover, onmouseout,
onmousedown, onmouseup, onmousemove
Bruni e Giorgetti
33
Esempio
function topoSxDx(e) {
if (e.which==1) { alert(“Sinistro”); }
{ alert(“Destro”); }
} // definisce il gestore (ok su NN6)
document.onmousedown = topoSxDx; // assegna gestore
/* il parametro “e” è un oggetto di tipo Event:
e.which: valore numerico che indica il tasto o pulsante
del mouse premuti
e.type: il tipo dell’evento (es. mouseover)
e.target: l’elemento dove è avvenuto l’evento
e.modifiers: lista di altri tasti speciali premuti
(Ctrl, Alt, Shift)
… altri che non vediamo
*/
Bruni e Giorgetti
34
Gestori dinamici
function gA() { … }
function gB() { … }
…
if (choice != “A”) {
document.f1.b1.onclick=gB; }
…
<form name=“f1”
<input type=“button” name=“b1” onClick=“gA()” />
notare che
document.f1.b1.onclick=gB()
avrebbe invocato la funzione senza assegnarla al gestore
Bruni e Giorgetti
35
Generare eventi
• Tutti gli eventi visti possono essere simulati
e/o causati invocandoli sui rispettivi oggetti
• es. simulare il click su un pulsante invocando il
metodo click()
• notare che i link non dispongono di tale metodo
Bruni e Giorgetti
36
Eventi simulabili sulle form
blur()
select() click()
focus()
text



password



file



button



submit



reset



checkbox



radio



select



textarea


Bruni e Giorgetti

37
Quiz riassuntivi
– Quale attributi NON esistono ?
• onload
• onlink
• onrollover
• onblur
– Come si fa a evitare che il campo di input text pippo
della form disney venga modificato dall’utente?
• non si può
• aggiungendo nel tag di pippo il gestore
onfocus=“document.disney.pippo.blur();
document.disney.pluto.focus();”
• aggiungendo nel tag di pippo il gestore
onchange=“document.disney.pippo.focus();”
• aggiungendo nel tag di pippo il gestore
onchange=“document.disney.pippo.blur();”
Bruni e Giorgetti
38
Esercizi
Bruni e Giorgetti
39
Timer
Uso dei timer
• Con i timer, gli eventi (e le funzioni)
possono essere invocati ad intervalli di
tempo fissati
– esempi:
• aggiornare dati ad intervalli regolari (orologio)
• dare un tempo limite per riempire certi moduli
(esami)
• sfogliare le pagine automaticamente
• aprire nuovi banner (stendardi) pubblicitari
Bruni e Giorgetti
41
Ripetere a intervalli regolari
• setInterval(“funzione()”, tempo)
– questo comando prepara un timer che esegue i
comandi passati come primo argomento
(funzione()) ad intervalli di tempo fissati dal
secondo argomento (tempo)
• il tempo è espresso in millisecondi
– es. tmrId = setInterval(“aggiorna()”,1000)
– viene iterata fino a quando si effettua
• clearInterval(tmrId)
Bruni e Giorgetti
42
Esempio: Orologio I
<body onLoad=“setInterval('orologio()',1000);” >
<h2>&Egrave; il momento giusto per un break?</h2>
<form name = “orologio”>
Data:
<input type=“text” name=“data” size=“8” value=“” />
Ora:
<input type=“text” name=“ora” size=“8” value=“” />
</form>
</body>
Bruni e Giorgetti
43
Esempio: Orologio II
<script type="text/Javascript">
<!-- hide
var oraStr, dataStr;
function orologio() {
adesso = new Date();
giorno = adesso.getDate();
mese = adesso.getMonth()+1;
anno = adesso.getFullYear();
ore = adesso.getHours();
minuti = adesso.getMinutes();
secondi = adesso.getSeconds();
…
Bruni e Giorgetti
44
Esempio: Orologio III
…
dataStr = ((giorno < 10) ? "0" : "") + giorno ;
dataStr += ((mese < 10) ? "/0" : "/") + mese ;
dataStr += "/" + anno;
oraStr = ore;
oraStr += ((minuti < 10) ? ":0" : ":") + minuti;
oraStr += ((secondi < 10) ? ":0" : ":") + secondi;
document.orologio.data.value = dataStr;
document.orologio.ora.value = oraStr;
}
//-->
</script>
Bruni e Giorgetti
45
Eseguire dopo un certo tempo
• setTimeout(funzione, tempo)
– questo comando prepara un timer che esegue i
comandi passati come primo argomento
(funzione()) dopo l’intervallo di tempo
fissato dal secondo argomento (tempo)
• il tempo è espresso in millisecondi
– esegue una sola volta (non itera
automaticamente)
– spesso usata ricorsivamente (caricata una prima
volta con onLoad)
– es. tmrId = setTimeout(“buttaPasta()”,1000)
– clearTimeout(tmrId)
Bruni e Giorgetti
46
Esempio: Orologio IV
<body onLoad=“orologio();” >
<h2>&Egrave; il momento giusto per un break?</h2>
<form name = “orologio”>
Data:
<input type=“text” name=“data” size=“8” value=“” />
Ora:
<input type=“text” name=“ora” size=“8” value=“” />
</form>
</body>
Bruni e Giorgetti
47
Esempio: Orologio V
<script type="text/Javascript">
<!-- hide
var oraStr, dataStr;
function orologio() {
adesso = new Date();
giorno = adesso.getDate();
mese = adesso.getMonth()+1;
anno = adesso.getFullYear();
ore = adesso.getHours();
minuti = adesso.getMinutes();
secondi = adesso.getSeconds();
…
Bruni e Giorgetti
48
Esempio: Orologio VI
…
dataStr = ((giorno < 10) ? "0" : "") + giorno ;
dataStr += ((mese < 10) ? "/0" : "/") + mese ;
dataStr += "/" + anno;
oraStr = ore;
oraStr += ((minuti < 10) ? ":0" : ":") + minuti;
oraStr += ((secondi < 10) ? ":0" : ":") + secondi;
document.orologio.data.value = dataStr;
document.orologio.ora.value = oraStr;
setTimeout(“orologio()”,1000); // riattiva il timer
}
//-->
</script>
Bruni e Giorgetti
49
Effetto fading – ciclo attivo
function sfuma() {
for (i=0;i<255;i+=2) {
document.bgColor= i*256*256 + i*256;
aspetta(10); // introduce del ritardo
}
document.bgColor="#FFFF00";
}
function aspetta(ms) { // attende ms millisecondi
inizio=new Date();
tIn=inizio.getTime();
tFin=tIn;
while (tFin-tIn < ms) { dopo=new Date();
tFin=dopo.getTime(); }
}
<body text="#000000" bgcolor="#000000“
onload="sfuma()">
Bruni e Giorgetti
50
Effetto fading – con timer
var i=0; // variabile globale
function sfuma() {
if(i>253) {
document.bgColor="#00FFFF";
} else {
i+=1;
document.bgColor=i*256 + i;
setTimeout("sfuma()", 10); /* riattiva la
funzione sfuma() dopo 10 millisecondi */
}
}
<body text="#000000" bgcolor="#000000“
onLoad="sfuma()">
Bruni e Giorgetti
51
Esercizi
Bruni e Giorgetti
52
Fly UP