Use the left/right arrow keys to navigate, 's' to enable/disable scrolling.

Javascript e il Web

Obiettivi della lezione

Conoscere

  • conoscere le funzionalità base del DOM
  • conoscere e comprendere l’importanza ed il funzionamento del Unobtrusive JavaScript
  • conoscere e saper utilizzare jQuery nelle sue funzionalità base

DOM

Document Object Model

DOM è un modello ad oggetti per la rappresentazione di un documento

DOM è un API per accedere e manipolare dinamicamente il contenuto, struttura e stile di un documento HTML/XML/XHTML

DOM (Wikipedia)

Javascript e il DOM

Mentre un numero ristretto di caratteristiche del rendering engine e dell’interprete javascript possono risultare differenti tra un browser e l’altro, la stragrande maggioranza di esse sono state standardizzate (e continuano ad esserlo) dal W3C.

window e document

Tra le variabili disponibili nello spazio globale Javascript in un pagina web ci sono ‘window’, che rappresenta la finestra/tab contenente la pagina, e ‘document’, che rappresenta il documento stesso.

window E’ lo spazio globale:

  • window contiene un riferimento a se stesso
  • window contiene un riferimento a document

window e document

1window === window.window
2document === window.document
3 
4window.location
5document.title
Ora provalo nell'interprete interattivo

DOM Navigation

DOM

DOM Navigation

DOM

DOM Navigation

1var el1 = document.getElementById("header");
2var el2 = document.getElementsByTagName("h1")[0];

DOM Navigation

1el.nodeType
2el.tagName
3el.innerHTML
4el.textContent

DOM Navigation

nodeType può corrispondere al valore di una delle seguenti costanti:

01document.ELEMENT_NODE=1
02document.ATTRIBUTE_NODE=2
03document.TEXT_NODE=3
04document.CDATA_SECTION_NODE=4
05document.ENTITY_REFERENCE_NODE=5
06document.ENTITY_NODE=6
07document.PROCESSING_INSTRUCTION_NODE=7
08document.COMMENT_NODE=8
09document.DOCUMENT_NODE=9
10document.DOCUMENT_TYPE_NODE=10
11document.DOCUMENT_FRAGMENT_NODE=11
12document.NOTATION_NODE=12

DOM Navigation

1el.parentNode
2el.hasChildNodes()
3el.childNodes
4el.firstChild
5el.lastChild
6el.previousSibling
7el.nextSibling
8el.ownerDocument

DOM Traversing

1var elements = document.getElementsByTagName("h1");
2 
3for(var i=0; i<elements.length; i++) {
4  console.log(elements[i]);
5}
6 
7console.log(elements[0].tagName);
8console.log(elements[0].innerHTML);
9console.log(elements[0].nodeType);
Ora provalo nell'interprete interattivo

DOM Traversing

1var current = document.body.firstChild
2current = current.nextSibling
3current = current.previousSibling
4 
5var parent = current.parentNode
Ora provalo nell'interprete interattivo

DOM Attribute and Style Modify

1el.getAttribute("class")
2el.setAttribute("id","newtest_id_value")
3el.removeAttribute("class")
4 
5el.attributes
6el.attributes.length
7 
8el.attributes[0].nodeName
9el.attributes[0].nodeValue

DOM Element Creation, Inserting and Removing

1document.createElement()
2document.createTextNode()
3 
4element.appendChild()
5element.insertBefore()

DOM Element Creation, Inserting and Removing

01paragraph = document.createElement('p');
02bold = document.createElement('b');
03 
04text1 = document.createTextNode('Some random');
05text2 = document.createTextNode(' example ');
06text3 = document.createTextNode('text');
07 
08bold.appendChild(text2);
09paragraph.appendChild(bold);
10paragraph.appendChild(text3);
11paragraph.insertBefore(text1,bold);
12 
13document.body.appendChild(paragraph);
Ora provalo nell'interprete interattivo

DOM Event Handling

1node.addEventListener
2node.removeEventListener
3 
4event.type
5event.target

DOM Event Handling

1onclick = function(event) {
2  // ANALIZZA event, event.type, event.target etc.
3  // e fai qualcosa di utile :-)
4};
5document.body.addEventListener("click", onclick, false)
Ora provalo nell'interprete interattivo

DOM Event Handling

Tipi di eventi:

  • MouseEvents (click, mousedown, mouseup, mouseover, mousemove, mouseout)

  • MutationEvents (DOMSubtreeModified, DOMNodeInserted, DOMNodeRemoved, DOMNodeRemovedFromDocument, DOMNodeInsertedIntoDocument, DOMAttrModified, DOMCharacterDataModified)

  • HTMLEvents (load, unload, abort, error, reset, select, focus, blur, resize, scroll)

jQuery

jQuery

  • Perchè usare un framework javascript?
  • jQuery: come, quando e perchè?
  • Unobtrusive JavaScript
  • jQuery by Examples

Perchè usare un framework javascript?

  • appianare le differenze/incompatibilità tra le implementazioni di ECMAScript / DOM / CSS tra i vari browser
  • aggiunta di nuovi costrutti al linguaggio, funzioni di utilità
  • semplificazione di procedure macchinose
  • implementazione di design pattern e best pratices

jQuery: come, quando e perchè? (1/3)

jQuery: come, quando e perchè? (2/3)

  • real world usecases:

    • Google, Dell, Digg, Technorati
    • mozilla.org, Drupal, Wordpress
    • BBC, Newsweek

jQuery: come, quando e perchè? (3/3)

jQuery semplifica i patterni più comuni delle applicazioni javascript client-side:

  • selezione degli elementi
  • aggiornamento degli attributi e manipolazione dei CSS
  • creazione e copia degli elementi della pagina
  • visualizzare, nascondere ed animare gli elementi

Il tutto implementato mediante metaprogrammazione Javascript, completamente multibrowser e sotto le sembianze di un maneggevole DSL.

Unobtrusive Javascript

Inizialmente era l’HTML…

semplici pagine di testo statiche, con la possibilità di includere delle immagini e link ipertestuali tra le pagine HTML

nelle pagine HTML venivano a mescolarsi contenuto e stile…

1<p width="800px">
2  Some text <b>Bold Text</b> Other
3  <i> Italic Text </i>
4</p>

Unobtrusive Javascript

poi arrivarono i CSS allo scopo di separare lo stile (CSS) dal contenuto (HTML) e i tag e gli attributi che applicavano lo stile all’interno dell’HTML entrarono in deprecazione…

01<style  TYPE="text/css">
02.wide { width: 800px; }
03.bold { font-weight: bold; }
04.italic { font-style: italic; }
05</style>
06 
07<p class="wide">
08  Some text <span class="bold">Bold Text</span> Other
09  <span class="italic"> Italic Text </span>
10</p>

Unobtrusive Javascript

Ma con l’ingresso di Javascript l’HTML ne è risultato nuovamente contaminato… questa volta era il comportamento (behaviour) a mescolarsi con il contenuto:

1<h2 onclick="this.style.color = 'red';"> CLICK ME </h2>

Unobtrusive Javascript

I benefici ottenibili separando il compartamento (behaviour) dal contenuto sono paragonabili se non superiori a quelli ottenuti separandone lo stile con i CSS.

01<h2 id="clickme"> CLICK ME </h2>
02 
03<script type="text/javascript">
04  function init_behaviour() {
05    document.getElementById("clickme").
06      onclick = function() {
07        this.style.color = "red";
08    };
09  };
10 
11  window.onload = init_behaviour;
12</script>

jQuery by Examples

Con una conoscenza delle caratteristiche base di Javascript, delle sue particolarità e delle tecniche comuni, è possibile apprendere e comprendere il funzionamento di jQuery (come di qualunque altro framework javascript) by example

ex0. jquery minimal page

Ogni release di jQuery viene rilasciata in due formati:

La release corrente è la versione 1.4.2

ex0. jquery minimal page

01<html>
02  <head>
03    <title>jQuery Test Page</title>
04    <script src="jquery.js" type="text/javascript"></script>
05    <script type="text/javascript">
06        // YOUR CODE HERE
07    </script>
08  </head>
09  <body>
10  </body>
11</html>

ex1. jquery wrapper

Il centro dell’API di jQuery è il factory pattern costituito dal jQuery wrapper:

jQuery e il suo alias abbreviato $

1typeof jQuery   // function
2jQuery === $    // true
3dir(jQuery)     // navigazione object in Firebug
4 
5doc = $(document);            // jQuery wrapped document
6doc instanceof jQuery // true
Ora provalo nell'interprete interattivo

ex2. document ready handler

  • molte delle operazioni che eseguiremo in javascript necessitano che il DOM sia stato completamente caricato
  • window.onload è un handler standard presente a questo scopo, ma attende il caricamento di tutte le risorse (comprese immagini) e gli si può associare una sola callback
  • jQuery().ready al contrario controlla la sola completezza del DOM e può essere usato ripetutamente senza rischi
1$(document).ready(function() {
2  // FAI QUALCOSA DI UTILE
3});
4 
5// OPPURE
6 
7$(function() {
8  // FAI QUALCOSA DI UTILE
9});
Ora provalo nell'interprete interattivo

ex3. select elements from page

  • gli elementi posso essere selezionati mediante i comuni CSS selectors (sino a supportare caratteristiche relative a CSS3), espressioni XPATH e altri selector avanzati
  • la selezione avviene mediante il solito jquery wrapper
  • l’oggetto ritornato è un oggetto jquery wrapped contenente una notevole quantità di metodi di utilità oltre che gli oggetti DOM standard
  • i metodi di utilità sono in grado di agire sia su singoli elementi selezionati che su liste di elementi in modo trasparente
  • gli elementi selezionati possono essere ulteriormente filtrati

ex3. select elements from page

01$('body');
02 
03$('body > *').each(function(i,v) { console.log(typeof v); });
04 
05$('#test-table');
06 
07$('.content').each(function(i,v) { console.log(v); });
08 
09$('table tr').filter(".header").each(function(i,v) { console.log(v); });
10 
11$('a[href^=http://]').addClass('http-link');
12$('a[href$=.pdf]').addClass('pdf-link');

ex4. change attributes of selected elements

  • aggiungere/rimuovere una class CSS
  • manipolare lo stile CSS di una selezione
  • cambiare il contenuto html di una selezione
1$('table tr').addClass("MYCLASS"")
2$('table tr').removeClass("MYCLASS"")
3 
4$('table tr').html("MYTEXT")
5 
6$('table tr').css({background: "yellow"})

ex5. create/copy new elements in the page

  • creare nuovi elementi
  • clonare elementi selezionati
  • inserire elementi nella pagina
  • eliminare elementi dalla pagina
01$("<p> A new unuseful paragraph </p>");
02 
03$("<p> A new unuseful paragraph </p>").insertAfter("#footer");
04 
05$('body').append("<a href='http://myhost/mydoc.pdf'>test</a>");
06 
07$('table').clone().insertAfter("h1");
08 
09$('table').insertBefore("h1");
10 
11$('table').insertAfter("h1");
12 
13$($('table')[0]).remove();
Ora provalo nell'interprete interattivo

ex6. event handling

1$('h1').click(function() { $(this).css({color: "red"}); });
2 
3$('#header').click(function() {
4  $(this).find('h1').each(function() {
5     $(this).clone().insertBefore($('#footer'));
6  });
7});
Ora provalo nell'interprete interattivo

ex7. animation effects

1$('h1').click(function() { $('h1').toggle('fade'); });
2 
3$('h1').
4  mouseover(function() { $(this).css({background: "yellow"}) }).
5  mouseout(function() { $(this).css({background: "white"}) });
Ora provalo nell'interprete interattivo

ex8. ajax query

1$("<textarea/>").insertAfter("#footer");
2$.get("blank.html", function (data) { $('textarea')[0].value = data; });
3$('textarea').css({width: "100%", height: "600px"})
4 
5$.getJSON("data.json", function(json) { console.log(json); });
6 
7$("<div id='newcontent'/>").insertAfter('h1');
8$("#newcontent").load("remote url");

Bibliografia

  • Learning jQuery (Packt)
  • jQuery Reference (Packt)
  • jQuery in Action (Manning)

Copyright (C) 2010 - Alca Società Cooperativa

http://learn.alcacoop.it - learn@alcacoop.it

released under CreativeCommons 2.5 by-nc-sa