<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>mronca.it</title>
<link rel="alternate" type="text/html" href="http://www.mronca.it/blog/" />
<modified>2006-06-05T22:05:44Z</modified>
<tagline>Tenere gli occhi aperti</tagline>
<id>tag:www.mronca.it,2007:/blog//1</id>
<generator url="http://www.movabletype.org/" version="3.12">Movable Type</generator>
<copyright>Copyright (c) 2006, matteo</copyright>
<entry>
<title>Pearl Jam</title>
<link rel="alternate" type="text/html" href="http://www.mronca.it/blog/archivio/2006/06/pearl_jam_1.html" />
<modified>2006-06-05T22:05:44Z</modified>
<issued>2006-06-05T21:34:02Z</issued>
<id>tag:www.mronca.it,2006:/blog//1.40</id>
<created>2006-06-05T21:34:02Z</created>
<summary type="text/plain"></summary>
<author>
<name>matteo</name>
<url>http://www.mronca.it</url>
<email>m.ronca@libero.it</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.mronca.it/blog/">

<![CDATA[<p><img alt="11.JPG" src="http://www.mronca.it/blog/archivio/11.JPG" width="200" height="300" /><br />
Colonna sonora il nuovo cd dei Pearl Jam, solo Pearl Jam, nient'altro nel nome. "Come back" tornare indietro, questa la canzone che gioca ora nelle mie orecchie. Tornare indietro, a quei dieci anni passati, strappati dal mio tempo, in cui tutto si è mosso, come sassi agitati in un bicchiere, e tutto è rimasto, tutto uguale, esattamente come dieci anni fa. E la voglia di crederci, di pensare che ci sia un'altra possibilità non è passata, non ce l'hanno fatta a estirparcela.</p>

<p>Avrei pagato per vedere il mio futuro dieci anni fa, avrei dato ciò che avevo per saltare in avanti, per lasciarmi alle spalle le paura della giovinezza, le incertezze di ciò che aveva da venire. Ora ci sono, fermo il tempo in un'istante, mi guardo intorno, mi osservo dall'alto e mi vedo. Che ridere, nulla è cambiato. </p>

<p>Le stesse passioni laceranti, la stessa voglia di sradicarci, di uscire dalla fila, di andare contro la corrente, risalirla fino alle sorgenti. </p>

<p>Se solo ascoltassero quello che abbiamo da dire. </p>

<p>Generazione di figli, di imboccati, di cani al guinzaglio. Lasciateci il mondo perchè noi sappiamo cosa farne. Abbiamo imparato, abbiamo capito e non abbiamo più paura.</p>]]>
</content>
</entry>
<entry>
<title>para- seiDiTorino?</title>
<link rel="alternate" type="text/html" href="http://www.mronca.it/blog/archivio/2005/12/para_seiditorin_1.html" />
<modified>2005-12-14T15:51:57Z</modified>
<issued>2005-12-09T17:06:35Z</issued>
<id>tag:www.mronca.it,2005:/blog//1.38</id>
<created>2005-12-09T17:06:35Z</created>
<summary type="text/plain">16 dicembre, il prossimo para- evento &quot;SeiDiTorino&quot;. Non perdetevelo, anche perchè non ci saranno repliche....</summary>
<author>
<name>matteo</name>
<url>http://www.mronca.it</url>
<email>m.ronca@libero.it</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.mronca.it/blog/">
<![CDATA[<p>16 dicembre, il prossimo para- evento "SeiDiTorino". Non perdetevelo, anche perchè non ci saranno repliche.</p>]]>
<![CDATA[<p><img alt="seiditorino_stick2.jpg" src="http://www.mronca.it/blog/archivio/seiditorino_stick2.jpg" width="500" height="143" /><br />
Sul <a href="http://lnx.ylda.org/sito/">"YLDA"</a> trovate la definizione di "para-": "movimento culturale di parartisti di varia origine e formazione che può assumere, secondo i casi, significati molto diversi, come vicinanza nello spazio, somiglianza, affinità e anche alterazione o contrapposizione. para- è un movimento che combatte la paranoia, la paralisi, i paraocchi. (...) para- crea l’evento parallelo, ciò che accade o si svolge in concomitanza, in accordo o in contrapposizione con qualche altra cosa, senza però confondersi con essa, procedendo nella stessa direzione, conservando invariata la distanza che le separa, in modo da non incontrarsi mai. Il parallelo è parafrasi, paradossale parapiglia e parassitismo.(...)<br />
Evento improvviso, stravagante, sconcertante, a volte assurdo, inverosimile. Disordine e confusione di persone e di cose; <br />
Fenomeno che disturba la ricezione, un’antenna non alimentata direttamente."</p>

<p>Il prossimo evento si svolgerà venerdì 16 dicembre a Torino in via Assarotti angolo via Garibaldi con il nome di "<a href="http://lnx.ylda.org/sito/IMG/jpg/seiditorino_stick2.jpg">seiDiTorino - seiParaFotografiDiTorino</a>". Chiaro a cosa si contrappone? :-)</p>

<p>Ripeto, non mancate.</p>]]>
</content>
</entry>
<entry>
<title>Trigger Javascript</title>
<link rel="alternate" type="text/html" href="http://www.mronca.it/blog/archivio/2005/02/trigger_in_java.html" />
<modified>2005-02-11T14:09:23Z</modified>
<issued>2005-02-10T16:21:30Z</issued>
<id>tag:www.mronca.it,2005:/blog//1.27</id>
<created>2005-02-10T16:21:30Z</created>
<summary type="text/plain">di Peter-Paul Koch (Translated with the permission of A List Apart Magazine and the author[s].) - Articolo originale Ora che nel vostro sito avete separato la struttura (XHTML) dalla sua presentazione (CSS), non sarebbe grandioso separare allo stesso modo il...</summary>
<author>
<name>matteo</name>
<url>http://www.mronca.it</url>
<email>m.ronca@libero.it</email>
</author>
<dc:subject>Web Design</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.mronca.it/blog/">
<![CDATA[di Peter-Paul Koch
(Translated with the permission of <a href="http://www.alistapart.com/">A List Apart Magazine </a>and the author[s].) - <a href="http://www.alistapart.com/articles/scripttriggers/">Articolo originale</a>

Ora che nel vostro sito avete separato la struttura (XHTML) dalla sua presentazione (CSS), non sarebbe grandioso separare allo stesso modo il livello operativo (Javascript) dagli altri? ALA Peter-Paul Koch spiega come ottenere ciò utilizzando i trigger Javascript.]]>
<![CDATA[<style type="text/css">
<!--
code{
    font-size:16px;
}
-->
</style>
<h1>Trigger in Javascript</h1>
<h2>di Peter-Paul Koch</h2>
<p>L’interfaccia utente di un sito web è composta da tre
livelli. L’XHTML costituisce il livello strutturale, che contiene gli elementi strutturali e semantici, oltre al contenuto del sito. A quest’ultimo possono essere aggiunti un livello di presentazione (CSS) e uno operativo (Javascript) per rendere il vostro sito più piacevole nell’aspetto e usabile. Questi tre livelli dovrebbero rimanere nettamente separati. Ad esempio, dovrebbe essere possibile riscrivere interamente il livello di presentazione senza toccare quello strutturale e quello operativo.</p>
<p>Nonostante questa separazione, il livello di presentazione e
l’operativo devono ricevere istruzioni da quello strutturale. Devono sapere
dove andare ad aggiungere quel dato elemento stilistico o quando compiere
quella determinata azione. Hanno bisogno di <i>triggers</i>.</p>
<p>I triggers dei CSS sono ben noti. Gli attributi <i>class </i>e
<i>id </i>permettono il controllo completo della presentazione del vostro sito.
Anche se è possibile fare a meno dei triggers, inserendo le istruzioni
direttamente negli attributi <i>style</i>, questo modo di scrivere il codice è
deprecato. Se volete aggiornare l’aspetto del vostro sito usando questa
tecnica, sarete costretti a cambiare anche il livello strutturale nell’XHTML;
in questo modo verrà meno la separazione tra presentazione e struttura.</p>
<h2>Triggers Javascript</h2>
<p>Il livello operativo dovrebbe funzionare esattamente allo
stesso modo. Dovremmo separare quest’ultimo dalla struttura eliminando i
gestori di eventi inseriti nel codice come ad esempio <code>onmouseover=&quot;switchImages('fearful',6,false)&quot;.
</code>Diversamente, dovremmo utilizzare i triggers per dire allo script
dove applicare un certo comportamento.</p>
<p>L’attributo <i>id </i>è il trigger Javascript più semplice</p>
<pre><code>
&lt;div id="navigation"&gt;
 &lt;ul&gt;
  &lt;li&gt;&lt;a href="#"&gt;Link 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#"&gt;Link 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="#"&gt;Link 3&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;

var x = document.getElementById('navigation');
if (!x) return;
var y = x.getElementsByTagName('a');
for (var i=0;i&lt;y.length;i++)
 y[i].onmouseover = addBehavior;
</code></pre>
<p >Lo script è lanciato dalla presenza o assenza dell’<i>id=”navigation”.</i>
Se è assente nulla accade (<i>if(!x) return;</i>), se invece è presente, tutti
gli elementi <i>link</i> che discendono da esso acquistano un comportamento <i>onmouseover</i>.
Questa soluzione è semplice ed elegante, e funziona in tutti i browser. Se l’<i>id</i>
soddisfa le vostre esigenze non serve che andiate oltre nella lettura di questo
articolo.</p>

<h2>Triggers avanzati</h2>


<p>Sfortunatamente ci sono delle situazioni in cui <i>id</i>
non può essere utilizzato come trigger:</p>

<ol>
 <li>un <i>id </i>può essere utilizzato solo una volta
     all’interno di un documento. In certi casi è necessario applicare lo
     stesso comportamento a più (gruppi di) elementi.</li>
 <li>Occasionalmente uno script ha bisogno altre informazioni,
     diverse dal semplice “esegui qui l’azione”</li>
</ol>

<p>Prendiamo gli script di un form
come esempio di entrambi i problemi. Potrebbe essere utile aggiungere dei
triggers per la validazione del form all’XHTML, per esempio qualcosa che dica “questo
campo è obbligatorio.”  Se avessimo usato un trigger avremmo avuto uno script
simile al seguente: </p>
<pre><code>
function validateForm()
{
 var x = document.forms[0].elements;
 for (var i=0;i&lt;x.length;i++)
 {
  if (<strong>[this field is required]</strong> && !x[i].value)
    // notify user of error
 }
}
</code></pre>
<p>Ma come facciamo a creare un trigger XHTML che dica allo
script che un certo campo è obbligatorio? Non si può fare attraverso un <i>id</i>:
abbiamo bisogno di una soluzione che funzioni per un numero illimitato di campi
del form. Si potrebbe usare l’attributo<code><span style='font-size:10.0pt'> class</span></code>
per lanciare quell’azione:</p>
<pre><code>
&lt;input name="name" class="required" /&gt;

if (<strong>x[i].className == 'required'</strong> && !x[i].value)
  // notify user of error
</code></pre>
<p>L’uso proprio dell’attributo<code> class </code>è di definire i triggers dei CSS.  Combinando CSS
e triggers JavaScript  non è impossibile, ma può confondere facilmente il
codice:</p>

<pre><code>
&lt;input name="name" class="largefield required" /&gt;

if (
  <strong>x[i].className.indexOf('required') != -1</strong> &&
  !x[i].value
)
</code></pre>
<p>In mia opinione, l’attributo <i>class </i>dovrebbe essere impiegato
<i>solo </i>per i CSS. Gli attributi <i>class </i> sono i trigger primary dell’XHTML
a livello di presentazione e renderli allo stesso tempo portatori di
determinate azioni confonde le cose. Creare dei trigger contemporaneamente su
entrambi i livelli attraverso l’attributo <i>class </i>viola la separazione tra
livello operativo e di presentazione, di conseguenza alla fine rimane una
scelta soggettiva.</p>

<h2>Trigger informativi</h2>

<p>Spesso i trigger posso diventare più complessi di un
semplice comando “applica qui un certo comportamento”. A volte si può voler
aggiungere un valore al trigger. Il valore associato al trigger rende il
livello operativo molto più versatile, dal momento che può operare su ciascun
elemento XHTML  individualmente, anziché eseguire uno script indistintamente. </p>

<p>Prendete un form con delle textarea con una lunghezza
massima per i valori. Il vecchio attributo <i>MAXLENGTH</i> non funziona con le
textarea, quindi dobbiamo scrivere uno script. Inoltre, non tutte le textarea
del form hanno la stessa lunghezza massima, rendendo quindi necessario
immagazzinare il valore della lunghezza massima da qualche altra parte.</p>

<p>In questo modo:</p>


<pre><code>
var x = document.getElementsByTagName('textarea');
for (var i=0;i&lt;x.length;i++)
{
 if (<strong>[this textarea has a maximum length]</strong>)
  x[i].onkeypress = checkLength;
}

function checkLength()
{
 var max = <strong>[read out maximum length]</strong>;
 if (this.value.length > max)
  // notify user of error
}
</code></pre>
<p>Lo script ha bisogno di 2 informazioni:</p>


<ol>
 <li>La textarea ha una lunghezza massima? Questo è il classico
     trigger che avverte lo script che qualche comportamento sta per essere
     attivato</li>
 <li>Qul è la lunghezza massima? Questo è il valore che lo
     script andrà a verificare quando l’utente inserirà dei dati nei campi.</li>
</ol>

<p>Qui la soluzione batasa su <i>class </i>non è più utile. Tecnicamente
è ancora possibile, ma il codice rischia di diventare troppo complesso. Prendete
una textarea di cui è richiesta una lunghezza massima di 300 px:</p>

<pre><code>
&lt;textarea
  class="large required maxlength=300"
&gt;
&lt;/textarea&gt;
</code></pre>
<p>Questo esempio non solo mischia la presentazione e due
differenti gruppi di comportamenti, ma diventa anche complicato leggere qual è
la lunghezza massima della textarea:</p>

<pre><code>
var max = <strong>this.className.substring(
  this.className.indexOf('maxlength')+10
)</strong>;
if (this.value.length > max)
 // notify user of error
</code></pre>

<p>Si noti che questo codice funziona solo quando mettiamo il
trigger della lunghezza massima come ultimo nel valore del <i>class. </i>Se
vogliamo metterlo altrove (perché ad esempio vogliamo aggiungere un altro
trigger con un valore) il codice diventa ancora più complicato.</p>

<h2>Il problema</h2>

<p>Questo è il problema che dobbiamo risolvere. Come facciamo
ad aggiungere trigger JavaScript che ci permettano di inserire nello script un
messaggio di avvertimento generico (“esegui qui una certa azione”)  e un valore
specifico di un elemento?</p>


<p>Dal punto di vista tecnico, aggiungere queste informazioni
all’elemento <i>class </i> è possibile, ma è permesso far portare certe
informazioni ad un attributo che non è stato creato per portare informazioni di
quel tipo? Questo non viola la separazione tra livello di presentazipone e
livello operativo? Anche se pensate che non ci siano ostacoli teorici, rimane
una soluzione complicata che richiede codice Javascript complesso. </p>


<p>E’ anche possibile aggiungere trigger ad altri attributi,
come <i>lang </i>o <i>dir</i> , ma, di nuovo, sarete costretti ad utilizzare
elementi che nascono per inglobare altri tipi di informazioni.</p>


<h2>Attributi personalizzati</h2>

<p>Io adotto un’altra soluzione. Diamo di nuovo un’occhiata all’esempio
della textarea con la lunghezza massima. Abbiamo bisogno di 2 informazioni:</p>
<ol>
 <li>La textarea ha una lunghezza massima?</li>
 <li>Qual è la lunghezza massima?</li>
</ol>
<p>Il modo naturale e semantico per portare questa informazione
è attraverso l’aggiunta di un attributo alla textarea:</p>

<pre><code>
&lt;textarea
  class="large" maxlength="300"
&gt;
&lt;/textarea&gt;
</code></pre>

<p>La presenza dell’attributo <i>maxlength</i> avverte lo
script di verificare l’input dell’utente nella textarea e troverà la grandezza
massima di questa specifica textarea nel valore dell’attributo. Trovandoci in questo
elemento possiamo altresì applicare il trigger personalizzato “<i>required”. required=true</i>,
per esempio, che quindi accetterà qualsiasi valore dal momento che il trigger
non specifica requisiti ulteriori.</p>

<p>Dal punto di vista tecnico non ci sono problemi. Il metodo <i>getAttribute()</i>
previsto dal W3C DOM   ci permette di leggere da qualsiasi tag qualsiasi
attributo. Solo Opera dalla versione 7.54 non permette di leggere gli attributi
esistenti (come ad esempio <i>src</i>) sul tag sbagliato (ad esempio <i>&lt;h2&gt;</i>).
 Fortunatamente versioni successive di questo browser supportano <i>getAttribute()</i>
in maniera completa.</p>


<p>Quindi, questa è la mia soluzione:</p>


<pre><code>
&lt;textarea
  class="large" maxlength="300" required="true"
&gt;
&lt;/textarea&gt;
</code></pre>

<p>Technically there&#8217;s no problem. The W3C DOM <code>getAttribute()</code> method allows us to read out any attribute from any tag. Only Opera up to version 7.54 <a href="http://www.quirksmode.org/bugreports/archives/2005/01/existing_attrib.html" title="Bug report">doesn&#8217;t allow us</a> to read out existing attributes (like <code>src</code>) on the wrong tag (like <code>&lt;h2&gt;</code>). Fortunately later versions of this browser support <code>getAttribute()</code> fully.</p>

<p>So this is my solution:</p>

<pre><code>
function validateForm()
{
 var x = document.forms[0].elements;
 for (var i=0;i&lt;x.length;i++)
 {
  if (<strong>x[i].getAttribute('required')</strong> && !x[i].value)
    // notify user of error
 }
}

var x = document.getElementsByTagName('textarea');
for (var i=0;i&lt;x.length;i++)
{
 if (<strong>x[i].getAttribute('maxlength')</strong>)
  x[i].onkeypress = checkLength;
}

function checkLength()
{
 var max = <strong>this.getAttribute('maxlength')</strong>;
 if (this.value.length &gt; max)
  // notify user of error
}
</code></pre>

<p>A mio modo di vedere questa è la soluzione più semplice da
implementare e la più vicina al modo in cui i triggers Javascript dovrebbero
essere: una coppia nome/valore dove il nome innesca l’azione del trigger e il
valore dà allo script ulteriori informazioni, permettendo di personalizzare le
azioni per ciascun singolo elemento. Infine, aggiungere questi trigger all’XHTML
è estremamente semplice anche per i webmaster alle prime armi.</p>


<h2>DTD personalizzata</h2>

<p>Chiunque adotti questa soluzioni e provi a sottoporre la
pagina a un validatore noterà immediatamente un problema. Il validatore
criticherà la presenza degli attributi <i>requires</i> e <i>maxlength</i>. Ciò
è assolutamente corretto: il primo attributo non è conforme all’XHTML, mentre
il secondo è valido solo all’interno dell’elemento &lt;<i>input</i>&gt;.</p>


<p>La soluzione è di <i>rendere </i> questi attributi validi,
creando un Document Type Definition (DTD) personalizzato, che estenda l’XHTML
quanto basta per includere i nosti attributi con i trigger. Questa DTD
personalizzata definisce gli attibuti speciali e la loro posizione nel
documento, e il validatore obbedirà eseguendo la validazione del documento
secondo i nostri gusti. Se il DTD dice che un attributo è valido, quell’attributo
è valido.</p>


<p>Se non sapete come creare un DTD personalizzato leggete J.
David Eisenberg in <i>Creating Custom DTDS </i>in questo numero, che spiega
tutto ciò che è necessario sapere.</p>


<p>Secondo me, usando attributi personalizzati per applicare il
livello operativo – e scrivendo DTD personalizzati per definire questi
attributi personalizzati in maniera corretta – aiuterà a separare il livello
operativo da quello strutturale e a scrivere script semplici ed efficienti. Inolte,
una volta che gli attributi sono stati definiti e gli script sono stati scritti
anche il webmaster  principiante sarà in grado di aggiungere questi trigger al
documento XHTML.</p>

<p>&nbsp;</p>

<p>Peter-Paul Koch è uno sviluppatore web freelance in
Amsterdam, Olanda. Scrive e cura <a href="http://www.quirksmode.org/">www.quirksmode.org</a>
un compendio con circa 180 articoli e suggerimenti sui CSS e Javascript,  oltre
un sistema di raccolta dei bug e a un blog.</p>]]>
</content>
</entry>
<entry>
<title>Frank Horvat</title>
<link rel="alternate" type="text/html" href="http://www.mronca.it/blog/archivio/2005/01/frank_horvat.html" />
<modified>2005-01-13T15:58:45Z</modified>
<issued>2005-01-13T15:55:50Z</issued>
<id>tag:www.mronca.it,2005:/blog//1.23</id>
<created>2005-01-13T15:55:50Z</created>
<summary type="text/plain">&quot;photography is the art of not pushing the button&quot; consiglio una visita al sito del grande fotografo Frank Horvet a tutti coloro che amano mitragliare il web di foto digitale e non solo. http://www.horvatland.com...</summary>
<author>
<name>matteo</name>
<url>http://www.mronca.it</url>
<email>m.ronca@libero.it</email>
</author>
<dc:subject>Foto</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.mronca.it/blog/">
<![CDATA[<blockquote>"photography is the art of not pushing the button"</blockquote>
consiglio una visita al sito del grande fotografo <strong>Frank Horvet</strong> a tutti coloro che amano mitragliare il web di foto digitale e non solo.

<p><a href="http://www.horvatland.com">http://www.horvatland.com</a></p>]]>

</content>
</entry>

</feed>
