<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CescoBlog &#187; jQuery</title>
	<atom:link href="http://www.cescopag.com/category/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cescopag.com</link>
	<description>Web-appunti tecnici (e non) per webdesigner e sviluppatori.</description>
	<lastBuildDate>Fri, 24 Dec 2010 08:11:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jQuery zoom plugin</title>
		<link>http://www.cescopag.com/2009/01/jquery-zoom-plugin/</link>
		<comments>http://www.cescopag.com/2009/01/jquery-zoom-plugin/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 14:24:06 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery ui]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=87</guid>
		<description><![CDATA[Visitando il sito Apple Store è possibile vedere all&#8217;opera un interessante funzionalità che permette lo zoom delle foto direttamente nel loro spazio, senza aprire fastidiosi popup.
Grazie a jQuery e la sua estensione jQuery UI è possibile realizzare il medesimo effetto in maniera semplice. In particolare andremo ad utilizzare il plugin &#34;draggable&#34; di jQuery UI.
Demo

L&#8217;idea di [...]]]></description>
			<content:encoded><![CDATA[<p>Visitando il sito Apple Store è possibile vedere all&#8217;opera un interessante funzionalità che permette lo zoom delle foto direttamente nel loro spazio, senza aprire fastidiosi popup.</p>
<p>Grazie a jQuery e la sua estensione jQuery UI è possibile realizzare il medesimo effetto in maniera semplice. In particolare andremo ad utilizzare il plugin &quot;draggable&quot; di jQuery UI.</p>
<p style="text-align:center"><strong><a href="http://www.cescopag.com/demos/zoom/index.html">Demo</a></strong></p>
<p><span id="more-87"></span></p>
<p>L&#8217;idea di base è quella di prevedere un DIV contenente l&#8217;immagine a bassa risoluzione. Al click su questa immagine, questa viene ingrandita fino alle dimensioni dell&#8217;immagine a grande risoluzione e successivamente scambiata con quest&#8217;ultima in modo da simulare uno zoom. Tramite la funzionalità &quot;draggable&quot; renderemo trascinabile  questa immagine, in modo da poter visualizzare tutte le parti dell&#8217;ingrandimento. Il nostro riquadro originale che contiene la foto sarà la &quot;finestra&quot; attraverso cui si vedrà l&#8217;immagine ad alta risoluzione sottostante. Sarà inoltre necessario impostare posizionamenti e limiti di trascinamento per garantire che l&#8217;immagine non esca dal riquadro.<br />
  Ho realizzato una piccola animazione che rappresenta l&#8217;idea:</p>
<p style="text-align:center"><img src="http://www.cescopag.com/wp-content/uploads/2009/01/anim.gif" alt="Animazione Zoom" title="animazione zoom tool" width="300" height="200" class="size-full wp-image-88" /></p>
<p>Il riquadro rosso è l&#8217;area originale dell&#8217;immagine piccola (non rappresentata). L&#8217;immagine grande (la foto che vedete nell&#8217;animazione) potrà essere trascinata in tutte le direzioni e soltanto la parte all&#8217;interno del riquadro rosso sarà visibile, dando l&#8217;impressione di un&#8217;immagine zoomata su cui effettuiamo il panning. Il riquadro grigio invece rappresenta i limiti entro i quali l&#8217;immagine può essere trascinata senza uscire dal riquadro rosso. Vedremo dopo come realizzare tutto ciò.</p>
<p>Ma procediamo con ordine. Per prima cosa realizziamo l&#8217;html necessario. Come abbiamo detto realizziamo un DIV contenente l&#8217;immagine piccola. Per garantire l&#8217;accessibilità anche a chi non ha javascript abilitato, l&#8217;inseriamo all&#8217;interno di un link che punta all&#8217;immagine grande e che ci servirà per identificare il path all&#8217;immagine ad alta risoluzione:</p>
<pre>&lt;div class=&quot;image-zoom&quot;&gt;
&lt;a href=&quot;img1-big.jpg&quot;&gt;
&lt;img src=&quot;img1-small.jpg&quot; alt=&quot;img1&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;</pre>
<p>Ora che l&#8217;html è pronto possiamo procedere con gli opportuni stili css:</p>
<pre>.image-zoom { overflow:hidden; width:300px; height:300px; position:relative }
.image-zoom img { position:absolute; }</pre>
<p>Come potete vedere ho impostato l&#8217;overflow hidden per confinare l&#8217;immagine all&#8217;interno del riquadro quando viene zoomata (come se fosse una finestra) e le dimensioni coincidenti con la dimensione dell&#8217;immagine contenuta. Ho poi aggiunto il posizionamento relative al contenitore e absolute all&#8217;immagine, in modo da poterla muovere liberamente nel nostro div.</p>
<p>Ora che abbiamo tutto pronto possiamo procedere all&#8217;aggiunta del javascript necessario, il tutto grazie a jQuery e jQuery UI. Andiamo quindi a realizzare la struttura base per realizzare un plugin in jQuery:</p>
<pre>(function($){
$.fn.zoom = function(params) {
   var defaults = {
      duration: 200,
      small_width:300,
      small_height:300,
      big_width:1000,
      big_height:1000
   };
   var options = $.extend(defaults, params);
   return this.each(function() {
      //istruzioni del plugin...
   });
}
})(jQuery)</pre>
<p>La prima riga e l&#8217;ultima riga servono soltanto a garantirci di poter utilizzare la scorciatoia &quot;$&quot; al posto di &quot;jQuery&quot;, mentre tramite <code>$.fn.zoom = function(params) { ... }</code> andiamo a realizzare il plugin vero e proprio. La variabile <code>params</code> è l&#8217;insieme di opzioni che possiamo impostare all&#8217;inizializzazione del plugin, mentre <code>defaults</code> sono i valori di default che il plugin andrà ad utilizzare. Infine uniamo il tutto tramite il metodo <code>$.extend</code> nell&#8217;oggetto <code>options</code>, il quale che conterrà i valori di default eventualmente sovrascritti dai parametri passati in <code>params</code>. I parametri di default sono in particolare la durata delle animazioni di zoom-in e zoom-out e le dimensioni dell&#8217;immagine a bassa e alta risoluzione (per semplicità ipotizziamo di avere immagini di dimensioni fisse).<br />
Le istruzioni del plugin invece andranno inserite all&#8217;interno del ciclo <code>return this.each(function() {...});</code>. Tramite <code>each</code> infatti possiamo inizializzare la funzionalità del plugin a più elementi contemporaneamente.</p>
<p>Il motivo per cui ho deciso di realizzare un plugin anziché semplici istruzioni è che permette di avere un codice riutilizzabile facilmente, permette di scrivere codice molto più ordinato e di estenderne le funzionalità senza dover mettere mano a tutto il flusso di lavoro.</p>
<p>Ma vediamo in dettaglio come sarà strutturato il plugin. In generale prevediamo quattro parti: una prima parte dove andremo a preparare tutte le variabili che ci servono, una seconda parte dove manipolare css e html per preparare le funzionalità del plugin, una terza parte dove andremo a gestire gli eventi dell&#8217;utente, richiamando gli opportuni metodi, ed infine un&#8217;ultima parte dove andremo ad implementare le varie funzionalità (zoom in, zoom out, drag etc.).</p>
<h4>Prima parte</h4>
<pre>//caching...
var $container = $(this);
var $link = $container.find('a');
var $image = $link.find('img');

//reading some parameters...
var small_path = $image.attr('src');
var big_path   = $link.attr('href');

//status variables...
var dragging = false;
var zoomed   = false;

//calculate correct positioning...
var a_width  = (options.big_width  - options.small_width)  * 2 + options.small_width;
var a_height = (options.big_height - options.small_height) * 2 + options.small_height;

var a_top  = options.big_height - options.small_height;
var a_left = options.big_width  - options.small_width;</pre>
<p>La prima sezione serve per fare il &quot;caching&quot; degli elementi utilizzati in modo da semplificarne e velocizzarne l&#8217;utilizzo nel resto del plugin. Salviamo poi i path delle immagini a bassa e alta risoluzione che ci serviranno nelle operazioni di zoom-in e zoom-out. Le variabili <code>dragging</code> e <code>zoomed</code>, che impostiamo all&#8217;inizio a <code>false</code>, servono per salvare lo stato corrente delle immagini, in particolare se le stiamo trascinando e se sono zoomate o rimpicciolite. Nell&#8217;ultima sezione infine calcoliamo i posizionamenti e le larghezze che ci serviranno quando andremo a manipolare il css dell&#8217;html.</p>
<h4>Seconda parte</h4>
<pre>$link.css({
    display:'block',
    position:'absolute',
    width: a_width   + 'px',
    height: a_height + 'px',
    top:  '-' + a_top  + 'px',
    left: '-' + a_left + 'px'
});

/* Removing default link behaviour... */
$link.removeAttr('href');

$image.css({
    display:'block',
    position:'absolute',
    width:  options.small_width + 'px',
    height: options.small_height + 'px',
    top: a_top + 'px',
    left: a_left + 'px'
});</pre>
<p>Nella seconda parte andiamo a cambiare i css di link e immagine per predisporre la funzionalità di zoom. In particolare il link diventerà il blocco che conterrà lo spostamento dell&#8217;immagine grande (il rettangolo grigio nell&#8217;animazione). A questo andremo poi a togliere l&#8217;attributo <code>href</code>, in modo da eliminare il comportamento standard del link che interferirebbe con il nostro plugin. L&#8217;immagine infine viene riposizionata all&#8217;interno del tag <code>a</code> in modo da trovarsi in corrispondenza della finestra originale (il rettangolo rosso). Infatti mentre il link è spostato a sinistra e in alto tramite margini negativi, l&#8217;immagine viene spostata degli stessi valori (<code>a_top</code>, <code>a_left</code>) ma verso destra e in basso, in modo da trovarsi nel medesimo punto rispetto alla finestra originale. In questo modo avremo già pronti i posizionamenti assoluti per l&#8217;animazione.</p>
<h4>Terza parte</h4>
<pre>$image.mouseup(function() {
    if (!dragging) {
        if (zoomed) {
	        zoomOut();
        } else {
    	    zoomIn();
        }
    }
});</pre>
<p>L&#8217;unico evento che ci interessa gestire è il rilascio del pulsante del mouse. Utilizzando infatti l&#8217;evento &quot;mouseup&quot; anziché l&#8217;evento &quot;click&quot; possiamo controllare lo stato prima di decidere che operazione compiere. Al rilascio del mouse controllo se sto effettuando il &quot;dragging&quot;. Se non sto trascinando, e quindi è un semplice click, effettuo lo zoom-in o lo zoom-out in base allo stato &quot;zoomed&quot;, richiamando i due metodi <code>zoomOut()</code> e <code>zoomIn()</code>.</p>
<h4>Quarta parte</h4>
<p>Nella quarta parte andremo ad implementare i metodi zoomOut() e zoomIn() richiamati precedentemente, oltre a quelli che si renderanno necessari successivamente:</p>
<pre>function zoomOut() {
    $image.animate({
        width:options.small_width + 'px',
        height:options.small_height + 'px',
        top:  a_top  + 'px',
        left: a_left + 'px'
    }, options.duration, swapWithSmall);
	zoomed = false;
}

function zoomIn() {
    $image.animate({
        width:options.big_width + 'px',
        height:options.big_height + 'px',
        top:  a_top / 2  + 'px',
        left: a_left / 2 + 'px'
    }, options.duration, swapWithBig);
    zoomed = true;
}</pre>
<p></p>
<p>Come vedete ogni metodo va ad animare dimensioni e posizionamenti css secondo i valori calcolati nella prima parte. Alla fine dell&#8217;animazione vengono richiamati i due metodi per scambiare l&#8217;immagine, rispettivamente &quot;swapWithBig&quot; e swapWithSmall&quot;:</p>
<pre>function swapWithBig() {
	$image.attr('src', big_path);
	$image.draggable({
		containment: 'parent',
		start: handleStartDrag,
		stop: handleStopDrag
	});
}

function swapWithSmall() {
	$image.attr('src', small_path);
	$image.draggable('disable');
}

function handleStartDrag() {
	dragging = true;
}

function handleStopDrag() {
	dragging = false;
}</pre>
<p>Questi non fanno altro che cambiare l&#8217;attributo <code>src</code> e ad abilitare (nel caso dello zoom-in) o disabilitare (nel caso dello zoom-out) la funzionalità &quot;draggable&quot; di jQuery UI. Come vedete a draggable vengono impostati alcuni parametri:</p>
<p>containment: serve ad impostare i limiti di trascinamento. Nel nostro caso è impostato a <code>parent</code>, e cioè al tag html che contiene l&#8217;elemento e quindi il tag <code>a</code>  che abbiamo appositamente posizionato e dimensionato proprio per questo scopo.<br />
  start: è la funzione che viene eseguita quando inizia il trascinamento. Nel nostro caso è la funzione <code>handleStartDrag</code> che non fa altro che aggiornare la variabile di stato corrispondente (dragging).<br />
  stop: è la funzione che viene eseguita alla fine del trascinamento e richiama la funzione <code>handleStopDrag</code>, che aggiorna la variabile <code>dragging</code>.</p>
<p>Il plugin ora è completo, non ci resta che richiamarlo nella nostra pagina tramite la sintassi solita di jQuery:</p>
<pre>$(document).ready(function() {
	$('.image-zoom').zoom();
});</pre>
<p>Alcuni metodi possono sembrare superflui, ma ho preferito spezzettare il plugin in più funzioni esplicite, ciascuna con funzionalità ben definite, piuttosto che annidare funzioni su funzioni come jQuery a volte induce a fare. Questo semplifica la lettura del codice e soprattutto le successive manipolazioni e revisioni.</p>
<p>Ecco il codice completo del plugin, mentre <a href="http://www.cescopag.com/demos/zoom/index.html">qui potete vederlo in azione</a>:</p>
<pre>(function($) {
$.fn.zoom = function(params) {
	/*
	Zoom jQuery Plugin
	Copyright: (C) 3009 - Francesco Paggin
	Parameters:
		(int) duration: the duration of the zooming animaton
		(int) small_width, small_height: the dimensions of the small thumbnails
		(int) big_width, big_height: the dimensions of the zoomed images
	*/
	var defaults = {
		duration: 200,
		small_width:300,
		small_height:300,
		big_width:1000,
		big_height:1000
	};
	var options = $.extend(defaults, params);

	return this.each(function() {
		//caching...
		var $container = $(this);
		var $link = $container.find('a');
		var $image = $link.find('img');

		//reading some parameters...
		var small_path = $image.attr('src');
		var big_path   = $link.attr('href');

		//status variables...
		var dragging = false;
		var zoomed   = false;

		//calculate correct positioning...
		var a_width  = (options.big_width  - options.small_width)  * 2 + options.small_width;
		var a_height = (options.big_height - options.small_height) * 2 + options.small_height;

		var a_top  = options.big_height - options.small_height;
		var a_left = options.big_width  - options.small_width;

		/*
			INITIALIZATION...
		*/
		$link.css({
			display:'block',
			position:'absolute',
			width: a_width   + 'px',
			height: a_height + 'px',
			top:  '-' + a_top  + 'px',
			left: '-' + a_left + 'px'
		});

		/* Removing default link behaviour... */
		$link.removeAttr('href');

		$image.css({
			display:'block',
			position:'absolute',
			width:  options.small_width + 'px',
			height: options.small_height + 'px',
			top: a_top + 'px',
			left: a_left + 'px'
		});

		/*
			HANDLE EVENTS...
		*/
		$image.mouseup(function() {
			if (!dragging) {
				if (zoomed) {
					zoomOut();
				} else {
					zoomIn();
				}
			}
		});

		/*
			METHODS...
		*/
		function zoomOut() {
			$image.animate({
				width:options.small_width + 'px',
				height:options.small_height + 'px',
				top:  a_top  + 'px',
				left: a_left + 'px'
			}, options.duration, swapWithSmall);
			zoomed = false;
		}

		function zoomIn() {
			$image.animate({
				width:options.big_width + 'px',
				height:options.big_height + 'px',
				top:  a_top / 2  + 'px',
				left: a_left / 2 + 'px'
			}, options.duration, swapWithBig);
			zoomed = true;
		}

		function swapWithBig() {
			$image.attr('src', big_path);
			$image.draggable({
				containment: 'parent',
				start: handleStartDrag,
				stop: handleStopDrag
			});
		}

		function swapWithSmall() {
			$image.attr('src', small_path);
			$image.draggable('disable');
		}

		function handleStartDrag() {
			dragging = true;
		}

		function handleStopDrag() {
			dragging = false;
		}
	});
}
})(jQuery)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/01/jquery-zoom-plugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>jQuery plugin</title>
		<link>http://www.cescopag.com/2008/09/jquery-plugin/</link>
		<comments>http://www.cescopag.com/2008/09/jquery-plugin/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 20:33:38 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=38</guid>
		<description><![CDATA[Oggi ho realizzato un piccolo plugin in jQuery che ben si presta a fare da breve introduzione allo sviluppo di plugin per il famoso framework javascript.
Quello di cui avevo bisogno era un plugin per simulare il comportamento della pseudo-classe &#8220;focus&#8221; in modo da renderla compatibile con tutti i browser. Nella fattispecie quando ci si posiziona [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi ho realizzato un piccolo plugin in jQuery che ben si presta a fare da breve introduzione allo sviluppo di plugin per il famoso framework javascript.</p>
<p>Quello di cui avevo bisogno era un plugin per simulare il comportamento della pseudo-classe <em>&#8220;focus&#8221;</em> in modo da renderla compatibile con tutti i browser. Nella fattispecie quando ci si posiziona su un campo di input, a questo viene aggiunta una classe in modo da cambiarne lo stile. In questo modo si evidenzia all&#8217;utente il campo in cui sta operando favorendo l&#8217;accessibilità e l&#8217;usabilità.</p>
<p><span id="more-38"></span></p>
<p>Ma veniamo al sodo. Il comando base che useremo per estendere jQuery è il metodo <code>$.fn.nomePlugin = function() {}</code>. Possiamo passare alla funzione i parametri per la configurazione, nel caso il nostro plugin ne abbia bisogno. La prassi è di utilizzare come parametro un singolo oggetto contenente i vari parametri, in modo da rendere il codice più leggibile ed espandibile. Nel nostro caso è sufficiente un unico parametro che sarà il nome della classe che verrà aggiunta agli elementi durante il focus. Cominciamo quindi a scrivere:</p>
<pre>$.fn.pseudoFocus = function(params) {
    defaults = {classe: 'hasFocus'};
    options = $.extend(defaults, params);
}</pre>
<p>Come vedete utilizzo il parametro <code>params</code> per i valori passati dall&#8217;utente e <code>defaults</code> per le impostazioni di default appunto. Tramite il comando <code>$.extend(defaults, params)</code> jQuery &#8220;estende&#8221; i valori di default con i nuovi valori passati al plugin. In pratica vengono modificati solo i parametri diversi da quelli di default, lasciando gli altri inalterati.</p>
<p>Ora che abbiamo tutte le informazioni passiamo alla funzionalità vera e propria del plugin:</p>
<pre>$.fn.pseudoFocus = function(params) {
	//valori di default
    defaults = {classe: 'hasFocus'};
    options = $.extend(defaults, params);

    return this.each(function() {
    	var element = $(this); //opero sull'elemento che qui è individuato da "this"
    	//qui va il nostro codice...
    });

}</pre>
<p>Come evidenziato da <code>return this.each(function() {...})</code> il corpo del plugin deve ritornare un ciclo. Questo perché jQuery opera su tutti gli elementi individuati dal selettore usato, quindi nel caso in cui ce ne siano più d&#8217;uno dovremo eseguire il plugin su ciascuno di essi. All&#8217;interno del nostro ciclo quindi il singolo elemento sarà individuato da <code>$(this)</code>. Per comodità assegnamo l&#8217;elemento ad una variabile che ho chiamato <code>element</code>.</p>
<p>Il nostro plugin, come accennato prima, deve aggiungere agli elementi la classe desiderata durante l&#8217;evento <em>focus</em> e rimuoverla durante l&#8217;evento <em>blur</em>. Aggiungiamo quindi questi metodi:</p>
<pre>$.fn.pseudoFocus = function(params) {
	//valori di default
    defaults = {classe: 'hasFocus'};
    options = $.extend(defaults, params);

    return this.each(function() {
    	var element = $(this); //opero sull'elemento che qui è individuato da "this"
    	//qui va il nostro codice...
    	element.focus(function() {
    		element.addClass(options.classe);
    	});
    	element.blur(function() {
    		element.removeClass(options.classe);
    	});
    });
}</pre>
<p>Come vedete all&#8217;interno dei due metodi appena citati viene aggiunta o tolta la classe grazie a <code>element.addClass(options.classe)</code> e <code>element.removeClass(options.classe)</code>, i metodi di jQuery per manipolare le classi. Come vedete ho utilizzato il nostro oggetto <code>options</code> che contiene la classe desiderata (sia essa quella di default o quella fornita in fase di inizializzazione del plugin).</p>
<p>Ci rimane però un ultimo step. Come vedete abbiamo sempre utilizzato l&#8217;abbreviazione <strong>$</strong> al posto di <strong>jQuery</strong>. Questo potrebbe generare conflitti con altre librerie che utilizzano lo stesso metodo (prototype e motools, tanto per citarne due&#8230;). Per fortuna possiamo sfruttare la sintassi di javascript per aggiungere una &#8220;schermatura&#8221; (in inglese &#8220;closure&#8221;) in modo da poter utilizzare liberamente il dollaro all&#8217;interno del plugin senza però interferire con ciò che viene usato all&#8217;esterno. Per farlo basta utilizzare la forma (function($) {&#8230;})(jQuery). Questa non fa altro che definire la funzione anonima <code>function($) {...}</code> ed utilizzarla subito passando come parametro <code>jQuery</code>. In questo modo <strong>$</strong> diventa una variabile interna alla funzione e quindi il nostro plugin può utilizzarla liberamente.</p>
<p>Il plugin finito è quindi:</p>
<pre>(function($) {
    $.fn.pseudoFocus = function(params) {
	    //valori di default
        defaults = {classe: 'hasFocus'};
        options = $.extend(defaults, params);

        return this.each(function() {
    	    var element = $(this); //opero sull'elemento che qui è individuato da "this"
            //qui va il nostro codice...
            element.focus(function() {
                element.addClass(options.classe);
            });
            element.blur(function() {
                element.removeClass(options.classe);
            });
        });
    }
})(jQuery)</pre>
<p>Salviamo il file come <strong>jquery.pseudoFocus.js</strong> nella stessa cartella di jQuery. Per utilizzarlo dobbiamo richiamarlo nella pagina subito dopo il tag &#8220;script&#8221; che richiama jQuery. Dovremo poi eseguirlo dopo il caricamento del DOM tramite la sintassi <code>$(document).ready(...)</code>:</p>
<pre>&lt;script type="text/javascript" src="jquery.js"></script>
&lt;script type="text/javascript" src="jquery.pseudoFocus.js"></script>

$(document).ready(function() {
    $('input[type=text], input[type=password], textarea').pseudoFocus({classe: 'miaClasse'});
});</pre>
<p>Come vedete vengono prelevati gli input di tipo text, password e le textarea (ma avrei potuto utilizzare un qualsiasi elemento) e viene loro assegnato l&#8217;effetto focus tramite la classe &#8220;miaClasse&#8221;. Basterà realizzare un css adeguato e il gioco sarà fatto.</p>
<p>Come considerazione finale c&#8217;è da dire che la pseudo-classe focus è supportata da molti browser moderni e quindi l&#8217;esecuzione del plugin non è sempre necessaria. Ci basterebbe infatti utilizzare &#8220;:focus&#8221; nel css al posto di .miaClasse ed avremmo il medesimo effetto.
<p>Non ho voluto dilungarmi su questo ma focalizzarmi su come stendere un semplice plugin. Nell&#8217;utilizzo reale avremmo potuto controllare la versione del browser tramite <code>$.browser</code> e decidere di conseguenza se applicare o meno la classe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/09/jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

