Tutorial Oggetti Javascript (collegamenti) - Tecnologie dell'informazione e della comunicazione Tecnologie dell'informazione e della comunicazione https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript 2024-05-06T03:54:34+00:00 Joomla! - Open Source Content Management Javascript Message Box Tutorial: come creare un oggetto che interagisce con il documento 2008-09-18T14:14:52+00:00 2008-09-18T14:14:52+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript-intro Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>La creazione degli oggetti in Javascript è una necessità nelle applicazioni che superano le poche righe.<img src="images/stories/msgbox/msg5-blue.jpg" border="0" align="right" /></p> <p>Tuttavia scrivere oggetti richiede inizialmente molta più fatica. Come ho scritto nel precedente articolo, questa maggior fatica iniziale viene ripagata in maggior facilità di manutenzione ed estensione dell'oggetto.</p> <p>Voglio qui illustrare le differenze tra approccio procedurale e creazione di oggetti di una funzione semplicissima, che visualizza un messaggio a video e invoca una funzione quando si preme un tasto.</p> <p>I 5 passi illustrano tutta la procedura, e vanno da un livello di complessità ridicolo fino ad affrontare diversi aspetti fondamentali dello sviluppo.</p> <p>I primi 3 passi sono compatibili con IE, i successivi con (grossomodo) tutti i browser</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/33-passo-1-html-js-css-senza-oggetti" title="Passo 1: html + js + css senza oggetti">Passo 1. Html + js + css</a></h3> <p>Partiremo da un singolo file html contenente il javascript, il css e l'html, che ha tre funzioni: una per mostrare il messaggio, e due invocate da ciascuno dei bottoni sul messaggio.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/34-passo-2-oggetto-in-javascript" title="Creiamo l'oggetto">Passo 2. Creiamo l'oggetto msgBox </a></h3> <p>per la sola visualizzazione del messaggio. Verifichiamo che continua a funzionare</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/35-passo-3-completiamo-la-funzionalita-base" title="Funzionalità base">Passo 3. Completiamo la funzionalità dell'oggetto </a></h3> <p>Vediamo come passare gli eventi avanti e indietro dalla funzione chiamante alla funzione di risposta.Introduciamo un metodo ask (bottoni si/no) e un metodo tell (solo bottone ok)</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/36-passo-4-separiamo-firefox" title="Multifile + firefox">Passo 4. Separiamo css, js, html in files separati, e aggiungiamo il supporto per firefox</a></h3> <p>Questo è lo step più importante.</p> <p>A questo punto abbiamo 100 righe di javascript. Per mostrare un messaggio. Imbarazzante, direste.</p> <p>Però abbiamo creato un oggetto che espone 2 funzioni, ask e tell, ma che è con pochissima fatica estendibile per gestire tutta la messaggistica di un programma, inclusi gli input di testo.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/37-passo-5-angoli-arrotondati" title="Multifile + firefox">Passo 5: angoli arrotondati</a></h3> <p>Anche l'occhio vuole la sua parte.</p> <p>Semplifichiamo anche l'uso spostando quanto possibile fuori dal file html principale.</p> <p> </p> <p><img src="images/stories/msgbox/msg9-lista.jpg" border="0" align="right" /></p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/38-passo-6-finestra-modale">Passo 6: finestra modale</a></h3> <p>Facciamo in modo che l'utente non possa interagire con il resto della pagina finché non ha cliccato un bottone.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/39-passo-7-tastiera">Passo 7: tastiera</a></h3> <p>Facciamo funzionare anche la tastiera</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/40-passo-8-timeout">Passo 8: timeout</a></h3> <p>Il timeout permette di specificare nelle funzioni un numero di secondi trascorsi i quali la finestra viene chiusa premendo il bottone predefinito.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/41-passo-9-liste" title="javascript tutorial: liste">Passo 9: Liste </a></h3> <p>La lista permette di proporre una lista di scelte all'utente che potrà poi sceglierne una.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/42-passo-10-integra" title="Integrazione con l'applicazione">Passo 10: Integrazione con l'applicazione</a></h3> <p>Testiamo la messagebox all'interno di una applicazione ajax. E vediamo quali modifiche sono necessarie</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/44-passo-11-allinea" title="Passo 11: Allineamento">Passo 11: Allineamento</a></h3> <p>Un approccio per spostare la messageBox una volta creata</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/45-passo-12-istanze" title="Istanze multiple dell'oggetto">Passo 12: Multi-istanza</a></h3> <p>Rendiamo possibile creare più istanze della messageBox sulla stessa pagina. Quindi modifichiamo le callBack e usiamo qualche escamotage per risolvere semplicemente la questione.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/46-passo-13-modifica-testo" title="Istanze multiple dell'oggetto">Passo 13: Input di testo<img src="images/stories/msgbox/msg12-testo.jpg" border="0" width="252" height="177" align="right" /></a></h3> <p>Accettiamo l'input per un numero variabile di campi.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/47-passo-14-tastiera-a-video" title="Passo 14: Tastiera a video">Passo 14: L'oggetto Tastiera a video</a></h3> <p>Disegno una tastiera a video per permettere l'input anche agli utenti con touch screen</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/51-passo-16-tastiere-specializzate" title="Tastiere specializzate">Passo 16: Tastiere specializzate</a></h3> <p><em>Derivo (eredito) dall'oggetto Tastiera per creare tastiere "specializzate", numerica e alfa; dimostro come usarla senza la msgBox<br /></em></p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/49-passo-18-tastiera-grafica" title="Passo 18 - Tastiera grafica">Passo 18: Tastiera grafica per single-input e un po' di grafica...</a></h3> <p>Ora però facciamo qualche modifica per poter usare la nostra tastiera più rapidamente, diciamo con una riga di codice: derivo un nuovo oggetto, imposto una callback e... perdo 2 ore a disegnare tastini :-) . Sorry niente FF per questo passo.<img src="images/stories/msgbox/msg18-grafica.jpg" border="0" width="250" height="268" align="right" /></p> <p><em>Passo ?: Auto-creazione da XML</em></p> <p><em>L'intento (ardito) è di creare una estensione del metodo request() che genericamente prenda un file XML, ne esamini una parte, derivi la struttura dal file stesso e ne proponga i valori come scelte possibili; quindi restituisca i valori incluso l'indice della scelta.<br /></em></p> <p><em>Passo ?: Validazione dell'input </em></p> <hr width="100%" size="2" /> <p> </p> <p>Si d'accordo, questo è solo l'indice.</p> <p>Le spiegazioni sono commentate all'interno del codice. <a href="files/corso_javascript_18.rar" title="Javascript objects">Clic per scaricare</a>. (Corso 1-18)<a href="files/corso_javascript_18.rar"><img src="images/stories/msgbox/download.png" border="0" align="right" /></a>. <br />L'archivio è diviso in una cartella per ciascuna lezione. All'interno della stessa trovate msgBox.html - che potete usare per testarla.</p> <p><strong>Attenzione: </strong>msgBox e derivati sono sviluppati con l'intento di semplificare e uniformare la gestione della comunicazione con l'utente all'interno dell'applicazione HappyOrder. Vengono resi disponibili anche tramite questo corso perché crediamo che siano un semplice strumento per seguire l'evoluzione di un oggetto e capire quanto si risparmi nella manutenzione.<br /><br /></p> <h3>Che altro?</h3> <p>Appena iniziate a mettere in pratica questi esempi, procedete per punti "saldi". Appena ottenuto uno dei risultati che vi prefiggete, fate un commit sull'svn oppure zippate (con il rar si intende) la cartella coi sorgenti, e dategli un nome. Più tardi potrà tornarvi utile.</p> <p>Tenete sempre sottomano il vostro codice funzionante. E' molto più veloce che consultare la documentazione!</p> <p>E la documentazione, mettetevela nella homepage di firefox.</p> <p>Risorse essenziali:</p> <p><a href="http://www.evotech.net/blog/2007/06/introduction-to-firebug/">introduction to firebug</a></p> <p>Mozilla Developer Center<br /> <a href="http://developer.mozilla.org/en/JavaScript" target="_blank" title="Mozilla Developer Center">http://developer.mozilla.org/en/JavaScript</a><br /> <br /> MSDN JScript Language Reference<br /> <a href="http://msdn.microsoft.com/en-us/library/yek4tbz0.aspx" title="MSDN JScript Language Reference">http://msdn.microsoft.com/en-us/library/yek4tbz0.aspx</a></p></div> <div class="feed-description"><p>La creazione degli oggetti in Javascript è una necessità nelle applicazioni che superano le poche righe.<img src="images/stories/msgbox/msg5-blue.jpg" border="0" align="right" /></p> <p>Tuttavia scrivere oggetti richiede inizialmente molta più fatica. Come ho scritto nel precedente articolo, questa maggior fatica iniziale viene ripagata in maggior facilità di manutenzione ed estensione dell'oggetto.</p> <p>Voglio qui illustrare le differenze tra approccio procedurale e creazione di oggetti di una funzione semplicissima, che visualizza un messaggio a video e invoca una funzione quando si preme un tasto.</p> <p>I 5 passi illustrano tutta la procedura, e vanno da un livello di complessità ridicolo fino ad affrontare diversi aspetti fondamentali dello sviluppo.</p> <p>I primi 3 passi sono compatibili con IE, i successivi con (grossomodo) tutti i browser</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/33-passo-1-html-js-css-senza-oggetti" title="Passo 1: html + js + css senza oggetti">Passo 1. Html + js + css</a></h3> <p>Partiremo da un singolo file html contenente il javascript, il css e l'html, che ha tre funzioni: una per mostrare il messaggio, e due invocate da ciascuno dei bottoni sul messaggio.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/34-passo-2-oggetto-in-javascript" title="Creiamo l'oggetto">Passo 2. Creiamo l'oggetto msgBox </a></h3> <p>per la sola visualizzazione del messaggio. Verifichiamo che continua a funzionare</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/35-passo-3-completiamo-la-funzionalita-base" title="Funzionalità base">Passo 3. Completiamo la funzionalità dell'oggetto </a></h3> <p>Vediamo come passare gli eventi avanti e indietro dalla funzione chiamante alla funzione di risposta.Introduciamo un metodo ask (bottoni si/no) e un metodo tell (solo bottone ok)</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/36-passo-4-separiamo-firefox" title="Multifile + firefox">Passo 4. Separiamo css, js, html in files separati, e aggiungiamo il supporto per firefox</a></h3> <p>Questo è lo step più importante.</p> <p>A questo punto abbiamo 100 righe di javascript. Per mostrare un messaggio. Imbarazzante, direste.</p> <p>Però abbiamo creato un oggetto che espone 2 funzioni, ask e tell, ma che è con pochissima fatica estendibile per gestire tutta la messaggistica di un programma, inclusi gli input di testo.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/37-passo-5-angoli-arrotondati" title="Multifile + firefox">Passo 5: angoli arrotondati</a></h3> <p>Anche l'occhio vuole la sua parte.</p> <p>Semplifichiamo anche l'uso spostando quanto possibile fuori dal file html principale.</p> <p> </p> <p><img src="images/stories/msgbox/msg9-lista.jpg" border="0" align="right" /></p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/38-passo-6-finestra-modale">Passo 6: finestra modale</a></h3> <p>Facciamo in modo che l'utente non possa interagire con il resto della pagina finché non ha cliccato un bottone.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/39-passo-7-tastiera">Passo 7: tastiera</a></h3> <p>Facciamo funzionare anche la tastiera</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/40-passo-8-timeout">Passo 8: timeout</a></h3> <p>Il timeout permette di specificare nelle funzioni un numero di secondi trascorsi i quali la finestra viene chiusa premendo il bottone predefinito.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/41-passo-9-liste" title="javascript tutorial: liste">Passo 9: Liste </a></h3> <p>La lista permette di proporre una lista di scelte all'utente che potrà poi sceglierne una.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/42-passo-10-integra" title="Integrazione con l'applicazione">Passo 10: Integrazione con l'applicazione</a></h3> <p>Testiamo la messagebox all'interno di una applicazione ajax. E vediamo quali modifiche sono necessarie</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/44-passo-11-allinea" title="Passo 11: Allineamento">Passo 11: Allineamento</a></h3> <p>Un approccio per spostare la messageBox una volta creata</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/45-passo-12-istanze" title="Istanze multiple dell'oggetto">Passo 12: Multi-istanza</a></h3> <p>Rendiamo possibile creare più istanze della messageBox sulla stessa pagina. Quindi modifichiamo le callBack e usiamo qualche escamotage per risolvere semplicemente la questione.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/46-passo-13-modifica-testo" title="Istanze multiple dell'oggetto">Passo 13: Input di testo<img src="images/stories/msgbox/msg12-testo.jpg" border="0" width="252" height="177" align="right" /></a></h3> <p>Accettiamo l'input per un numero variabile di campi.</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/47-passo-14-tastiera-a-video" title="Passo 14: Tastiera a video">Passo 14: L'oggetto Tastiera a video</a></h3> <p>Disegno una tastiera a video per permettere l'input anche agli utenti con touch screen</p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/51-passo-16-tastiere-specializzate" title="Tastiere specializzate">Passo 16: Tastiere specializzate</a></h3> <p><em>Derivo (eredito) dall'oggetto Tastiera per creare tastiere "specializzate", numerica e alfa; dimostro come usarla senza la msgBox<br /></em></p> <h3><a href="articoli-tecnici/tutorial-oggetti-javascript/49-passo-18-tastiera-grafica" title="Passo 18 - Tastiera grafica">Passo 18: Tastiera grafica per single-input e un po' di grafica...</a></h3> <p>Ora però facciamo qualche modifica per poter usare la nostra tastiera più rapidamente, diciamo con una riga di codice: derivo un nuovo oggetto, imposto una callback e... perdo 2 ore a disegnare tastini :-) . Sorry niente FF per questo passo.<img src="images/stories/msgbox/msg18-grafica.jpg" border="0" width="250" height="268" align="right" /></p> <p><em>Passo ?: Auto-creazione da XML</em></p> <p><em>L'intento (ardito) è di creare una estensione del metodo request() che genericamente prenda un file XML, ne esamini una parte, derivi la struttura dal file stesso e ne proponga i valori come scelte possibili; quindi restituisca i valori incluso l'indice della scelta.<br /></em></p> <p><em>Passo ?: Validazione dell'input </em></p> <hr width="100%" size="2" /> <p> </p> <p>Si d'accordo, questo è solo l'indice.</p> <p>Le spiegazioni sono commentate all'interno del codice. <a href="files/corso_javascript_18.rar" title="Javascript objects">Clic per scaricare</a>. (Corso 1-18)<a href="files/corso_javascript_18.rar"><img src="images/stories/msgbox/download.png" border="0" align="right" /></a>. <br />L'archivio è diviso in una cartella per ciascuna lezione. All'interno della stessa trovate msgBox.html - che potete usare per testarla.</p> <p><strong>Attenzione: </strong>msgBox e derivati sono sviluppati con l'intento di semplificare e uniformare la gestione della comunicazione con l'utente all'interno dell'applicazione HappyOrder. Vengono resi disponibili anche tramite questo corso perché crediamo che siano un semplice strumento per seguire l'evoluzione di un oggetto e capire quanto si risparmi nella manutenzione.<br /><br /></p> <h3>Che altro?</h3> <p>Appena iniziate a mettere in pratica questi esempi, procedete per punti "saldi". Appena ottenuto uno dei risultati che vi prefiggete, fate un commit sull'svn oppure zippate (con il rar si intende) la cartella coi sorgenti, e dategli un nome. Più tardi potrà tornarvi utile.</p> <p>Tenete sempre sottomano il vostro codice funzionante. E' molto più veloce che consultare la documentazione!</p> <p>E la documentazione, mettetevela nella homepage di firefox.</p> <p>Risorse essenziali:</p> <p><a href="http://www.evotech.net/blog/2007/06/introduction-to-firebug/">introduction to firebug</a></p> <p>Mozilla Developer Center<br /> <a href="http://developer.mozilla.org/en/JavaScript" target="_blank" title="Mozilla Developer Center">http://developer.mozilla.org/en/JavaScript</a><br /> <br /> MSDN JScript Language Reference<br /> <a href="http://msdn.microsoft.com/en-us/library/yek4tbz0.aspx" title="MSDN JScript Language Reference">http://msdn.microsoft.com/en-us/library/yek4tbz0.aspx</a></p></div> Passo 1: html + js + css senza oggetti 2008-09-19T04:26:05+00:00 2008-09-19T04:26:05+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/33-passo-1-html-js-css-senza-oggetti Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><h2>HTML <br /></h2><p>Il primo passo è creare un layer &lt;DIV&gt; nel quale andremo a mettere testi e bottoni.</p><pre>&lt;DIV ID="msgBox"&gt;<br />    &lt;SPAN ID="msgBoxtext"&gt;<br />        Ciao Gino bella giornata<br />    &lt;/SPAN&gt;<br />    &lt;br&gt;<br />    &lt;A ID="msgBox1" onclick="javascript:msgBoxYes()"&gt;Yes&lt;/A&gt;<br />    &lt;A ID="msgBox2" onclick="javascript:msgBoxNo()"&gt;No&lt;/A&gt;<br />&lt;/DIV&gt;</pre><h2>Css <br /></h2><p>Il tag &lt;STYLE&gt; permette di inserire inline (cioè dentro allo stesso file) una porzione di CSS: deve essere inserito all'interno della sezione &lt;HEAD&gt; (anche se poco cambia metterlo dentro al &lt;BODY&gt; </p><pre>&lt;STYLE&gt;<br />    DIV#msgBox {width:450px; height:386px; background-color:yellow; color: navy; border: thin inset red;<br />        position: absolute; left: 150px; top:50px; text-align:center; margin:40px; display:none}<br />    DIV#msgBox A {text-decoration: none; font-size:120%; width:30%; height:10%; border:thin inset black; margin-top:200px}<br />    A#msgBox1 {font-weight: bold}<br />&lt;/STYLE&gt;</pre><p>(Lo so che fa schifo, concentriamci sul javascript e basta) </p><h2>Script <br /></h2><p>Anche lo script è inline, con il tag &lt;SCRIPT&gt;.</p><p>Vediamolo nel dettaglio </p><pre>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <br /></pre><p>Assegno una variabile al layer che contiene il messaggio; così dovrò cercare il layer una volta sola, mentre i bottoni che chiudono la finestra di messaggio possono accedere direttamente alla variabile. </p><p>Qui sto contravvenendo a quanto detto nel decalogo: la manipolazione diretta dello stile.</p><p>Però lo sto facendo con il solo proposito di mostrare/nascondere un elemento; possiamo anche definire una classe "nascosto" e associare classi multiple ad un oggetto; ma non aggiungeremmo nulla alla manutenibilità del codice.</p> <pre>var msgBoxDiv <br />    function showMessage(msg)<br />    {<br />         msgBoxDiv = document.getElementById("msgBox")<br />         msgBoxDiv.style.display = "block"<br />    }</pre><p>Il message Box ha due bottoni; ciascuno invoca una funzione diversa, che provvede - come minimo - a chiudere (nascondere) il layer.</p><p>Per il posizionamento dei layers, display:block indica che il tag viene visualizzato su una nuova riga e seguito da un a capo; display:inline che segue il testo; display: none che non viene proprio visualizzato; è più comodo per il layout manipolare display: che non visibility: </p><pre>function msgBoxYes()<br />    {<br />        alert('yes');<br />        msgBoxDiv.style.display = "none"<br /><br />    }<br />    function msgBoxNo()<br />    {<br />        alert('no');<br />        msgBoxDiv.style.display = "none"<br />    } </pre><p>&lt;/SCRIPT&gt; </p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a><br /><p>&nbsp;</p></div> <div class="feed-description"><h2>HTML <br /></h2><p>Il primo passo è creare un layer &lt;DIV&gt; nel quale andremo a mettere testi e bottoni.</p><pre>&lt;DIV ID="msgBox"&gt;<br />    &lt;SPAN ID="msgBoxtext"&gt;<br />        Ciao Gino bella giornata<br />    &lt;/SPAN&gt;<br />    &lt;br&gt;<br />    &lt;A ID="msgBox1" onclick="javascript:msgBoxYes()"&gt;Yes&lt;/A&gt;<br />    &lt;A ID="msgBox2" onclick="javascript:msgBoxNo()"&gt;No&lt;/A&gt;<br />&lt;/DIV&gt;</pre><h2>Css <br /></h2><p>Il tag &lt;STYLE&gt; permette di inserire inline (cioè dentro allo stesso file) una porzione di CSS: deve essere inserito all'interno della sezione &lt;HEAD&gt; (anche se poco cambia metterlo dentro al &lt;BODY&gt; </p><pre>&lt;STYLE&gt;<br />    DIV#msgBox {width:450px; height:386px; background-color:yellow; color: navy; border: thin inset red;<br />        position: absolute; left: 150px; top:50px; text-align:center; margin:40px; display:none}<br />    DIV#msgBox A {text-decoration: none; font-size:120%; width:30%; height:10%; border:thin inset black; margin-top:200px}<br />    A#msgBox1 {font-weight: bold}<br />&lt;/STYLE&gt;</pre><p>(Lo so che fa schifo, concentriamci sul javascript e basta) </p><h2>Script <br /></h2><p>Anche lo script è inline, con il tag &lt;SCRIPT&gt;.</p><p>Vediamolo nel dettaglio </p><pre>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <br /></pre><p>Assegno una variabile al layer che contiene il messaggio; così dovrò cercare il layer una volta sola, mentre i bottoni che chiudono la finestra di messaggio possono accedere direttamente alla variabile. </p><p>Qui sto contravvenendo a quanto detto nel decalogo: la manipolazione diretta dello stile.</p><p>Però lo sto facendo con il solo proposito di mostrare/nascondere un elemento; possiamo anche definire una classe "nascosto" e associare classi multiple ad un oggetto; ma non aggiungeremmo nulla alla manutenibilità del codice.</p> <pre>var msgBoxDiv <br />    function showMessage(msg)<br />    {<br />         msgBoxDiv = document.getElementById("msgBox")<br />         msgBoxDiv.style.display = "block"<br />    }</pre><p>Il message Box ha due bottoni; ciascuno invoca una funzione diversa, che provvede - come minimo - a chiudere (nascondere) il layer.</p><p>Per il posizionamento dei layers, display:block indica che il tag viene visualizzato su una nuova riga e seguito da un a capo; display:inline che segue il testo; display: none che non viene proprio visualizzato; è più comodo per il layout manipolare display: che non visibility: </p><pre>function msgBoxYes()<br />    {<br />        alert('yes');<br />        msgBoxDiv.style.display = "none"<br /><br />    }<br />    function msgBoxNo()<br />    {<br />        alert('no');<br />        msgBoxDiv.style.display = "none"<br />    } </pre><p>&lt;/SCRIPT&gt; </p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a><br /><p>&nbsp;</p></div> Passo 2: Oggetto in javascript 2008-09-19T04:30:34+00:00 2008-09-19T04:30:34+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/34-passo-2-oggetto-in-javascript Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>La creazione di oggetti in un linguaggio di programmazione è una pratica assolutamente fondamentale nella realizzazione di applicazioni complesse; ma come forma mentis aiuta farlo anche se costruite piccoli programmi di utilità.</p><p>In questo articolo discutiamo come creare tecnicamente un oggetto; tuttavia ben più importante è analizzare il problema e definire quali metodi e proprietà ed eventi debba avere questo oggetto per soddisfare al requisito di poter esistere indipendentemente dall'applicazione che lo usa.</p><p>In particolare, questo è indispensabile per effettuare sviluppo test-driven. Permette di raggiungere livelli di sicurezza notevoli; ma è anche il modo più facile per garantire che qualunque cosa riguardi l'oggetto non esce dai confini dell'oggetto; e quindi posso con tranquillità incorporare l'oggetto in progetti diversi, e aggiornarlo, senza dover cambiare altro codice fuori dall'oggetto. </p><p>Qui vogliamo concentrarci solo sulle differenze tra le funzioni che abbiamo creato nel passo 1, e la loro trasformazione in oggetto.</p><p>L'oggetto viene instanziato (creato) da</p><pre>var msgBox = new _msgBox()<br /></pre><p>dove <strong>_msgBox()</strong> è una funzione normalissima all'interno della quale è possibile definire alcune proprietà usando l'oggetto <strong>this.</strong> </p><pre>// --------------------- _msgBox --------------------------------<br />// L'oggetto _msgBox, che verrà istanziato nella variabile msgBox.<br />function _msgBox()<br />{<br />    // le proprietà dell'oggetto si definiscono usando la parola riservata this.<br />    this.divMsg;<br />    this.message = "";<br />    this.button1 = "Yes";<br />    this.button2 = "No";<br />    this.button1Result = true;<br />    this.button2Result = false;<br />}</pre><p>Ho creato alcune proprietà che saranno utili più avanti.</p><p>Per quanto riguarda i metodi, benché sia possibile dichiararli in-line, è francamente molto più semplice e ordinato modificare il prototype dell'oggetto appena creato: quindi</p><pre>// Le funzioni invece si definiscono più comodamente con prototype.<br />_msgBox.prototype.ask = function (msgHTML)<br />{<br />    this.divMsg = document.getElementById("msgbox")<br />    this.button1 = "Yes";<br />    this.button2 = "No";<br />    this.button1Result = true;<br />    this.button2Result = false;<br />    this.divMsg.firstChild.innerHTML = msgHTML;<br />    this.divMsg.style.display = "block"<br />}</pre><p>A questo punto sarà possibile invocare la nuova funzione (l'oggetto è già istanziato): quindi</p><pre>&lt;a href="#" onclick="javascript:msgBox.ask('dormi?')"&gt;dormi?&lt;/a&gt;&lt;br&gt;</pre><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> <div class="feed-description"><p>La creazione di oggetti in un linguaggio di programmazione è una pratica assolutamente fondamentale nella realizzazione di applicazioni complesse; ma come forma mentis aiuta farlo anche se costruite piccoli programmi di utilità.</p><p>In questo articolo discutiamo come creare tecnicamente un oggetto; tuttavia ben più importante è analizzare il problema e definire quali metodi e proprietà ed eventi debba avere questo oggetto per soddisfare al requisito di poter esistere indipendentemente dall'applicazione che lo usa.</p><p>In particolare, questo è indispensabile per effettuare sviluppo test-driven. Permette di raggiungere livelli di sicurezza notevoli; ma è anche il modo più facile per garantire che qualunque cosa riguardi l'oggetto non esce dai confini dell'oggetto; e quindi posso con tranquillità incorporare l'oggetto in progetti diversi, e aggiornarlo, senza dover cambiare altro codice fuori dall'oggetto. </p><p>Qui vogliamo concentrarci solo sulle differenze tra le funzioni che abbiamo creato nel passo 1, e la loro trasformazione in oggetto.</p><p>L'oggetto viene instanziato (creato) da</p><pre>var msgBox = new _msgBox()<br /></pre><p>dove <strong>_msgBox()</strong> è una funzione normalissima all'interno della quale è possibile definire alcune proprietà usando l'oggetto <strong>this.</strong> </p><pre>// --------------------- _msgBox --------------------------------<br />// L'oggetto _msgBox, che verrà istanziato nella variabile msgBox.<br />function _msgBox()<br />{<br />    // le proprietà dell'oggetto si definiscono usando la parola riservata this.<br />    this.divMsg;<br />    this.message = "";<br />    this.button1 = "Yes";<br />    this.button2 = "No";<br />    this.button1Result = true;<br />    this.button2Result = false;<br />}</pre><p>Ho creato alcune proprietà che saranno utili più avanti.</p><p>Per quanto riguarda i metodi, benché sia possibile dichiararli in-line, è francamente molto più semplice e ordinato modificare il prototype dell'oggetto appena creato: quindi</p><pre>// Le funzioni invece si definiscono più comodamente con prototype.<br />_msgBox.prototype.ask = function (msgHTML)<br />{<br />    this.divMsg = document.getElementById("msgbox")<br />    this.button1 = "Yes";<br />    this.button2 = "No";<br />    this.button1Result = true;<br />    this.button2Result = false;<br />    this.divMsg.firstChild.innerHTML = msgHTML;<br />    this.divMsg.style.display = "block"<br />}</pre><p>A questo punto sarà possibile invocare la nuova funzione (l'oggetto è già istanziato): quindi</p><pre>&lt;a href="#" onclick="javascript:msgBox.ask('dormi?')"&gt;dormi?&lt;/a&gt;&lt;br&gt;</pre><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> Passo 3: Completiamo la funzionalità base 2008-09-19T04:37:37+00:00 2008-09-19T04:37:37+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/35-passo-3-completiamo-la-funzionalita-base Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Il funzionamento di un oggetto richiede che anche la comunicazione iniziata dall'oggetto verso il programma chiamante sia gestita dall'interno dell'oggetto. In inglese si usa il termina CALLBACK per indicare una seconda funzione passata come parametro da una prima funzione, e che verrà invocata dalla prima funzione quando si saranno verificati eventi.</p><p>L'analogo in un linguaggio di programmazione che dispone di una IDE è il controllo bottone, che ha una proprietà onclick: là collegheremo una nostra funzione. Al verificarsi dell'evento la funzione collegata alla proprietà onclick verrà invocata.</p><p>In javascript non abbiamo grossi problemi a passare la funzione, basta passarla per nome.</p><p>Per comodità la registro in una variabile. </p><p>&nbsp;</p><p>Quindi qui ho definito una prima procedura che collega gli eventi ai bottoni: e già che c'è gli assegna anche i valori standard per il testo ed il messaggio di risposta che dovranno fornire; Quindi assegna come proprietà dell'oggetto     this.callBackFunction la funzione che andrà invocata quando l'utente chiude il message box.</p><p>Il funzionamento è piuttosto lineare: assegno a buttonXDiv il &lt;DIV&gt; corrispondente, e lo trovo usando il suo ID;  </p><pre>_msgBox.prototype.attachEvents = function (aCallBackFunction)<br />{<br />    if (!this.button1Div)<br />        this.button1Div = document.getElementById("msgBox1");<br />    if (!this.button2Div)<br />        this.button2Div = document.getElementById("msgBox2");</pre><p>Questa è simpatica: questa istruzione può tradursi: if (this.button1) return "inline" else return "none". Molto sintetica, permette di ridurre le dimensioni del codice aumentando la leggibilità. Se ne usate più di una nella stessa riga, commentate e spiegate cosa state facendo: altrimenti lo capirete solo voi.</p><p>    this.button1Div.style.display=(this.button1?"inline":"none");<br />    this.button2Div.style.display=(this.button2?"inline":"none");<br />    this.callBackFunction = aCallBackFunction<br /><br />    // assegnare testi e funzioni ai pulsanti. L'evento deve prima essere de-assegnato altrimenti man mano che questa funzione viene eseguita, mi ritroverò ad eseguire l'evento onclick 2,3,4 volte per ciascun click.</p><p>&nbsp;</p><pre>    if (this.button1)<br />    {<br />        this.button1Div.detachEvent('onclick', this.buttonEvent); <br />        this.button1Div.attachEvent('onclick', this.buttonEvent); <br />        this.button1Div.msgResult = this.button1Result;<br />    }<br />    if (this.button2)<br />    {<br />        this.button2Div.detachEvent('onclick', this.buttonEvent); <br />        this.button2Div.attachEvent('onclick', this.buttonEvent); <br />        this.button2Div.msgResult = this.button2Result;<br />    }<br />}</pre><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> <div class="feed-description"><p>Il funzionamento di un oggetto richiede che anche la comunicazione iniziata dall'oggetto verso il programma chiamante sia gestita dall'interno dell'oggetto. In inglese si usa il termina CALLBACK per indicare una seconda funzione passata come parametro da una prima funzione, e che verrà invocata dalla prima funzione quando si saranno verificati eventi.</p><p>L'analogo in un linguaggio di programmazione che dispone di una IDE è il controllo bottone, che ha una proprietà onclick: là collegheremo una nostra funzione. Al verificarsi dell'evento la funzione collegata alla proprietà onclick verrà invocata.</p><p>In javascript non abbiamo grossi problemi a passare la funzione, basta passarla per nome.</p><p>Per comodità la registro in una variabile. </p><p>&nbsp;</p><p>Quindi qui ho definito una prima procedura che collega gli eventi ai bottoni: e già che c'è gli assegna anche i valori standard per il testo ed il messaggio di risposta che dovranno fornire; Quindi assegna come proprietà dell'oggetto     this.callBackFunction la funzione che andrà invocata quando l'utente chiude il message box.</p><p>Il funzionamento è piuttosto lineare: assegno a buttonXDiv il &lt;DIV&gt; corrispondente, e lo trovo usando il suo ID;  </p><pre>_msgBox.prototype.attachEvents = function (aCallBackFunction)<br />{<br />    if (!this.button1Div)<br />        this.button1Div = document.getElementById("msgBox1");<br />    if (!this.button2Div)<br />        this.button2Div = document.getElementById("msgBox2");</pre><p>Questa è simpatica: questa istruzione può tradursi: if (this.button1) return "inline" else return "none". Molto sintetica, permette di ridurre le dimensioni del codice aumentando la leggibilità. Se ne usate più di una nella stessa riga, commentate e spiegate cosa state facendo: altrimenti lo capirete solo voi.</p><p>    this.button1Div.style.display=(this.button1?"inline":"none");<br />    this.button2Div.style.display=(this.button2?"inline":"none");<br />    this.callBackFunction = aCallBackFunction<br /><br />    // assegnare testi e funzioni ai pulsanti. L'evento deve prima essere de-assegnato altrimenti man mano che questa funzione viene eseguita, mi ritroverò ad eseguire l'evento onclick 2,3,4 volte per ciascun click.</p><p>&nbsp;</p><pre>    if (this.button1)<br />    {<br />        this.button1Div.detachEvent('onclick', this.buttonEvent); <br />        this.button1Div.attachEvent('onclick', this.buttonEvent); <br />        this.button1Div.msgResult = this.button1Result;<br />    }<br />    if (this.button2)<br />    {<br />        this.button2Div.detachEvent('onclick', this.buttonEvent); <br />        this.button2Div.attachEvent('onclick', this.buttonEvent); <br />        this.button2Div.msgResult = this.button2Result;<br />    }<br />}</pre><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> Passo 4: separiamo + firefox 2008-09-19T04:51:34+00:00 2008-09-19T04:51:34+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/36-passo-4-separiamo-firefox Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>A questo punto c'è un po' di codice, vediamo di dare una struttura ragionevole al nostro "progetto". Creeremo un file per lo stile, uno per il javascript che contiene tutta la logica del msgBox, uno per l'html.</p><h3>Javascript</h3><p>Il codice javascript (senza i tag &lt;SCRIPT&gt;) può essere copiato in questo file (msgbox.js); per collegarlo al mio file HTML, inserirò il tag</p><pre>&lt;SCRIPT type="text/javascript" src="msgbox.js"&gt;&lt;/SCRIPT&gt;</pre><h3>CSS</h3><p>Altrettanto vale per il css: le regole vengono copiate in un file esterno (msgbox.css) quindi facciamo riferimento a questo file dall'header del file HTML inserendo:</p><pre>&lt;LINK href="msgbox.css" rel="stylesheet" type="text/css"&gt; </pre><h3>HTML</h3><pre>E l'HTML? quello che resta :-) <br /></pre><h2>Firefox <br /></h2><p>Ora possiamo estendere un po' le funzionalità del nostro message box per includere supporto per firefox, e separare un po' di logica ripetuta in funzioni dedicate.</p><p>Il DOM è unico, ma l'implementazione delle funzioni che servono per manipolarlo è un po' diversa tra i vari browser; Per il momento le differenze son minime, quindi possiamo gestirle direttamente; in ambito applicativo, meglio utilizzare un framework che si occupi per noi di gestire queste differenze (e che qualcun altro tenga aggiornato)!!! Ho dovuto modificare due mesi fa una pagina scritta nel '97 perché - per quanto uno cerchi di essere lungimirante - i framework di riferimento evolvono e cambiano.  Il prossimo capitolo è dedicato a questi framework.</p><p><strong>Nota bene: </strong>quando scrivo Firefox, si applica a Google Chrome, Opera e Safari normalmente. Non ho controllato su questi browser tuttavia. Nel 95% dei casi è comunque sufficiente gestire due soli casi, internet explorer e "gli altri".  </p><h4>Scuse ufficiali</h4><p>Ho rinominato un paio di funzioni e variabili in italiano. attachEvents() è diventato collegaEventi(); poi ho creato una funzione collegaEvento() che gestisce le differenze da Firefox e IE. </p><pre>_msgBox.prototype.collegaEvento = function (aElement, aEventName, aEvent, aMsgResult)<br />{<br /> // aElement: l'elemento cui collegare l'evento<br /> // aEventName: "click" per esempio<br /> // aEvent: la funzione che deve essere invocata quando si verifica aEventName<br /> // aMsgResult: il risultato di questo bottone.<br /><br /> // Ora devo collegare gli eventi. Devo gestire la differenza tra firefox e ie ecc.<br /><br /> aElement.msgResult = aMsgResult;<br /> if (aElement.detachEvent) // per sapere se esiste - su firefox non esiste<br /> { // ie<br /> aElement.detachEvent('on'+aEventName, aEvent); <br /> aElement.attachEvent('on'+aEventName, aEvent); <br /> }<br /> else<br /> { // other browsers<br /> aElement.removeEventListener(aEventName, aEvent, false);<br /> aElement.addEventListener(aEventName, aEvent, false);<br /> }<br />}<br /><br />_msgBox.prototype.collegaEventi = function (aCallBackFunction)<br />{<br /> this.divMsg = document.getElementById("msgBox")<br /><br /> if (!(this.button1Div instanceof Object))<br /> this.button1Div = document.getElementById("msgBox1");<br /> if (!(this.button2Div instanceof Object))<br /> this.button2Div = document.getElementById("msgBox2");<br /><br /> this.button1Div.style.display=(this.button1?"inline":"none");<br /> this.button2Div.style.display=(this.button2?"inline":"none");<br /> this.callBackFunction = aCallBackFunction<br /><br /> // assegnare testi e funzioni ai pulsanti.<br /> if (this.button1)<br /> {<br /> this.collegaEvento(this.button1Div, 'click', this.buttonEvent, this.button1Result);<br /> }<br /> <br /> if (this.button2)<br /> {<br /> this.collegaEvento(this.button2Div, 'click', this.buttonEvent, this.button2Result);<br /> }<br />}</pre><p>Anche nella funzione buttonEvent è necessario gestire la differenza tra ie e firefox:</p><pre>_msgBox.prototype.buttonEvent = function(e)<br />{<br />    // Questo evento viene invocato dal bottone cliccato yes no ecc.<br />    // quindi non ha un accesso diretto all'istanzqa dell'oggetto dall'interno<br />    // e bisogna usare il riferimento assoluto<br />    msgBox.divMsg.style.display = "none"<br />    if (e instanceof Object)<br />    { // firefox<br />        msgBox.callBackFunction(e.target.msgResult)<br />    }<br />    else<br />        msgBox.callBackFunction(event.srcElement.msgResult);<br /><br />} </pre><p>Con queste due funzioni abbiamo finito di separare il codice.</p><p>E' evidente come per aggiungere nuove funzionalità posso concentrarmi sulle mie funzioni usando le funzioni generiche collegaEvento(). Nelle funzioni interne di un oggetto, può essere conveniente usare un paio di parametri in più per lasciare spazio alle estensioni future; mentre per i metodi esposti (pubblici) è fondamentale permettere il funzionamento anche con un numero minimo di parametri, per semplificarne l'uso all'interno del codice.  </p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> <div class="feed-description"><p>A questo punto c'è un po' di codice, vediamo di dare una struttura ragionevole al nostro "progetto". Creeremo un file per lo stile, uno per il javascript che contiene tutta la logica del msgBox, uno per l'html.</p><h3>Javascript</h3><p>Il codice javascript (senza i tag &lt;SCRIPT&gt;) può essere copiato in questo file (msgbox.js); per collegarlo al mio file HTML, inserirò il tag</p><pre>&lt;SCRIPT type="text/javascript" src="msgbox.js"&gt;&lt;/SCRIPT&gt;</pre><h3>CSS</h3><p>Altrettanto vale per il css: le regole vengono copiate in un file esterno (msgbox.css) quindi facciamo riferimento a questo file dall'header del file HTML inserendo:</p><pre>&lt;LINK href="msgbox.css" rel="stylesheet" type="text/css"&gt; </pre><h3>HTML</h3><pre>E l'HTML? quello che resta :-) <br /></pre><h2>Firefox <br /></h2><p>Ora possiamo estendere un po' le funzionalità del nostro message box per includere supporto per firefox, e separare un po' di logica ripetuta in funzioni dedicate.</p><p>Il DOM è unico, ma l'implementazione delle funzioni che servono per manipolarlo è un po' diversa tra i vari browser; Per il momento le differenze son minime, quindi possiamo gestirle direttamente; in ambito applicativo, meglio utilizzare un framework che si occupi per noi di gestire queste differenze (e che qualcun altro tenga aggiornato)!!! Ho dovuto modificare due mesi fa una pagina scritta nel '97 perché - per quanto uno cerchi di essere lungimirante - i framework di riferimento evolvono e cambiano.  Il prossimo capitolo è dedicato a questi framework.</p><p><strong>Nota bene: </strong>quando scrivo Firefox, si applica a Google Chrome, Opera e Safari normalmente. Non ho controllato su questi browser tuttavia. Nel 95% dei casi è comunque sufficiente gestire due soli casi, internet explorer e "gli altri".  </p><h4>Scuse ufficiali</h4><p>Ho rinominato un paio di funzioni e variabili in italiano. attachEvents() è diventato collegaEventi(); poi ho creato una funzione collegaEvento() che gestisce le differenze da Firefox e IE. </p><pre>_msgBox.prototype.collegaEvento = function (aElement, aEventName, aEvent, aMsgResult)<br />{<br /> // aElement: l'elemento cui collegare l'evento<br /> // aEventName: "click" per esempio<br /> // aEvent: la funzione che deve essere invocata quando si verifica aEventName<br /> // aMsgResult: il risultato di questo bottone.<br /><br /> // Ora devo collegare gli eventi. Devo gestire la differenza tra firefox e ie ecc.<br /><br /> aElement.msgResult = aMsgResult;<br /> if (aElement.detachEvent) // per sapere se esiste - su firefox non esiste<br /> { // ie<br /> aElement.detachEvent('on'+aEventName, aEvent); <br /> aElement.attachEvent('on'+aEventName, aEvent); <br /> }<br /> else<br /> { // other browsers<br /> aElement.removeEventListener(aEventName, aEvent, false);<br /> aElement.addEventListener(aEventName, aEvent, false);<br /> }<br />}<br /><br />_msgBox.prototype.collegaEventi = function (aCallBackFunction)<br />{<br /> this.divMsg = document.getElementById("msgBox")<br /><br /> if (!(this.button1Div instanceof Object))<br /> this.button1Div = document.getElementById("msgBox1");<br /> if (!(this.button2Div instanceof Object))<br /> this.button2Div = document.getElementById("msgBox2");<br /><br /> this.button1Div.style.display=(this.button1?"inline":"none");<br /> this.button2Div.style.display=(this.button2?"inline":"none");<br /> this.callBackFunction = aCallBackFunction<br /><br /> // assegnare testi e funzioni ai pulsanti.<br /> if (this.button1)<br /> {<br /> this.collegaEvento(this.button1Div, 'click', this.buttonEvent, this.button1Result);<br /> }<br /> <br /> if (this.button2)<br /> {<br /> this.collegaEvento(this.button2Div, 'click', this.buttonEvent, this.button2Result);<br /> }<br />}</pre><p>Anche nella funzione buttonEvent è necessario gestire la differenza tra ie e firefox:</p><pre>_msgBox.prototype.buttonEvent = function(e)<br />{<br />    // Questo evento viene invocato dal bottone cliccato yes no ecc.<br />    // quindi non ha un accesso diretto all'istanzqa dell'oggetto dall'interno<br />    // e bisogna usare il riferimento assoluto<br />    msgBox.divMsg.style.display = "none"<br />    if (e instanceof Object)<br />    { // firefox<br />        msgBox.callBackFunction(e.target.msgResult)<br />    }<br />    else<br />        msgBox.callBackFunction(event.srcElement.msgResult);<br /><br />} </pre><p>Con queste due funzioni abbiamo finito di separare il codice.</p><p>E' evidente come per aggiungere nuove funzionalità posso concentrarmi sulle mie funzioni usando le funzioni generiche collegaEvento(). Nelle funzioni interne di un oggetto, può essere conveniente usare un paio di parametri in più per lasciare spazio alle estensioni future; mentre per i metodi esposti (pubblici) è fondamentale permettere il funzionamento anche con un numero minimo di parametri, per semplificarne l'uso all'interno del codice.  </p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> Passo 5: angoli arrotondati 2008-10-15T19:10:10+00:00 2008-10-15T19:10:10+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/37-passo-5-angoli-arrotondati Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Se vogliamo usare il nostro messageBox sarà necessario renderlo presentabile. Rimanendo facile da usare. </p><p>Per questo desidero che abbia gli angoli arrotondati, e che sia scalabile a piacere.</p><p>Le tecniche per avere gli angoli arrotondati si riducono a :</p><ul><li>Usare un browser che supporti CSS3</li><li>Usare una tabella per posizionare i vari pezzi dello sfondo (9 pezzi necessari)</li><li>Usare un foglio di stile e vari elementi div cui associare un minimo di 4 pezzi</li><li>Usare un foglio di stile e vari elementi cui associare parti diverse della stessa immagine (riducendo notevolmente il tempo di download, e la grafica viene mostrata in un unico momento, e non un pezzo alla volta) </li></ul><p>Scelgo l'ultima.</p><p>Una implementazione facile è descritta in <a href="http://www.schillmania.com/projects/dialog2/" target="_blank">Even More Rounded Corners With CSS</a>. Useremo questa con piccole modifiche.</p><h1>Cosa vogliamo vedere<br /></h1><p>Prima di tutto vediamo il risultato in azione:</p><p><img src="images/stories/msgbox/msg5-firefox3.jpg" border="0" /></p><p>Per ottenerlo, è sufficiente inserire questo html: </p><pre>&lt;div ID="msgBoxDiv" class="dialog color_red"&gt;<br /> &lt;div class="content"&gt;<br /> &lt;div class="wrapper"&gt;<br /> &lt;div class="t"&gt;&lt;/div&gt;<br /> &lt;div id="msgBoxHeader" class="hd" &gt;<br /> Domanda<br /> &lt;/div&gt;<br /> &lt;div class="bd"&gt;<br /> &lt;p id="msgBoxText"&gt;Messaggio&lt;/p&gt;<br /> &lt;/div&gt;<br /> &lt;div class="ft"&gt;<br /> &lt;p&gt;&lt;A ID="msgBox1"&gt;Si&lt;/A&gt;<br /> &lt;A ID="msgBox2"&gt;No&lt;/A&gt;&lt;/p&gt;<br /> &lt;/div&gt;<br /> &lt;/div&gt;<br /> &lt;/div&gt;<br /> &lt;div class="b"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;<br />&lt;/div&gt;<br /><br /></pre><p>ed il css (che trovate nel pacchetto da scaricare). Mi soffermo un momento sul sistema usato per ancorare l'immagine in punti diversi:</p><pre>.dialog .content,<br />.dialog .t,<br />.dialog .b,<br />.dialog .b div {<br /> background:transparent url(dialog-blue.png) no-repeat top right;<br /> _background-image:url(dialog-blue.gif);<br />}<br />.dialog .t {<br /> background-position:top left;<br />}<br />.dialog .b {<br /> background-position:bottom right;<br />}</pre><p>&nbsp;</p><p>e così via. In sostanza definisco una volta sola l'immagine per tutte le classi dei bordi; quindi per ciascuna modifico solo background-position.</p><h1>Compatibilità con i browser <br /></h1><p>Ora vediamo come viene su chrome:</p><p><img src="images/stories/msgbox/msg5-chrome.jpg" border="0" /> </p><p>e su ie6? beh c'è il problema dei PNG a 24 bit, è solo dal 2000 che si usano in fin dei conti... come poteva un browser uscito nel 2003 già supportarli?</p><p><img src="images/stories/msgbox/msg5-ie6.jpg" border="0" /> </p><p>Notate la differenza? La trasparenza è sparita! Come si fa ad ottenere un risultato così fantastico?</p><p>Semplice: un trucchetto.</p><pre> background:transparent url(dialog-blue.png) no-repeat top right;<br /> _background-image:url(dialog-blue.gif);</pre> una delle tante funzioni assurde di ie, specifico una immagine con _background-image (nota il "_"); questo viene ignorato ovviamente dagli altri browser.<br /><h1>Integriamolo con l'oggetto</h1><p>Le modifiche da fare sono veramente poche.</p><p>Prima di tutto, visto che l'obiettivo è di avere una funzione msgBox e non di scrivere markup, mettiamo l'html nel codice di inizializzazione del bottone; </p><pre>function _msgBox(aColor)<br />{ <br /> this.divMsg = null;<br /> this.message = "";<br /> this.button1Div = null;<br /> this.button2Div = null;<br /> this.divHeader = null;<br /> this.divContent = null;<br /><br /> this.button1 = "Si";<br /> this.button2 = "No";<br /> this.button1Result = true;<br /> this.button2Result = false;<br /> this.callBackFunction = null;<br /> this.color=aColor;<br /> <br /> this.divMsg = document.getElementById("msgBoxDiv")<br /> if (this.divMsg==null)<br /> {<br /> var aMsgBoxContent = <br /> '&lt;div ID="msgBoxDiv" class="dialog color_'+this.color+'"&gt;'+<br /> ' &lt;div class="content"&gt;'+<br /> ' &lt;div class="wrapper"&gt;'+<br /> ' &lt;div class="t"&gt;&lt;/div&gt;'+<br /> ' &lt;div id="msgBoxHeader" class="hd" &gt;'+<br /> ' Domanda'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;div class="bd"&gt;'+<br /> ' &lt;p id="msgBoxText"&gt;Messaggio&lt;/p&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;div class="ft"&gt;'+<br /> ' &lt;p&gt;&lt;A ID="msgBox1"&gt;Si&lt;/A&gt;'+<br /> ' &lt;A ID="msgBox2"&gt;No&lt;/A&gt;&lt;/p&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;div class="b"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;'+<br /> '&lt;/div&gt;';<br /> document.body.innerHTML += aMsgBoxContent<br /> this.divMsg = document.getElementById("msgBoxDiv")<br /> }<br />}<br /></pre><br /><p>Questa funzione prende un parametro. Il colore dello sfondo da utilizzare.Il secondo foglio di stile, dialog-variants.css, contiene esclusivamente le diverse immagini per i vari stili. </p><img src="images/stories/msgbox/msg5-blue.jpg" border="0" /><p>&nbsp;</p><p>Visto che interagisce con l'innerHTML, </p> <p>dovremo sincerarci che venga eseguito dopo che la pagina è caricata:</p><pre>var msgBox<br /><br /> function initBox()<br /> {<br /> msgBox = new _msgBox('red')<br /> };<br /> window.onload = initBox;<br /></pre><p>Questa è tutta la configurazione necessaria per poterlo usare. </p><p>Inoltre saranno sempre presenti nella intestazione del file html:</p><ul><li>&lt;link rel="stylesheet" href="msgbox/msgbox.css?u=1" media="screen" &gt;</li><li>&lt;link rel="stylesheet" href="msgbox/dialog-variants.css" media="screen" /&gt; </li><li>&lt;SCRIPT type="text/javascript" src="msgbox/msgbox.js"&gt;&lt;/SCRIPT&gt;</li></ul><p>&nbsp;</p><p>Ora con tutti questi test,mi sono stancato di premere Ok sull'alert. Spostiamo l'output su una textarea.</p><p>Visto che i files sono diventati tanti, li ho spostati nella cartella msgbox (la fantasia è la mia prima dote :-P </p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a><p>L'archivio nella pagina introduzione è il più aggornato e contiene i files di tutte le lezioni </p></div> <div class="feed-description"><p>Se vogliamo usare il nostro messageBox sarà necessario renderlo presentabile. Rimanendo facile da usare. </p><p>Per questo desidero che abbia gli angoli arrotondati, e che sia scalabile a piacere.</p><p>Le tecniche per avere gli angoli arrotondati si riducono a :</p><ul><li>Usare un browser che supporti CSS3</li><li>Usare una tabella per posizionare i vari pezzi dello sfondo (9 pezzi necessari)</li><li>Usare un foglio di stile e vari elementi div cui associare un minimo di 4 pezzi</li><li>Usare un foglio di stile e vari elementi cui associare parti diverse della stessa immagine (riducendo notevolmente il tempo di download, e la grafica viene mostrata in un unico momento, e non un pezzo alla volta) </li></ul><p>Scelgo l'ultima.</p><p>Una implementazione facile è descritta in <a href="http://www.schillmania.com/projects/dialog2/" target="_blank">Even More Rounded Corners With CSS</a>. Useremo questa con piccole modifiche.</p><h1>Cosa vogliamo vedere<br /></h1><p>Prima di tutto vediamo il risultato in azione:</p><p><img src="images/stories/msgbox/msg5-firefox3.jpg" border="0" /></p><p>Per ottenerlo, è sufficiente inserire questo html: </p><pre>&lt;div ID="msgBoxDiv" class="dialog color_red"&gt;<br /> &lt;div class="content"&gt;<br /> &lt;div class="wrapper"&gt;<br /> &lt;div class="t"&gt;&lt;/div&gt;<br /> &lt;div id="msgBoxHeader" class="hd" &gt;<br /> Domanda<br /> &lt;/div&gt;<br /> &lt;div class="bd"&gt;<br /> &lt;p id="msgBoxText"&gt;Messaggio&lt;/p&gt;<br /> &lt;/div&gt;<br /> &lt;div class="ft"&gt;<br /> &lt;p&gt;&lt;A ID="msgBox1"&gt;Si&lt;/A&gt;<br /> &lt;A ID="msgBox2"&gt;No&lt;/A&gt;&lt;/p&gt;<br /> &lt;/div&gt;<br /> &lt;/div&gt;<br /> &lt;/div&gt;<br /> &lt;div class="b"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;<br />&lt;/div&gt;<br /><br /></pre><p>ed il css (che trovate nel pacchetto da scaricare). Mi soffermo un momento sul sistema usato per ancorare l'immagine in punti diversi:</p><pre>.dialog .content,<br />.dialog .t,<br />.dialog .b,<br />.dialog .b div {<br /> background:transparent url(dialog-blue.png) no-repeat top right;<br /> _background-image:url(dialog-blue.gif);<br />}<br />.dialog .t {<br /> background-position:top left;<br />}<br />.dialog .b {<br /> background-position:bottom right;<br />}</pre><p>&nbsp;</p><p>e così via. In sostanza definisco una volta sola l'immagine per tutte le classi dei bordi; quindi per ciascuna modifico solo background-position.</p><h1>Compatibilità con i browser <br /></h1><p>Ora vediamo come viene su chrome:</p><p><img src="images/stories/msgbox/msg5-chrome.jpg" border="0" /> </p><p>e su ie6? beh c'è il problema dei PNG a 24 bit, è solo dal 2000 che si usano in fin dei conti... come poteva un browser uscito nel 2003 già supportarli?</p><p><img src="images/stories/msgbox/msg5-ie6.jpg" border="0" /> </p><p>Notate la differenza? La trasparenza è sparita! Come si fa ad ottenere un risultato così fantastico?</p><p>Semplice: un trucchetto.</p><pre> background:transparent url(dialog-blue.png) no-repeat top right;<br /> _background-image:url(dialog-blue.gif);</pre> una delle tante funzioni assurde di ie, specifico una immagine con _background-image (nota il "_"); questo viene ignorato ovviamente dagli altri browser.<br /><h1>Integriamolo con l'oggetto</h1><p>Le modifiche da fare sono veramente poche.</p><p>Prima di tutto, visto che l'obiettivo è di avere una funzione msgBox e non di scrivere markup, mettiamo l'html nel codice di inizializzazione del bottone; </p><pre>function _msgBox(aColor)<br />{ <br /> this.divMsg = null;<br /> this.message = "";<br /> this.button1Div = null;<br /> this.button2Div = null;<br /> this.divHeader = null;<br /> this.divContent = null;<br /><br /> this.button1 = "Si";<br /> this.button2 = "No";<br /> this.button1Result = true;<br /> this.button2Result = false;<br /> this.callBackFunction = null;<br /> this.color=aColor;<br /> <br /> this.divMsg = document.getElementById("msgBoxDiv")<br /> if (this.divMsg==null)<br /> {<br /> var aMsgBoxContent = <br /> '&lt;div ID="msgBoxDiv" class="dialog color_'+this.color+'"&gt;'+<br /> ' &lt;div class="content"&gt;'+<br /> ' &lt;div class="wrapper"&gt;'+<br /> ' &lt;div class="t"&gt;&lt;/div&gt;'+<br /> ' &lt;div id="msgBoxHeader" class="hd" &gt;'+<br /> ' Domanda'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;div class="bd"&gt;'+<br /> ' &lt;p id="msgBoxText"&gt;Messaggio&lt;/p&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;div class="ft"&gt;'+<br /> ' &lt;p&gt;&lt;A ID="msgBox1"&gt;Si&lt;/A&gt;'+<br /> ' &lt;A ID="msgBox2"&gt;No&lt;/A&gt;&lt;/p&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;/div&gt;'+<br /> ' &lt;div class="b"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;'+<br /> '&lt;/div&gt;';<br /> document.body.innerHTML += aMsgBoxContent<br /> this.divMsg = document.getElementById("msgBoxDiv")<br /> }<br />}<br /></pre><br /><p>Questa funzione prende un parametro. Il colore dello sfondo da utilizzare.Il secondo foglio di stile, dialog-variants.css, contiene esclusivamente le diverse immagini per i vari stili. </p><img src="images/stories/msgbox/msg5-blue.jpg" border="0" /><p>&nbsp;</p><p>Visto che interagisce con l'innerHTML, </p> <p>dovremo sincerarci che venga eseguito dopo che la pagina è caricata:</p><pre>var msgBox<br /><br /> function initBox()<br /> {<br /> msgBox = new _msgBox('red')<br /> };<br /> window.onload = initBox;<br /></pre><p>Questa è tutta la configurazione necessaria per poterlo usare. </p><p>Inoltre saranno sempre presenti nella intestazione del file html:</p><ul><li>&lt;link rel="stylesheet" href="msgbox/msgbox.css?u=1" media="screen" &gt;</li><li>&lt;link rel="stylesheet" href="msgbox/dialog-variants.css" media="screen" /&gt; </li><li>&lt;SCRIPT type="text/javascript" src="msgbox/msgbox.js"&gt;&lt;/SCRIPT&gt;</li></ul><p>&nbsp;</p><p>Ora con tutti questi test,mi sono stancato di premere Ok sull'alert. Spostiamo l'output su una textarea.</p><p>Visto che i files sono diventati tanti, li ho spostati nella cartella msgbox (la fantasia è la mia prima dote :-P </p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a><p>L'archivio nella pagina introduzione è il più aggornato e contiene i files di tutte le lezioni </p></div> Passo 6: finestra modale 2008-10-28T10:54:13+00:00 2008-10-28T10:54:13+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/38-passo-6-finestra-modale Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Prima di poter usare la nostra message box dobbiamo renderla modale.</p><p>Una finestra modale è una finestra che non restituisce il controllo all'applicazione finché non viene chiusa dall'utente. E' un tipico esempio la domanda "Procedo" con i bottoni "Si" e "No". La funzione attende che la finestra di dialogo venga chiusa per procedere.</p><p> <img src="images/stories/msgbox/msg6-modal.jpg" border="0" alt="Messagebox modale" align="right" /></p><p>Nel nostro caso abbiamo dovuto definire le funzioni di callback per ottenere questo risultato.</p><p>Però dobbiamo anche impedire che l'utente interagisca con il resto della pagina finché non ci ha dato una risposta. Per farlo, il modo più simpatico è creare un layer grande quanto la pagina da mettere dietro alla nostra message box. in questo modo i clic saranno impossibili.</p><p>&nbsp;</p><p>&nbsp;</p><p>Il layer ha il background dello stesso colore della message box ed è semi trasparente. Dovremo posizionarlo tramite la funzione di creazione _msgBox()</p><pre> this.divMsgModal = document.getElementById("msgModalDiv")<br /> this.divMsgBox = document.getElementById("msgBoxDiv")<br /></pre><p>metto il layer modale fullscreen; innerHeight&width non sono disponibili su IE.<br />ma offsetWidth e height hanno un significato diverso tra i browser.<br />quindi uso il costrutto (condizione?true:false) per valorizzare le mie variabili <br />cwidth e cheight che indicano le dimensioni dell'area visibile.</p><pre> var cwidth = (window.innerWidth&gt;0?window.innerWidth: document.body.offsetWidth)<br /> var cheight = (window.innerHeight&gt;0?window.innerHeight: document.body.offsetHeight)<br /> this.divMsgModal.style.width = cwidth;<br /> this.divMsgModal.style.height = cheight;<br /></pre><p>Per ottenere la trasparenza, uso un comando diverso per IE e firefox:</p> <pre> opacity: 0.30; /* css2 */<br /> filter:alpha(opacity=30); /* IE */ </pre><p>Oltre a posizionare il layer devo anche centrare il box del messaggio:  </p><pre> this.divMsgBox.style.left = parseInt(cwidth)/2-parseInt(this.layerWidth)/2+'px';<br /> this.divMsgBox.style.top = parseInt(cheight)/2-parseInt(this.layerHeight)/2+'px';</pre><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> <div class="feed-description"><p>Prima di poter usare la nostra message box dobbiamo renderla modale.</p><p>Una finestra modale è una finestra che non restituisce il controllo all'applicazione finché non viene chiusa dall'utente. E' un tipico esempio la domanda "Procedo" con i bottoni "Si" e "No". La funzione attende che la finestra di dialogo venga chiusa per procedere.</p><p> <img src="images/stories/msgbox/msg6-modal.jpg" border="0" alt="Messagebox modale" align="right" /></p><p>Nel nostro caso abbiamo dovuto definire le funzioni di callback per ottenere questo risultato.</p><p>Però dobbiamo anche impedire che l'utente interagisca con il resto della pagina finché non ci ha dato una risposta. Per farlo, il modo più simpatico è creare un layer grande quanto la pagina da mettere dietro alla nostra message box. in questo modo i clic saranno impossibili.</p><p>&nbsp;</p><p>&nbsp;</p><p>Il layer ha il background dello stesso colore della message box ed è semi trasparente. Dovremo posizionarlo tramite la funzione di creazione _msgBox()</p><pre> this.divMsgModal = document.getElementById("msgModalDiv")<br /> this.divMsgBox = document.getElementById("msgBoxDiv")<br /></pre><p>metto il layer modale fullscreen; innerHeight&width non sono disponibili su IE.<br />ma offsetWidth e height hanno un significato diverso tra i browser.<br />quindi uso il costrutto (condizione?true:false) per valorizzare le mie variabili <br />cwidth e cheight che indicano le dimensioni dell'area visibile.</p><pre> var cwidth = (window.innerWidth&gt;0?window.innerWidth: document.body.offsetWidth)<br /> var cheight = (window.innerHeight&gt;0?window.innerHeight: document.body.offsetHeight)<br /> this.divMsgModal.style.width = cwidth;<br /> this.divMsgModal.style.height = cheight;<br /></pre><p>Per ottenere la trasparenza, uso un comando diverso per IE e firefox:</p> <pre> opacity: 0.30; /* css2 */<br /> filter:alpha(opacity=30); /* IE */ </pre><p>Oltre a posizionare il layer devo anche centrare il box del messaggio:  </p><pre> this.divMsgBox.style.left = parseInt(cwidth)/2-parseInt(this.layerWidth)/2+'px';<br /> this.divMsgBox.style.top = parseInt(cheight)/2-parseInt(this.layerHeight)/2+'px';</pre><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> Passo 7: tastiera 2008-10-28T12:54:41+00:00 2008-10-28T12:54:41+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/39-passo-7-tastiera Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>A questo punto proviamo ad usare il nostro message box, e ci accorgiamo che non reagisce affatto alla tastiera.</p><h3>Collegare gli eventi <br /></h3><p>Il mio obiettivo è quello di catturare l'input da tastiera mentre la finestra è visualizzata, e ripristinare l'eventuale handler precedente quando l'utente chiude la finestra. </p><p>Per prima cosa connetto l'handler insieme alle funzioni dei pulsanti:</p><pre>_msgBox.prototype.collegaEventi = function (aCallbackFunction)<br />{<br />[...]<br />    // assegnare testi e funzioni ai pulsanti.<br />  if (this.button1!="")<br /> {<br /> this.oldKeyPressHandler=document.onkeypress;<br /> document.onkeypress = msgBox.handleKeyboard<br /><br /></pre><p>Questo mi connetterà l'evento ogni volta che c'è  almeno un bottone. E imposterà oldKeyPressHandler al gestore precedente.</p><p>La funzione di callback è ora divisa tra interpretazione del messaggio (buttonclick e keypress) ed elaborazione:</p> <pre>_msgBox.prototype.handleCallback = function(aMsgResult)<br />{<br /> msgBox.divMsgModal.style.display = "none"<br /> msgBox.divMsgBox.style.display = "none"<br /><br /> document.onkeypress = msgBox.oldKeyPressHandler<br /> msgBox.oldKeyPressHandler=null<br /><br /> msgBox.callbackFunction(aMsgResult)<br />}<br /><br /></pre> <p>Qui riassegno il gestore originale dell'evento tastiera. </p><h3>Gestire gli eventi <br /></h3>La funzione di gestione del mouse quindi, usando la nuova callback generica, diventa:<pre>_msgBox.prototype.buttonEvent = function(e)<br />{<br />    // Questo evento viene invocato dal bottone cliccato yes no ecc.<br />    // quindi non ha un accesso diretto all'istanza dell'oggetto dall'interno<br />    // e bisogna usare il riferimento assoluto<br /><br />    if (e instanceof Object)<br />    { // firefox<br />        msgBox.handleCallback(e.target.msgResult)<br />    }<br />    else<br />        msgBox.handleCallback(event.srcElement.msgResult);<br />}</pre><p>Notare che non uso this.handleCallback ma msgBox.handleCallback perché dall'interno di un handler di evento non posso accedere all'oggetto originale. </p><p>Anche nel caso di interpretazione del comando da tastiera i browser si comportano in maniera diversa:</p><p>quindi la funzione handleKeyboard() dovrà:</p><pre>_msgBox.prototype.handleKeyboard = function(e)<br />{<br />  if(!e) e=window.event;<br /> key = e.keyCode ? e.keyCode : e.which;<br /><br />    switch (key)<br />    {<br />        case 13: //enter<br />        case 32: //spazio<br />        case 115:// s<br />        case 83: // S<br />        case 121:// y<br />        case 89: // Y<br />            msgBox.handleCallback(msgBox.button1Result);<br />            break;<br />        case 27: //ESC (non viene visto da firefox)<br />        case 110://n<br />        case 78: //N<br />            msgBox.handleCallback(msgBox.button2Result)<br />            break;<br />    }<br />}</pre><p>Altra nota curiosa alla sintassi: IE supporta </p><pre>case 13,32,115:</pre><p>Ma firefox no. </p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> <div class="feed-description"><p>A questo punto proviamo ad usare il nostro message box, e ci accorgiamo che non reagisce affatto alla tastiera.</p><h3>Collegare gli eventi <br /></h3><p>Il mio obiettivo è quello di catturare l'input da tastiera mentre la finestra è visualizzata, e ripristinare l'eventuale handler precedente quando l'utente chiude la finestra. </p><p>Per prima cosa connetto l'handler insieme alle funzioni dei pulsanti:</p><pre>_msgBox.prototype.collegaEventi = function (aCallbackFunction)<br />{<br />[...]<br />    // assegnare testi e funzioni ai pulsanti.<br />  if (this.button1!="")<br /> {<br /> this.oldKeyPressHandler=document.onkeypress;<br /> document.onkeypress = msgBox.handleKeyboard<br /><br /></pre><p>Questo mi connetterà l'evento ogni volta che c'è  almeno un bottone. E imposterà oldKeyPressHandler al gestore precedente.</p><p>La funzione di callback è ora divisa tra interpretazione del messaggio (buttonclick e keypress) ed elaborazione:</p> <pre>_msgBox.prototype.handleCallback = function(aMsgResult)<br />{<br /> msgBox.divMsgModal.style.display = "none"<br /> msgBox.divMsgBox.style.display = "none"<br /><br /> document.onkeypress = msgBox.oldKeyPressHandler<br /> msgBox.oldKeyPressHandler=null<br /><br /> msgBox.callbackFunction(aMsgResult)<br />}<br /><br /></pre> <p>Qui riassegno il gestore originale dell'evento tastiera. </p><h3>Gestire gli eventi <br /></h3>La funzione di gestione del mouse quindi, usando la nuova callback generica, diventa:<pre>_msgBox.prototype.buttonEvent = function(e)<br />{<br />    // Questo evento viene invocato dal bottone cliccato yes no ecc.<br />    // quindi non ha un accesso diretto all'istanza dell'oggetto dall'interno<br />    // e bisogna usare il riferimento assoluto<br /><br />    if (e instanceof Object)<br />    { // firefox<br />        msgBox.handleCallback(e.target.msgResult)<br />    }<br />    else<br />        msgBox.handleCallback(event.srcElement.msgResult);<br />}</pre><p>Notare che non uso this.handleCallback ma msgBox.handleCallback perché dall'interno di un handler di evento non posso accedere all'oggetto originale. </p><p>Anche nel caso di interpretazione del comando da tastiera i browser si comportano in maniera diversa:</p><p>quindi la funzione handleKeyboard() dovrà:</p><pre>_msgBox.prototype.handleKeyboard = function(e)<br />{<br />  if(!e) e=window.event;<br /> key = e.keyCode ? e.keyCode : e.which;<br /><br />    switch (key)<br />    {<br />        case 13: //enter<br />        case 32: //spazio<br />        case 115:// s<br />        case 83: // S<br />        case 121:// y<br />        case 89: // Y<br />            msgBox.handleCallback(msgBox.button1Result);<br />            break;<br />        case 27: //ESC (non viene visto da firefox)<br />        case 110://n<br />        case 78: //N<br />            msgBox.handleCallback(msgBox.button2Result)<br />            break;<br />    }<br />}</pre><p>Altra nota curiosa alla sintassi: IE supporta </p><pre>case 13,32,115:</pre><p>Ma firefox no. </p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a></div> Passo 8: timeout 2008-10-28T14:06:15+00:00 2008-10-28T14:06:15+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/40-passo-8-timeout Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><div>Per prima cosa implementiamo un timeout. </div><div>Mi serve principalmente per quelle domande di conferma che hanno una risposta predefinita che si usa al 90%... </div><div> <p><img src="images/stories/msgbox/msg8-timeout.jpg" border="0" /></p><p>Ciascuna funzione  di visualizzazione (ask, tell) include in fondo:</p><pre>    if (arguments.length &gt; 3)<br />    {<br />        this.doTimeout(okTimeoutSeconds);<br />    } <br /></pre></div><div>Quindi passando un parametro in più, ovvero il timeout in secondi, si attiva il timeout.</div><div> </div><div>Gestisco tutto (setup, display dei secondi restanti, e chiusura) da una funzione sola: </div><div> </div><div><pre>_msgBox.prototype.doTimeout = function (okTimeoutSeconds)<br />{<br />    if (arguments.length&gt;0)<br />    {<br />        // faccio partire il timeout. okTimeoutSeconds sono i secondi trascorsi <br />        // i quali verrà premuto il primo bottone automaticamente.<br />        this.okTimeoutProgress = okTimeoutSeconds;<br />    }<br />    if (this.okTimeoutProgress &lt;= 0)<br />    {<br />        this.handleCallback(msgBox.button1Result);<br />    }<br />    else<br />    {<br />        this.button1Div.innerHTML = this.button1+'...'+this.okTimeoutProgress--;<br />        clearTimeout(this.okTimeoutID);<br />        this.okTimeoutID = setTimeout("msgBox.doTimeout()",1000);<br />    }<br />}</pre></div><div><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a> <br /></div></div> <div class="feed-description"><div>Per prima cosa implementiamo un timeout. </div><div>Mi serve principalmente per quelle domande di conferma che hanno una risposta predefinita che si usa al 90%... </div><div> <p><img src="images/stories/msgbox/msg8-timeout.jpg" border="0" /></p><p>Ciascuna funzione  di visualizzazione (ask, tell) include in fondo:</p><pre>    if (arguments.length &gt; 3)<br />    {<br />        this.doTimeout(okTimeoutSeconds);<br />    } <br /></pre></div><div>Quindi passando un parametro in più, ovvero il timeout in secondi, si attiva il timeout.</div><div> </div><div>Gestisco tutto (setup, display dei secondi restanti, e chiusura) da una funzione sola: </div><div> </div><div><pre>_msgBox.prototype.doTimeout = function (okTimeoutSeconds)<br />{<br />    if (arguments.length&gt;0)<br />    {<br />        // faccio partire il timeout. okTimeoutSeconds sono i secondi trascorsi <br />        // i quali verrà premuto il primo bottone automaticamente.<br />        this.okTimeoutProgress = okTimeoutSeconds;<br />    }<br />    if (this.okTimeoutProgress &lt;= 0)<br />    {<br />        this.handleCallback(msgBox.button1Result);<br />    }<br />    else<br />    {<br />        this.button1Div.innerHTML = this.button1+'...'+this.okTimeoutProgress--;<br />        clearTimeout(this.okTimeoutID);<br />        this.okTimeoutID = setTimeout("msgBox.doTimeout()",1000);<br />    }<br />}</pre></div><div><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a> <br /></div></div> Passo 9: Liste 2008-10-28T14:39:59+00:00 2008-10-28T14:39:59+00:00 https://www.tmg.it/articoli-tecnici/tutorial-oggetti-javascript/41-passo-9-liste Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>&nbsp;</p><p> <img src="images/stories/msgbox/msg9-lista.jpg" border="0" align="right" /></p><p>Affrontiamo ora un più gravoso compito: una messagebox che offra una serie di possibilità tra le quali scegliere.</p><p>Che dovrà chiaramente restituire un riferimento alla scelta fatta nella risposta. </p><p>&nbsp;</p><p>Creo una nuova funzione, listChoose(), che accetta come parametro un array. Nella risposta affermativa (button1) restituirò l'indice scelto o -1 se non è stato scelto nessun indice.</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><pre>_msgBox.prototype.listChoose = function (msgHTML, aCallbackFunction, msgTitle, <br /> okTimeoutSeconds, lista)<br />{<br /> /*<br /> per disattivare il timeout, passare -1 come valore di okTimeoutSeconds<br /> */<br /> with (this)<br /> {<br /> button1 = "Ok";<br /> button2 = "Annulla";<br /> button1Result = true;<br /> button2Result = false;<br /> message = msgHTML;<br /> collegaEventi(aCallbackFunction)<br /> divContent.innerHTML = msgHTML;<br /><br /> if (arguments.length &lt; 5)<br /> divContent.innerHTML += '&lt;br&gt;Numero di parametri errato'</pre><p>Eccoci alla parte saliente (il disegno della lista). Ho scelto di usare una SELECT, ma nulla vieta di disegnare dei radiobuttons o dei controlli dedicati, anche una tabella può fare al caso nostro. Questa è però sicuramente la soluzione più semplice: </p><pre><br /> // ora spizzo la lista. Ho bisogno di far scegliere una voce. La soluzione <br /> // più simpatica è una bella SELECT visualizzata già aperta<br /> var aSelect = '&lt;br&gt;&lt;SELECT id="selectList" size=8&gt;';<br /><br /> if (lista instanceof Array)<br /> {<br /> for (var i=0; i&lt;lista.length ;i++ )<br /> {<br /> aSelect += '&lt;OPTION VALUE="'+i+'" &gt;'+lista[i]+'&lt;/OPTION&gt;';<br /> }<br /> }<br /><br /> aSelect += '&lt;/SELECT&gt;';<br /> divContent.innerHTML += aSelect;<br /><br /> selectBox = document.getElementById('selectList');<br /><br /> divHeader.innerHTML = msgTitle<br /> divMsgModal.style.display = "block"<br /> divMsgBox.style.display = "block"<br /><br /> doTimeout(okTimeoutSeconds);<br /> }<br />}<br /></pre><p>La funzione chiamante è responsabile della creazione e distruzione della lista. </p><pre>function lista()<br />    {<br />        var arrScelte = new Array ("Giove", "Marte", "Europa", <br /> "una qualche altra luna di Giove",<br /> "Venere", "Plutone", "Terra", "Luna", "Mercurio", "Urano", "Saturno", <br /> "Una qualche luna di Saturno");<br />       msgBox.listChoose('Su che pianeta vorresti vivere?',elaboraRisposta, <br /> 'una domanda di cultura generale', -1, arrScelte)    <br />    }</pre><p>E infine il foglio di stile, usa il trucchetto della trasparenza per dare una parvenza di grafica</p><pre>SELECT#selectList {font-size:120%; opacity:0.8; filter: alpha(opcity=80);width:80%}<br /> </pre><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a><p>&nbsp;</p></div> <div class="feed-description"><p>&nbsp;</p><p> <img src="images/stories/msgbox/msg9-lista.jpg" border="0" align="right" /></p><p>Affrontiamo ora un più gravoso compito: una messagebox che offra una serie di possibilità tra le quali scegliere.</p><p>Che dovrà chiaramente restituire un riferimento alla scelta fatta nella risposta. </p><p>&nbsp;</p><p>Creo una nuova funzione, listChoose(), che accetta come parametro un array. Nella risposta affermativa (button1) restituirò l'indice scelto o -1 se non è stato scelto nessun indice.</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><pre>_msgBox.prototype.listChoose = function (msgHTML, aCallbackFunction, msgTitle, <br /> okTimeoutSeconds, lista)<br />{<br /> /*<br /> per disattivare il timeout, passare -1 come valore di okTimeoutSeconds<br /> */<br /> with (this)<br /> {<br /> button1 = "Ok";<br /> button2 = "Annulla";<br /> button1Result = true;<br /> button2Result = false;<br /> message = msgHTML;<br /> collegaEventi(aCallbackFunction)<br /> divContent.innerHTML = msgHTML;<br /><br /> if (arguments.length &lt; 5)<br /> divContent.innerHTML += '&lt;br&gt;Numero di parametri errato'</pre><p>Eccoci alla parte saliente (il disegno della lista). Ho scelto di usare una SELECT, ma nulla vieta di disegnare dei radiobuttons o dei controlli dedicati, anche una tabella può fare al caso nostro. Questa è però sicuramente la soluzione più semplice: </p><pre><br /> // ora spizzo la lista. Ho bisogno di far scegliere una voce. La soluzione <br /> // più simpatica è una bella SELECT visualizzata già aperta<br /> var aSelect = '&lt;br&gt;&lt;SELECT id="selectList" size=8&gt;';<br /><br /> if (lista instanceof Array)<br /> {<br /> for (var i=0; i&lt;lista.length ;i++ )<br /> {<br /> aSelect += '&lt;OPTION VALUE="'+i+'" &gt;'+lista[i]+'&lt;/OPTION&gt;';<br /> }<br /> }<br /><br /> aSelect += '&lt;/SELECT&gt;';<br /> divContent.innerHTML += aSelect;<br /><br /> selectBox = document.getElementById('selectList');<br /><br /> divHeader.innerHTML = msgTitle<br /> divMsgModal.style.display = "block"<br /> divMsgBox.style.display = "block"<br /><br /> doTimeout(okTimeoutSeconds);<br /> }<br />}<br /></pre><p>La funzione chiamante è responsabile della creazione e distruzione della lista. </p><pre>function lista()<br />    {<br />        var arrScelte = new Array ("Giove", "Marte", "Europa", <br /> "una qualche altra luna di Giove",<br /> "Venere", "Plutone", "Terra", "Luna", "Mercurio", "Urano", "Saturno", <br /> "Una qualche luna di Saturno");<br />       msgBox.listChoose('Su che pianeta vorresti vivere?',elaboraRisposta, <br /> 'una domanda di cultura generale', -1, arrScelte)    <br />    }</pre><p>E infine il foglio di stile, usa il trucchetto della trasparenza per dare una parvenza di grafica</p><pre>SELECT#selectList {font-size:120%; opacity:0.8; filter: alpha(opcity=80);width:80%}<br /> </pre><p>&nbsp;</p><p>&nbsp;</p><hr width="100%" />I file descritti in questo articolo si possono scaricare dall'<a href="articoli-tecnici/tutorial-oggetti-javascript" title="Tutorial oggetti javascript">introduzione</a><p>&nbsp;</p></div>