{"id":670,"date":"2016-11-17T18:48:29","date_gmt":"2016-11-17T17:48:29","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/javascript-per-web-designers\/"},"modified":"2016-11-17T18:48:29","modified_gmt":"2016-11-17T17:48:29","slug":"javascript-per-web-designers","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/javascript-per-web-designers\/","title":{"rendered":"JavaScript per Web Designers: DOM scripting"},"content":{"rendered":"<div class=\"main-content pre-article\">\n<p class=\"editors-note\"><strong>Nota degli editori:<\/strong> Siamo lieti di condividere un estratto dal Chapter 5 del nuovo libro di Mat Marquis, <cite>JavaScript for Web Designers<\/cite>, disponibile ora presso <a href=\"https:\/\/abookapart.com\/products\/javascript-for-web-designers\">A Book Apart<\/a>.<\/p>\n<\/div>\n<p>Prima di fare qualunque cosa con una pagina, voi ed io dobbiamo parlare di qualcosa di molto importante: il Document Object Model. Ci sono due scopi per il DOM: fornire a JavaScript una mappa di tutti gli elementi sulla nostra pagina e darci un insieme di metodi per accedere a questi elementi, ai loro attributi e al loro contenuto.<\/p>\n<p>Tuttavia, la parte \u201cobject\u201d di Document Object Model dovrebbe avere molto pi\u00f9 senso adesso che quando \u00e8 apparso il DOM per la prima volta: il DOM \u00e8 una rappresentazione di una pagina web sotto forma di un oggetto, composto da propriet\u00e0 che rappresentano ciascuna gli elementi figlio del documento e sotto-propriet\u00e0 che rappresentano ciascuno degli elementi figlio di quegli elementi figlio, e cos\u00ec via. Sono oggetti fino in fondo.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section1\"><code>window<\/code>: il Global Context<\/h2>\n<p>Tutto quello che facciamo con JavaScript ricade all&#8217;interno dello scope di un singolo oggetto: <code>window<\/code>. L&#8217;oggetto <code>window<\/code> rappresenta, in maniera piuttosto intuibile, l&#8217;intera finestra del browser. Contiene l&#8217;intero DOM, cos\u00ec come &#8211; e questa \u00e8 la parte delicata &#8211; l&#8217;intero JavaScript.<\/p>\n<p>Quando abbiamo parlato per la prima volta di scope delle variabili, abbiamo sfiorato il concetto dell&#8217;esistenza di uno scope \u201cglobale\u201d e di uno \u201clocale\u201d, il che significa che una variabile pu\u00f2 essere disponibile o in tutte le parti dei nostri script o solo nelle funzioni in cui sono incluse.<\/p>\n<p>L&#8217;oggetto <code>window<\/code> <em>\u00e8<\/em> quello scope globale. Tutte le funzioni e metodi creati in JavaScript sono creati a partire dall&#8217;oggetto <code>window<\/code>. Non dobbiamo far riferimento a <code>window<\/code> costantemente, ovviamente, o l&#8217;avreste visto spesso prima di adesso, dal momento che <code>window<\/code> \u00e8 lo scope globale, JavaScript controlla <code>window<\/code> per ogni variabile che non abbiamo definito noi stessi. In effetti, l&#8217;oggetto <code>console<\/code>, che spero adesso conosciate e amiate, \u00e8 un metodo dell&#8217;oggetto <code>window<\/code>:<\/p>\n<pre id=\"snippet1\" class=\" language-javascript\"><code class=\" language-javascript\">window<span class=\"token punctuation\">.<\/span>console<span class=\"token punctuation\">.<\/span>log\n<span class=\"token keyword\">function<\/span> log<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token punctuation\">[<\/span>native code<span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>\u00c8 difficile visualizzare le variabili con scope globale o locale prima di conoscere <code>window<\/code>, ma \u00e8 molto pi\u00f9 semplice dopo: quando introduciamo una variabile nello scope globale, la stiamo rendendo una propriet\u00e0 di <code>window<\/code> e, dal momento che non dobbiamo esplicitamente referenziare <code>window<\/code> ogni volta che accediamo ad una delle sue propriet\u00e0 o metodi, possiamo chiamare quella variabile ovunque nei nostri script usando semplicemente il suo identificatore. Quando accediamo a un identificatore, questo \u00e8 quello che stiamo in realt\u00e0 facendo:<\/p>\n<pre id=\"snippet2\" class=\"  language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">function<\/span> ourFunction<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">var<\/span> localVar <span class=\"token operator\">=<\/span> <span class=\"token string\">\"I\u2019m local.\"<\/span><span class=\"token punctuation\">;<\/span>\n    globalVar <span class=\"token operator\">=<\/span> <span class=\"token string\">\"I\u2019m global.\"<\/span><span class=\"token punctuation\">;<\/span>\n\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"I\u2019m global too!\"<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/code>\n<samp>undefined<\/samp>\n\n<code class=\" language-javascript\">window<span class=\"token punctuation\">.<\/span>ourFunction<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code>\n<samp>I\u2019m global too!<\/samp>\n\n<code class=\" language-javascript\">window<span class=\"token punctuation\">.<\/span>localVar<span class=\"token punctuation\">;<\/span><\/code>\n<samp>undefined<\/samp>\n\n<code class=\" language-javascript\">window<span class=\"token punctuation\">.<\/span>globalVar<span class=\"token punctuation\">;<\/span><\/code>\n<samp>I\u2019m global.<\/samp><\/pre>\n<p>L&#8217;intera rappresentazione della pagina del DOM \u00e8 una propriet\u00e0 di <code>window<\/code>: nello specifico, <code>window.document<\/code>. Scrivere semplicemente <code>window.document<\/code> nella developer console ritorna tutto il markup della pagina attuale in una stringa enorme, il che non \u00e8 particolarmente utile, ma si pu\u00f2 accedere a tutto sulla pagina come sotto-propriet\u00e0 di <code>window.document<\/code> nello stesso identico modo. Ricordatevi che non dobbiamo specificare <code>window<\/code> per accedere alla propriet\u00e0 del <code>document<\/code>: <code>window<\/code> \u00e8 unico nel suo genere, dopo tutto.<\/p>\n<pre id=\"snippet3\" class=\" language-javascript\"><code class=\" language-javascript\">document<span class=\"token punctuation\">.<\/span>head\n<span class=\"token operator\">&lt;<\/span>head<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>head<span class=\"token operator\">&gt;<\/span>\n\ndocument<span class=\"token punctuation\">.<\/span>body\n<span class=\"token operator\">&lt;<\/span>body<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>body<span class=\"token operator\">&gt;<\/span><\/code><\/pre>\n<p>Quelle due propriet\u00e0 sono esse stesse oggetti che contengono propriet\u00e0 che sono oggetti e cos\u00ec via. (\u201cIn un certo senso, tutto \u00e8 un oggetto\u201d).<\/p>\n<h2 id=\"section2\">Usare il DOM<\/h2>\n<p>Gli oggetti in <code>window.document<\/code> costituiscono la mappa del documento di JavaScript, ma non \u00e8 molto utile per noi, perlomeno non quando stai cercando di accedere ai nodi DOM nel modo in cui accederesti ad ogni altro oggetto. Muoverci manualmente attraverso l&#8217;oggetto <code>document<\/code> sarebbe per noi un gran mal di testa e per questo motivo i nostri script cadrebbero completamente a pezzi non appena cambia un qualsiasi pezzo nel markup.<\/p>\n<p>Tuttavia, <code>window.document<\/code> non \u00e8 una semplice rappresentazione della pagina: ci fornisce anche una API pi\u00f9 smart per accedere a quelle informazioni. Per esempio, se vogliamo trovare ogni elemento <code>p<\/code> sulla pagina, non dobbiamo scrivere una stringa di property keys, ma usare un metodo helper presente all&#8217;interno di <code>document<\/code> che li riunisce tutti quanti per noi in un elenco simile ad un array. Aprite un qualunque sito di vostra scelta, purch\u00e9 sia probabile che abbia almeno uno o due elementi paragrafo al suo interno e provate questo nella vostra console:<\/p>\n<pre id=\"snippet4\" class=\" language-javascript\"><code class=\" language-javascript\">document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&lt;<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&lt;<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&lt;<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&lt;<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">]<\/span><\/code><\/pre>\n<p>Dal momento che abbiamo a che fare dei tipi di dati cos\u00ec familiari, abbiamo gi\u00e0 una mezza idea di come lavorare con loro:<\/p>\n<pre id=\"snippet5\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> paragraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nundefined\n\nparagraphs<span class=\"token punctuation\">.<\/span>length\n<span class=\"token number\">4<\/span>\n\nparagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token operator\">&lt;<\/span>p<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token operator\">\/<\/span>p<span class=\"token operator\">&gt;<\/span><\/code><\/pre>\n<p>I metodi DOM per\u00f2 non ci ritornano degli array in senso stretto. Metodi come <code>getElementsByTagName<\/code> ritornano \u201cliste di nodi\u201d che si comportano in maniera molto simile agli array. Ogni item in una <code>nodeList<\/code> fa riferimento a un singolo nodo nel DOM, come un <code>p<\/code> o un <code>div<\/code> e ha un numero di metodi specifici del DOM &#8220;built-in&#8221;. Per esempio, il metodo <code>innerHTML<\/code> ritorna qualsiasi markup contenga un nodo (elementi, testo e cos\u00ec via) come una stringa:<\/p>\n<pre id=\"snippet6\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> paragraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    lastIndex <span class=\"token operator\">=<\/span> paragraphs<span class=\"token punctuation\">.<\/span>length \u2013 <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <br \/><\/code><code class=\" language-javascript\"><span class=\"token comment\"><span style=\"white-space: pre;\">\t\t\t<\/span>\/* Use the length of the `paragraphs`<br \/><span style=\"white-space: pre;\">\t\t\t<\/span>node list minus 1 (because of zero-indexing)<br \/><span style=\"white-space: pre;\">\t\t\t<\/span>to get the last paragraph on the page *\/<\/span>\n    lastParagraph <span class=\"token operator\">=<\/span> paragraphs<span class=\"token punctuation\">[<\/span> lastIndex <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> \n\nlastParagraph<span class=\"token punctuation\">.<\/span>innerHTML<span class=\"token punctuation\">;<\/span>\nAnd that\u2019s how I spent my summer vacation<span class=\"token punctuation\">.<\/span><\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/fig-5.1.jpg\" border=\"0\" alt=\"Fig 5.1: Le prime bozze sono sempre difficili.\" width=\"100%\" style=\"border: 0px;\" \/><\/p>\n<p>\u00a0<\/p>\n<p>Fig 5.1: Le prime bozze sono sempre difficili.<\/p>\n<p>\u00a0<\/p>\n<p>Nello stesso modo in cui questi metodi ci danno accesso alle informazioni sulla pagina resa, cos\u00ec ci permettono anche di alterare quell&#8217;informazione. Per esempio, il metodo <code>innerHTML<\/code> fa questo nello stesso modo in cui cambieremmo il valore di un qualsiasi altro oggetto: con un semplice segno di uguale seguito dal nuovo valore.<\/p>\n<pre id=\"snippet7\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> paragraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    firstParagraph <span class=\"token operator\">=<\/span> paragraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Listen up, chumps:\"<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token string\">\"Listen up, chumps:\"<\/span><\/code><\/pre>\n<p>La mappa del DOM di JavaScript funziona in entrambe le direzioni: <code>document<\/code> viene aggiornato ogni volta che cambia il markup e il nostro markup viene aggiornato ogniqualvolta qualcosa cambia all&#8217;interno di <code>document<\/code> (Fig 5.1).<\/p>\n<p>In maniera simile, la DOM API ci fornisce un certo numero di metodi per creare, aggiungere e rimuovere elementi. Sono tutti sillabati in inglese corrente, perci\u00f2, anche se possono sembrare un po&#8217; verbosi, non sono troppo difficili da scomporre.<\/p>\n<h2 id=\"section3\">DOM Scripting<\/h2>\n<p>Prima di cominciare, abbandoniamo la developer console per un attimo. Secoli fa, abbiamo costruito passo passo un template HTML molto basilare che richiama uno script remoto e adesso ne rivedremo le impostazioni. Con la conoscenza che avete acquisito finora su JavaScript e con l&#8217;introduzione al DOM, abbiamo finito di dire alla console di ripeterci le cose come un pappagallo: \u00e8 ora di creare qualcosa.<\/p>\n<p>Aggiungeremo un \u201ctaglio\u201d a una pagina index piena di testo: un paragrafo con un&#8217;anteprima seguito da un link per mostrare l&#8217;intero testo. Per\u00f2 non faremo navigare l&#8217;utente verso un&#8217;altra pagina, ma, al contrario, useremo JavaScript per mostrare l&#8217;intero testo sulla stessa pagina.<\/p>\n<p>Cominciamo con l&#8217;impostare un documento HTML che si collega ad un foglio di stile esterno e ad un file esterno dello script, nulla di che. Entrambe i files, lo stylesheet e lo script, sono per ora vuoti e hanno le estensioni .css e .js. Mi piace tenere i miei CSS in una sotto-directory \/css e i miei JavaScript in una sotto-directory \/js, ma siete liberi di fare come preferite.<\/p>\n<pre id=\"snippet8\" class=\" language-markup\"><code class=\" language-markup\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;<\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>html<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>head<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>meta<\/span> <span class=\"token attr-name\">charset<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>utf-8<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>link<\/span> <span class=\"token attr-name\">rel<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>stylesheet<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>text\/css<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">href<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>css\/style.css<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>head<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>body<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n        <span class=\"token script\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>script<\/span> <span class=\"token attr-name\">src<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>js\/script.js<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>script<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>body<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>html<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Popoleremo quella pagina con svariati paragrafi di testo. Un qualunque pezzo di testo che trovate in giro va bene, incluso, con le mie scuse per i content strategist tra il pubblico, il buon vecchio lorem ipsum. Stiamo semplicemente simulando una rapida pagina per un articolo, come un blog post.<\/p>\n<pre id=\"snippet9\" class=\" language-markup\"><code class=\" language-markup\"><span class=\"token doctype\">&lt;!DOCTYPE html&gt;<\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>html<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>head<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>meta<\/span> <span class=\"token attr-name\">charset<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>utf-8<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>link<\/span> <span class=\"token attr-name\">rel<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>stylesheet<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">type<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>text\/css<span class=\"token punctuation\">\"<\/span><\/span> <span class=\"token attr-name\">href<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>css\/style.css<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>head<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>body<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h1<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>JavaScript for Web Designers<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h1<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>In all fairness, I should start this book with an<br \/><span style=\"white-space: pre;\">\t<\/span>apology\u2014not to you, reader, though I don\u2019t doubt that<br \/><span style=\"white-space: pre;\">\t<\/span>I\u2019ll owe you at least one by the time we get to the<br \/><span style=\"white-space: pre;\">\t<\/span>end. I owe JavaScript a number of apologies for the<br \/><span style=\"white-space: pre;\">\t<\/span>things I\u2019ve said to it during the early years of my<br \/><span style=\"white-space: pre;\">\t<\/span>career, some of which were strong enough to etch glass.<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>This is my not-so-subtle way of saying that JavaScript<br \/><span style=\"white-space: pre;\">\t<\/span> can be a tricky thing to learn.<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n        [ \u2026 ]\n\n        <span class=\"token script\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>script<\/span> <span class=\"token attr-name\">src<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>js\/script.js<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>script<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>body<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>html<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Siete liberi di aprire lo stylesheet e giocare con la tipografia, ma non distraetevi troppo. Dovremo scrivere un po&#8217; di CSS pi\u00f9 tardi, ma adesso abbiamo dello scripting da fare.<\/p>\n<p>Possiamo suddividere questo script in qualche task discreto: dobbiamo aggiungere un link \u201cRead More\u201d al primo paragrafo, dobbiamo nascondere tutti gli elementi <code>p<\/code> tranne il primo e dobbiamo mostrare quegli elementi nascosti quando l&#8217;utente interagisce con il link \u201dRead More\u201d.<\/p>\n<p>Cominceremo con l&#8217;aggiungere il link \u201dRead More\u201d alla fine del primo paragrafo. Aprite il vostro file script.js ancora vuoto ed inserite quanto segue:<\/p>\n<pre id=\"snippet10\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Innanzitutto, stiamo inizializzando la variabile <code>newLink<\/code>, che usa <code>document.createElement( \"a\" )<\/code> per &#8211; proprio come dice sulla confezione &#8211; creare un nuovo elemento <code>a<\/code>. Questo elemento non esiste ancora da nessuna parte: per far s\u00ec che appaia sulla pagina dovremo aggiungerlo manualmente. Ancora prima per\u00f2, <code>&lt;a&gt;&lt;\/a&gt;<\/code> senza alcun attributo o contenuto non \u00e8 molto utile. Prima di aggiungerlo alla pagina, popoliamolo con tutte le informazioni di cui ha bisogno.<\/p>\n<p>Potremmo fare questo <em>dopo<\/em> aver aggiunto il link al DOM, ovviamente, ma non ha senso fare molteplici aggiornamenti all&#8217;elemento sulla pagina invece che un aggiornamento che aggiunga il risultato finale: fare tutto il lavoro su quell&#8217;elemento prima di metterlo nella pagina ci aiuta a mantenere il nostro codice prevedibile.<\/p>\n<p>Fare un singolo viaggio nel DOM quando \u00e8 possibile \u00e8 inoltre migliore per la performance, ma \u00e8 facile essere ossessionati dalle micro-ottimizzazioni della performance. Come avete visto, JavaScript offre frequentemente pi\u00f9 modi per fare la stessa cosa e uno di questi metodi potrebbe <em>tecnicamente<\/em> avere prestazioni migliori dell&#8217;altro. Questo porta invariabilmente a codice \u201ceccessivamente intelligente\u201d, loop complicati che richiedono spiegazioni di persona perch\u00e9 abbiano senso, semplicemente per limare dei preziosi picosecondi al tempo di caricamento. L&#8217;ho fatto, mi sorprendo ancora a farlo, ma voi non dovreste provarci. Quindi, mentre fare quanti meno andirivieni dal DOM possibili \u00e8 una buona abitudine da crearsi per il bene della performance, la ragione principale \u00e8 che mantiene il nostro codice leggibile e prevedibile. Facendo dei viaggi al DOM solo quando ne abbiamo davvero bisogno, evitiamo di ripeterci e rendiamo pi\u00f9 ovvi i nostri punti di interazione con il DOM per i futuri maintainer dei nostri script.<\/p>\n<p>Ok. Torniamo al nostro <code>&lt;a&gt;&lt;\/a&gt;<\/code> vuoto e senza attributi che fluttua nell&#8217;etere di JavaScript, totalmente indipendente dal nostro documento.<\/p>\n<p>Ora possiamo usare due altre interfacce DOM per rendere quel link pi\u00f9 utile: <code>setAttribute<\/code> per assegnargli gli attributi e <code>innerHTML<\/code> per popolarlo con del testo. Questi hanno una sintassi leggermente differente. Possiamo semplicemente assegnare una stringa usando <code>innerHTML<\/code>, nel modo in cui assegneremmo un valore ad ogni altro oggetto. D&#8217;altro canto, <code>setAttribute<\/code> si aspetta due argomenti: l&#8217;attributo <em>e<\/em> il valore che vogliamo assegnare a quell&#8217;attributo, in questo ordine. Dal momento che non pianifichiamo nessuna destinazione per il nostro link, imposteremo solo un cancelletto (hash) come <code>href<\/code>, un link alla pagina su cui ci troviamo gi\u00e0.<\/p>\n<pre id=\"snippet11\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Avrete notato che stiamo usando queste interfacce nel nostro riferimento memorizzato all&#8217;elemento invece che a <code>document<\/code> stesso. <em>Tutti<\/em> i nodi del DOM hanno accesso ai metodi come quelli che stiamo usando qui, usiamo <code>document.getElementsByTagName( \"p\" )<\/code> solamente perch\u00e9 vogliamo ottenere tutti gli elementi paragrafo nel documento. Se solo volessimo ottenere tutti gli elementi paragrafo all&#8217;interno di un certo <code>div<\/code>, potremmo fare la stessa cosa con una reference a quel <code>div<\/code>, qualcosa come <code>ourSpecificDiv.getElementsByTagName( \"p\" );<\/code>. E dal momento che vogliamo impostare l&#8217;attributo <code>href<\/code> e l&#8217;HTML interno del link che abbiamo creato, facciamo riferimento a queste propriet\u00e0 usando <code>newLink.setAttribute<\/code> e <code>newLink.innerHTML<\/code>.<\/p>\n<p>Poi: vogliamo che questo link appaia alla fine del nostro primo paragrafo, quindi il nostro script avr\u00e0 bisogno di un modo per far riferimento a quel primo paragrafo. Sappiamo gi\u00e0 che <code>document.getElementsByTagName( \"p\" )<\/code> ci d\u00e0 una node list di tutti i paragrafi nella pagina. Dal momento che le node list si comportano come array, possiamo far riferimento al primo item nella node list uno usando l&#8217;indice <code>0<\/code>.<\/p>\n<pre id=\"snippet12\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Per mantenere il nostro codice leggibile, \u00e8 una buona idea inizializzare le nostre variabili in cima allo script, anche solo inizializzandole a <code>undefined<\/code> (assegnandogli un identificatore ma nessun valore), se pianifichiamo di assegnarli un valore in seguito. In questo modo conosciamo tutti gli identificatori in gioco.<\/p>\n<p>Quindi, adesso abbiamo tutto quello che ci serve per appendere un link alla fine del primo paragrafo: l&#8217;elemento che vogliamo appendere (<code>newLink<\/code>) e l&#8217;elemento che vogliamo appendergli (<code>firstParagraph<\/code>).<\/p>\n<p>Uno dei metodi built-in su tutti i nodi del DOM \u00e8 <code>appendChild<\/code>, che, come suggerisce il nome, ci permette di appendere un elemento figlio a quel nodo del DOM. Chiameremo quindi il metodo <code>appendChild<\/code> sulla nostra reference salvata al primo paragrafo nel documento, passandogli <code>newLink<\/code> come argomento.<\/p>\n<pre id=\"snippet13\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>appendChild<span class=\"token punctuation\">(<\/span> newLink <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Ora, finalmente, abbiamo qualcosa a cui poter puntare quando ricarichiamo la pagina. Se tutto \u00e8 andato secondo il nostro piano, adesso dovremmo avere un link \u201dRead more\u201d alla fine del primo paragrafo sulla pagina. Se tutto non \u00e8 andato secondo i piani &#8211; a causa di un punto e virgola messo male o di parentesi non accoppiate, per esempio &#8211; la developer console vi avviser\u00e0 che qualcosa \u00e8 andato storto, quindi assicuratevi di tenerla aperta.<\/p>\n<p>Ci siamo quasi, ma non \u00e8 troppo bello: il nostro link \u00e8 appiccicato al paragrafo che lo precede, dal momento che il link \u00e8  <code>display: inline<\/code> di default (Fig 5.2).<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/fig-5.2.jpg\" border=\"0\" alt=\"Beh, \u00e8 un inizio.\" width=\"100%\" \/><\/p>\n<p>\u00a0<\/p>\n<p>Fig 5.2: Beh, \u00e8 un inizio.<\/p>\n<p>\u00a0<\/p>\n<p>Abbiamo un paio di opzioni per gestire questa cosa: non entrer\u00f2 nei dettagli di tutte le varie sintassi qui, ma il DOM vi d\u00e0 anche accesso alle informazioni di <em>stile<\/em> degli elementi, sebbene, nella sua forma pi\u00f9 basica, ci permette solo di leggere e cambiare le informazioni di stile associate all&#8217;attributo <code>style<\/code>. Giusto per capire un attimo come funziona, cambiamo il link a <code>display: inline-block<\/code> e aggiungiamo alcuni pixel di margine nel lato sinistro, cos\u00ec che non collida con il nostro testo. Proprio come l&#8217;impostazione degli attributi, lo faremo prima di aggiungere il link alla pagina:<\/p>\n<pre id=\"snippet14\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>style<span class=\"token punctuation\">.<\/span>display <span class=\"token operator\">=<\/span> <span class=\"token string\">\"inline-block\"<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>style<span class=\"token punctuation\">.<\/span>marginLeft <span class=\"token operator\">=<\/span> <span class=\"token string\">\"10px\"<\/span><span class=\"token punctuation\">;<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>appendChild<span class=\"token punctuation\">(<\/span> newLink <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Bene, aggiungere quelle righe <em>ha funzionato<\/em>, ma non senza un paio di inghippi. Per prima cosa, parliamo della sintassi (Fig 5.3).<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/fig-5.3.jpg\" border=\"0\" alt=\"Adesso si ragiona.\" width=\"100%\" style=\"border: 0px;\" \/><\/p>\n<p>\u00a0<\/p>\n<p>Fig 5.3: Adesso si ragiona.<\/p>\n<p>\u00a0<\/p>\n<p>Ricordate che gli identificatori non possono contenere trattini e, dal momento che tutto \u00e8 una (specie) di oggetto, il DOM fa anche riferimento agli stili nel formato a oggetto. Ogni propriet\u00e0 CSS che contenga un trattino diventa invece \u201ccamel-cased\u201d: <code>margin-left<\/code> diventa <code>marginLeft<\/code>, <code>border-radius-top-left<\/code> diventa <code>borderRadiusTopLeft<\/code> e cos\u00ec via. Tuttavia, dal momento che il <em>valore<\/em> che impostiamo per queste propriet\u00e0 \u00e8 una stringa, i trattini vanno bene. Un po&#8217; strano e un&#8217;altra cosa da ricordare, ma \u00e8 tutto piuttosto gestibile, di sicuro non una ragione per evitare di assegnare stili in JavaScript, se la situazione lo rende assolutamente necessario.<\/p>\n<p>Una ragione migliore per evitare gli stili in JavaScript \u00e8 di mantenere una separazione tra comportamento e presentazione. JavaScript \u00e8 il nostro \u201cbehavioral\u201d layer nel modo in cui il CSS \u00e8 il nostro \u201cpresentational\u201d layer e spesso i due si devono incontrare. Cambiare stili su una pagina non dovrebbe significare cercare qualcosa riga dopo riga di funzioni e variabili, cos\u00ec come non vorremmo seppellire gli stili nel nostro markup. Le persone che potrebbero finire a mantenere gli stili del sito potrebbero non essere completamente a loro agio ad editare JavaScript e, dal momento che cambiare gli stili in JavaScript significa che stiamo indirettamente aggiungendo stili con l&#8217;attributo <code>style<\/code>, qualsiasi cosa scriviamo in uno script, di default sovrascriver\u00e0 i contenuti di un foglio di stile.<\/p>\n<p>Possiamo mantenere questa separazione di interessi usando invece di nuovo <code>setAttribute<\/code> per dare al nostro link una classe. Quindi, eliminiamo quelle due righe con gli stili e aggiungiamone una al loro posto che imposti la classe.<\/p>\n<pre id=\"snippet15\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"class\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"more-link\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>appendChild<span class=\"token punctuation\">(<\/span> newLink <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Adesso possiamo assegnare degli stili a <code>.more-link<\/code> nel nostro foglio di stile come al solito:<\/p>\n<pre id=\"snippet16\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">.more-link <\/span><span class=\"token punctuation\">{<\/span>\n    <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> inline-block<span class=\"token punctuation\">;<\/span>\n    <span class=\"token property\">margin-left<\/span><span class=\"token punctuation\">:<\/span> 10px<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Molto meglio (Fig 5.4). Conviene tenere a mente, per il futuro, che usare <code>setAttribute<\/code> in questo modo su un nodo nel DOM significa sovrascrivere qualsiasi classe sia gi\u00e0 presente sull&#8217;elemento, ma questo non \u00e8 un problema quando si mette insieme un elemento da zero.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/fig-5.4.jpg\" border=\"0\" alt=\"Nessun cambiamento visibile, ma questo cambiamento mantiene le decisioni di stile nel CSS e le decisioni sul comportamento in JavaScript.\" width=\"100%\" \/><\/p>\n<p>\u00a0<\/p>\n<p>Fig 5.4: Nessun cambiamento visibile, ma questo cambiamento mantiene le decisioni di stile nel CSS e le decisioni sul comportamento in JavaScript.<\/p>\n<p>\u00a0<\/p>\n<p>Ora siamo pronti a spostarci sul secondo item della nostra to do list: nascondere tutti gli altri paragrafi.<\/p>\n<p>Poich\u00e9 abbiamo fatto dei cambiamenti a del codice che sappiamo che funzionava gi\u00e0, assicuratevi di ricaricare la pagina per essere sicuri che tutto funzioni ancora secondo le aspettative. Non vogliamo introdurre un bug qui e continuare a scrivere codice, o alla fine ci impantaneremo in tutti i cambiamenti che abbiamo fatto. Se tutto \u00e8 andato secondo i piani, la pagina dovrebbe risultare uguale quando adesso la ricarichiamo.<\/p>\n<p>Adesso abbiamo una lista di tutti i paragrafi sulla pagina e abbiamo bisogno di agire su ciascuno di essi. Abbiamo bisogno di un loop e, dal momento che stiamo iterando su una node list simile a un array, abbiamo bisogno di un ciclo <code>for<\/code>. Giusto per essere sicuri che il loop funzioni correttamente, facciamo un log di ogni paragrafo nella console prima di procedere:<\/p>\n<pre id=\"snippet17\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"class\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"more-link\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">var<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> allParagraphs<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    console<span class=\"token punctuation\">.<\/span>log<span class=\"token punctuation\">(<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> i <span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>appendChild<span class=\"token punctuation\">(<\/span> newLink <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Il vostro link Read More dovrebbe ancora essere nel primo paragrafo come al solito e la vostra console dovrebbe essere piena di testo di riempimento (Fig 5.5).<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/fig-5.5.jpg\" border=\"0\" alt=\"Fig 5.5: Sembra che il nostro loop si stia comportando a dovere.\" width=\"100%\" style=\"border: 0px;\" \/><\/p>\n<p>\u00a0<\/p>\n<p>Fig 5.5: Sembra che il nostro loop si stia comportando a dovere.<\/p>\n<p>\u00a0<\/p>\n<p>Adesso dobbiamo nascondere quei paragrafi con <code>display: none<\/code> e abbiamo un paio di opzioni: potremmo usare una class nel modo in cui abbiamo fatto prima, ma non sarebbe un&#8217;idea terribile usare gli stili in JavaScript per questo scopo. Stiamo controllando tutto il meccanismo mostra e nascondi dal nostro script e non accadr\u00e0 mai che vorremo questo comportamento sovrascritto da qualcosa in un foglio di stile. In questo caso, ha senso usare i metodi built-in del DOM per applicare gli stili:<\/p>\n<pre id=\"snippet18\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"class\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"more-link\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">var<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> allParagraphs<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n    allParagraphs<span class=\"token punctuation\">[<\/span> i <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>style<span class=\"token punctuation\">.<\/span>display <span class=\"token operator\">=<\/span> <span class=\"token string\">\"none\"<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>appendChild<span class=\"token punctuation\">(<\/span> newLink <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Se adesso ricarichiamo la pagina, sar\u00e0 tutto sparito: il nostro JavaScript fa un loop in tutta la lista di paragrafi e li nasconde tutti. Dobbiamo fare un&#8217;eccezione per il primo paragrafo e questo significa logica condizionale, una dichiarazione <code>if<\/code> e la variabile <code>i<\/code> ci d\u00e0 un valore semplice con cui controllare:<\/p>\n<pre id=\"snippet19\" class=\" language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">var<\/span> newLink <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>createElement<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"a\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> allParagraphs <span class=\"token operator\">=<\/span> document<span class=\"token punctuation\">.<\/span>getElementsByTagName<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"p\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token keyword\">var<\/span> firstParagraph <span class=\"token operator\">=<\/span> allParagraphs<span class=\"token punctuation\">[<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\n\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"href\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"#\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>setAttribute<span class=\"token punctuation\">(<\/span> <span class=\"token string\">\"class\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"more-link\"<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\nnewLink<span class=\"token punctuation\">.<\/span>innerHTML <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Read more\"<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">var<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> allParagraphs<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> i <span class=\"token operator\">==<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\n            <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span>\n    <span class=\"token punctuation\">}<\/span>\n    allParagraphs<span class=\"token punctuation\">[<\/span> i <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>style<span class=\"token punctuation\">.<\/span>display <span class=\"token operator\">=<\/span> <span class=\"token string\">\"none\"<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\nfirstParagraph<span class=\"token punctuation\">.<\/span>appendChild<span class=\"token punctuation\">(<\/span> newLink <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<p>Se questa \u00e8 la prima volta nel loop, la parola chiave <code>continue<\/code> salta il resto dell&#8217;iterazione corrente e poi, a differenza di usare <code>break<\/code>, il loop continua verso l&#8217;iterazione seguente.<\/p>\n<p>Se adesso ricaricate la pagina, avremo un solo paragrafo con un link \u201dRead More\u201d alla fine, ma tutti gli altri saranno nascosti. Fin qui tutto bene e, se non avete ottenuto lo stesso risultato, controllate attentamente la console per essere sicuri che non manchi nulla.<\/p>\n<p>Ora che avete una solida base nel DOM, andiamo <em>davvero<\/em> a fondo per vedere dove ci porta.<\/p>\n<h2 id=\"section4\">Vuoi saperne di pi\u00f9?<\/h2>\n<p>Il resto di questo capitolo (oltre a quello che avete appena letto) va ancora pi\u00f9 nel dettaglio ed \u00e8 solo un capitolo della guida pratica di Mat per aiutarvi con il vostro attuale progetto. Date un&#8217;occhiata a <cite>JavaScript for Web Designers<\/cite> su <a href=\"https:\/\/abookapart.com\/products\/javascript-for-web-designers\">A Book Apart<\/a>.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u00c8 innegabile l&#8217;abilit\u00e0 di JavaScript nell&#8217;accedere a e nel modificare gli elementi sulla pagina e il Document Object Model \u00e8 un componente essenziale di tutto questo. In questo estratto dal nuovo libro di Mat Marquis, JavaScript for Web Designers, Mat ci mostra in che modo manovrare il DOM per ottenere risultati migliori dai nostri script.<\/p>\n","protected":false},"author":818,"featured_media":7000812,"comment_status":"open","ping_status":"open","template":"","categories":[271,160],"tags":[],"coauthors":[352],"class_list":["post-670","article","type-article","status-publish","has-post-thumbnail","hentry","category-javascript","category-numero-182-18-novembre-2016"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000812"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=670"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}