Per garantire certe qualità di un sito e mantenere il codice entro dimensioni contenute, sono state introdotte da diversi soggetti (Google, Yahoo, ma anche singoli web developer come John Resig) delle librerie di funzioni JavaScript (dette in gergo tecnico API, Application Programming Interface o anche Framework) che facilitano notevolmente il compito del programmatore.
In questa lezione iniziamo lo studio delle caratteristiche salienti della libreria jQuery che utilizzeremo per riscrivere alcuni degli esempi già visti.
La libreria jQuery.
jQuery (http://jquery.com/) è stata ideata e sviluppata da John Resig che ha pubblicato la prima versione nel 2005. Da allora ha subito diverse revisioni e aggiornamenti da parte di un gruppo sempre più folto di sviluppatori.
Si tratta di una libreria javascript cross-browser, free e open source .
Serve per velocizzare e facilitare la scrittura di script client-side:
- Selezionare e modificare elementi del DOM
- Manipolare CSS
- Creare animazioni ed effetti
- Gestire Eventi
jQuery va quindi intesa come un'estensione di JavaScript per superare le difficoltà di programmazione che nascono dal voler creare siti dinamici, accessibili ed usabili. D'ora in poi troveremo negli script codice JavaScript mescolato a codice jQuery.
La potenza di jQuery risiede nella facilità di individuare elementi di una pagina web mediante una estesa casisitica di selettori, delle espressioni (principalmente di tipo stringa, ma non solo) che permettono di identificare una lista di elementi di una pagina.
Ad esempio, per applicare un fade out (dissolvenza in uscita) ai tag <div> di un documento è sufficiente scrivere
I selettori vengono passati come argomenti della funzione jQuery() o del suo alias, la funzione $() (quest'ultima introdotta per mantenere un certa similitudine con altre librerie e usata quasi sempre).
La sintassi generica è
$(selettore)
e il valore restituito è un oggetto che comprende l'array degli elementi individuati dal selettore. Ad esempio:
$("#header")
restituisce l'elemento con id="header", come il comando getElementById()$("h3")
prende tutti gli elementi h3$("div#content .photo")
restituisce un array degli elementi con class="photo" dentro al tag <div id="content">$(p a)
restituisce un array contenente tutti gli elementi <a>
contenuti all'interno di un elemento <p>
(non necessariamente figli diretti), $(p > a)
restituisce un array contenente tutti gli elementi <a>
che sono figli diretti di un elemento <p>
, $(a:first)
restituisce un array contenente il primo elemento <a>
di una pagina, $(li a:first)
restituisce un array contenente il primo elemento <a>
all'interno di un elemento <li>
, $(:checkbox:checked:enabled)
restituisce un array contenente le checkbox selezionate (con il segno di spunta) e abilitate. $("ul li:nth-child(2)")
prende solo il secondo elemento <li> degli <ul>$("ul li:nth-child(even)")
prende solo i figli di posizione pari degli <ul>Con un po' di pratica si arriva in breve tempo a padroneggiare i selettori e il più è fatto! Selettori a parte, la sintassi di jQuery è semplificata rispetto a quella di JavaScript, e in breve tempo si possono raggiungere notevoli risultati di produttività.
I comandi jQuery.
Gli elementi di una pagina restituiti dalla funzione $() possono essere elaborati mediante apposite funzioni, dette comandi o metodi (wrapper methods), che possono comporsi sequenzialmente, separando funzioni consecutive con un singolo punto. Nell'esempio precedente, riportato qui sotto,
for
e while
è limitatissimo, semplificando così la programmazione.Inoltre, la maggior parte dei metodi restituisce come valore lo stesso wrapped set e quindi si possono concatenare più metodi in una stessa riga di codice, ad esempio,
Per maggiori informazioni sui comandi jQuery e il loro elenco completo, visitate la documentazione di jQuery.
Il seguente codice HTML mostra il corpo del primo esempio, dove i due tag <div> vengono fatti scomparire con una dissolvenza:
<h1>Prova di un bel fade out... </h1>
<h1>Altra prova di un bel fade out... </h1>
<script type= IsString="Yes_""text/Javascript" >
$("h1").fadeOut();
</script>
</body>
<h1>Prova di un bel fade out... </h1>
<script type= "text/Javascript" >
setTimeout('$("h1").fadeOut();',1000);
</script>
</body>
setTimeout()
, mentre la seconda<h1>Prova di un bel fade out... </h1>
<script type= "text/Javascript" >
var inizio=setTimeout('$("h1").fadeOut();',2000);
</script>
<input type="button" value=" stop fadeout " onclick="stopFadeout();" >
</body>
function stopFadeout(){
clearTimeout(inizio);
$('h1').text('Ho bloccato il fadeout');
}
</script>
In questi primi esempi, lo script che compie la dissolvenza è inserito in fondo al corpo del documento, in modo tale che questo sia eseguito al termine del caricamento del documento. La modalità canonica per invocare l'esecuzione di un script al termine del caricamento della pagina è però mostrata dal seguente esempio, dove si predispone il gestore del click del mouse su un'immagine:
...
<script language= "JavaScript" type= "text/javascript" >
$(document).ready(function(){
$('img').toggle(
function(){$(this).attr("src","gallery_jQuery/images/coffee.jpg");},
function(){$(this).attr("src","gallery_jQuery/images/rose.jpg");}
);
});
</script>
</head>
ready()
ha un argomento di tipo funzione che viene eseguita quando è terminata l'analisi del codice HTML della pagina e la costruzione dell'albero del documento (ma, a differenza di load(), non deve essere terminato il caricamento delle immagini presenti nella pagina). La funzione passata come argomento a ready() esegue sui tag <img> il metodo
toggle()
che gestisce il click del mouse stabilendo che la funzione che è primo argomento sia eseguita in corrispondenza dei click dispari, mentre la funzione che è secondo argomento sia eseguita ai click di posto pari.Le due funzioni argomento di toggle() modificano con il comando attr() il valore dell'attributo src assegnadogli come valore il secondo argomento di tipo stringa. Pertanto, ai click dispari sarà visualizzato il file coffee.jpg e ai click di posto pari sarà visualizzato il file rose.jpg .
L'oggetto
$(this)
all'interno di toggle() indica un generico elemento dell'insieme $('img')
, ovvero un'immagine. Ricordiamo che toggle(), come tutti i comandi jQuery opera su un insieme di elementi (nel ns. esempio l'insieme dei tag <img>) definendo per ciascuno di essi il comportamento al click del mouse.Nella riformulazione con jQuery dell'esempio della tabella "zebrata", il codice è simile a quello precedente:
...
<script type="text/javascript">
$(document).ready(function(){
$("table tr:nth-child(odd)").addClass("odd");
$("table tr").hover(
function() { $(this).css({fontWeight: "bold"}); },
function() {$(this).css("font-weight",'normal');}
);
})
</script>
</head>
hover()
dispone di due argomenti di tipo funzionefunction() { $(this).css({fontWeight: "bold"}); },
function() {$(this).css("font-weight",'normal');}
);
})
$(this)
all'interno di hover() indica un generico elemento dell'insieme $("table tr")
, ovvero una riga di una tabella. window.onload=function(){
$('div.primo').toggle(
function(){$(this).find("div").show().css("color","red");},
function(){$(this).find("div").hide();}
);
}
</script>
find()
di jQuery restituisce gli elementi individuati dal selettore passato come argomento ( "div") che si trovano nel sottoalbero con radice un elemento di $(this) , ovvero un <div> di classe "primo". Ecco una porzione del codice HTML:
<div class= "primo" > Sezione 1 UNO
<div class="secondo terzo" >
capitolo 1.1<br>
capitolo 1.2<br>
capitolo 1.3<br>
</div>
</div>
...
</body>
L'esempio si compone di un file exampleJQuery.html di cui vediamo più sotto le parti rilevanti di codice. L'esempio mostra come sia possibile visualizzare oppure nascondere del testo (tipicamente il codice di un programma) racchiuso tra una coppia di marcatori <pre> facendo click su un link soprastante al testo. Nel codice HTML viene omesso il testo tra i marcatori <pre>.
<html dir="ltr" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Example: Showing and hiding with jQuery</title>
<style type="text/css">
@import 'jqueryTest.css';
</style>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jqueryTest.js"></script>
</head>
<body>
<h1>Showing and hiding a code example with jQuery</h1>
<p>The code</p>
<pre><code>
...
</code></pre>
<p>The CSS</p>
<pre><code>
...
</code></pre>
<p><a href="http://jquery.com">jQuery homepage</a></p>
</body>
</html>
- crea un link per ogni tag <pre>,
- posiziona il link nel documento prima del testo preformattato,
- definisce il gestore del click sul link
function() {
$( 'pre' ).before( '<p><a class="trigger" href="#">Show code</a></p>' );
$( 'pre' ).hide();
$('a.trigger').toggle (
function() {
$(this).html('Hide Code');
$(this.parentNode.nextSibling).slideDown('slow');
},
function() {
$(this).html('Show Code');
$(this.parentNode.nextSibling).slideUp('slow');
}
)
}
)
Innanzi tutto, notiamo il comando
ready()
, che permette di eseguire la funzione passatagli come parametro al momento in cui si completa il caricamento del codice HTML (ma non quello dei file accessori come le immagini) e la costruzione dell'albero del documento.ready()
, inizia con la rigaIl codice
toggle()
è in realtà un gestore del click del mouse e fa sì che (a click alterni) sia eseguita ai click dispari la prima funzione$(this).html('Hide Code');
$(this.parentNode.nextSibling).slideDown('slow');
},
$(this).html('Show Code');
$(this.parentNode.nextSibling).slideUp('slow');
}
In dettaglio:
- l'espressione
$(this)
indica un link, - il metodo
html()
aggiorna il contenuto del link (il testo tra <a> e </a>), assegnadogli l'argomento di tipo stringa, - l'oggetto
this.parentNode.nextSibling
è l'elemento <pre> seguente il link, - i metodi
slideDown()
eslideUp()
sono usati per creare un'animazione a scorrimento verso il basso e rispettivamente verso l'alto, a bassa velocità (determinata dal parametro 'slow') quando si visualizza o si nasconde un testo formattato.
All'interno di showPic.js sono sempre presenti le funzioni:
- preparePlaceholder() che inserisce il codice HTML del tag <img> contenente l'immagine selezionata e il tag <p> della didascalia,
- prepareGallery() che definisce il comportamento dei link al click del mouse,
- showPic() che sostituisce l'immagine corrispondente al link cliccato nel placeholder.
Ecco il codice delle funzioni:
src:"images/placeholder.gif",
alt:"my image gallery"})
.appendTo($("body"));
// $("<p></p>").attr("id","description").text("Choose an image").appendTo($("body"));
$("<p></p>").attr("id","description")
.text("Choose an image").insertAfter($("#placeholder"));
}
attr()
; successivamente l'elemento è inserito come ultimo tag all'interno di <body> per effetto di appendTo()
. Analogamente, si crea un elemento <p>, si inizializza l'attributo id con attr() e si inizializza il testo del paragrafo con text(). Con il comando insertAfter() il paragrafo è posto dopo il tag <img> appena inserito (che ha id ="placeholder"). Si noti che il codice
insertAfter($("#placeholder"))
è equivalente al codice appendTo($("body"))
.$('#imagegallery a').bind("click",function() {
return showPic(this);
})
.keypress(function() {
return showPic(this);
});
}
bind()
e keypress()
sono concatenati perché bind() restituisce come valore l'insieme $('#imagegallery a') .$('#placeholder').attr("src",$(whichpic).attr("href"));
if ($(whichpic).attr("title")) {
var text = $(whichpic).attr("title");
} else {
var text = "";
}
$('#description').html(text);
return false;
}
La riga di codice
Infine, il codice seguente provoca l'esecuzione delle funzioni preparePlaceholder() e prepareGallery() quando il documento è stato caricato dal browser.
preparePlaceholder();
prepareGallery();
});
Nessun commento:
Posta un commento
Non inserire link cliccabili altrimenti il commento verrà eliminato. Metti la spunta a Inviami notifiche per essere avvertito via email di nuovi commenti.