Modificare le Select con DOM , Javascript e Ajax

Data: 27 Novembre 2005
Autore: Maurizio Pelizzone
ajax

Prefazione:
Quello che segue è il resoconto una serie di esperimenti per capire come utilizzare Ajax per migliorare l’usabiltà dei siti senza essere tropo invasivo

Definizione:
Il w3c definisce le select html con questa definizione:
“L’elemento SELECT crea un menu. Ciascuna scelta offerta dal menu è rappresentata da un elemento OPTION.”

Analisi:
Questa è la sintassi che conosciamo tutti

Sperimentazioni:

Se volessimo usare Javascript per aggiungere degli elementi “Option” tramite il DOM ( Document Object Model ) sono sufficenti queste righe

Ma se volessimo caricare in modo dinamico il contenuto di un file simile a questo ? ( esempio.json )

Con l’aito di XHConn di cui ho parlato qualche giorno fa possiamo usare una funzione javascript come questa

Osservazioni:

Il formato usato per il file esterno è chiamato JSON “JavaScript Object Notation”.
In questo esempio ho preferito usare questo formato rispetto ad xml in quanto lo ritengo più immediato.

Ovviamente al posto del file “esempio.json” ci potrebbe essere una pagina scritta in php o in qualsiasi altro linguaggio server-side che dopo una connessione ad un database ci potrebbe restituire un recordset formattato secondo la semantica json

Nella pratica dove una Select è riempita dinamicamente in conseguenza del contenuto di un’altra possiamo lanciare la funzione FillSelect dopo l’evento onchange della prima Select avendo cura di rendere disabilitata la seconda Select ( quella di destinazione ) sino alla fine del caricamento.

Aggiornamento del 26 Luglio 2006

Tramire DOM abbiamo visto come aggiungere un elemento, ma è anche possibile eliminarlo. Per farlo e sufficente settare a “null” l’oggetto option desiderato.

partendo dal’esempio di prima questa è la sintassi nel caso volessimo eliminare il primo valore … ( la numerazione parte da 0 “zero” )

se volessimo eliminare i primi due attenzione a non commettere questo errore …

… in questo caso elimineremmo il primo ed il terzo in quanto dopo ever eliminato il primo la numerazione del conteggio delle option riparte da 0 , quindi il quello che prima consideravemo il secondo valore e diventato il primo.

possiamo risolvere il problema in due modi: il primo consiste nell’eliminazione di option[0] per due volte, mentre il secondo ( forse più chiaro da leggere ) inverte semplicemente l’ordine di eliminazione, prima option[1] e poi option[0].

Volessimo eliminare completamente il contenuto di una select allora potremo scrivere qualcosa del genere.

Refusi a parte dovrebbe funzionare.

Aggiornamento del 13 Novembre 2007

Metto a disposizione il codice di tutta la pagina che ho testato su FF, IE ed Opera Fate attenzione al fatto che devono essere presenti XHConn.js ed il file json (nel mio esempio fill.txt)

  1. <html>
  2.         <head>
  3.                 <title>Select ajax DOM Fill</title>
  4.                 <script type="text/javascript" src="XHConn.js"></script>
  5.         </head>
  6.         <body>
  7.         <script type="text/javascript">
  8.         function fill( ) {
  9.           var fnCarica = function (oGet) { 
  10.                 objSelect = document.getElementById('elemento-select') ;
  11.                 var sJSON = oGet.responseText;
  12.                
  13.                 var oJSON = eval(sJSON);   
  14.                 var nOpt
  15.                 for( nOpt=0;nOpt<oJSON.length;nOpt++) {
  16.                         objSelect.options[objSelect.options.length] = new Option( oJSON[nOpt].text , oJSON[nOpt].value )   
  17.                  };
  18.           };
  19.           new XHConn().connect('fill.txt', 'GET', '' , fnCarica);
  20.         }
  21.         </script>
  22.         <select id="elemento-select">
  23.                 <option value="valore1">etichetta1</option>
  24.                 <option value="valore2">etichetta2</option>
  25.                 <option value="valore3">etichetta3</option>
  26.         </select>
  27.         <button onclick="fill()">bau</button>
  28.         </body>
  29. </html>

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • digg
  • co.mments
  • De.lirio.us
  • Fark
  • Furl
  • NewsVine
  • Reddit
  • Smarking
  • Spurl
  • Segnalo
  • OKNOtizie
  • Taggly

Questo articolo è stato pubblicato il 27 Novembre 2005 alle 6:01 pm ed è stato letto 22860 volte
Archiviato sotto sviluppo, ajax, web 2.0, javascript.

Se questo post ti è piaciuto puoi iscriverti al mio Feed Rss e ricevere direttamente gli aggiornamenti di questo blog sul tuo FeedReader oppure puoi decidere di offrirmi un caffè.
Se ti va puoi lasciare un commento e leggere quelli degli altri, ma se preferisci puoi passare direttamente al post precedente o a quello successivo.


Forse collegati ..

  • links for 2006-02-23
    Ajax tabs I've taken the idea of the sliding door tabs and mixed them up with a little javascript and ajax
  • links for 2006-03-17
    Thumbstacks.com - Live presentations on the web! con questo sito è possibile preparare e condividere presentazioni tipo powerpoint gratuitamente. è sufficente un
  • links for 2006-03-22
    SortedTable Una libreria in javascript per ordinare , o spostare le righe all'interno di una tabella html. In questo link sono presenti
  • links for 2005-12-22
    Landing page per il calcolo della redemption delle chiavi La landing è una pagina realizzata per accogliere un visitatore in arrivo
  • Ancora su AJAX
    Link di reiferimento: Ancora su AJAX Ieri su programmazione.it è stato pubblicato un breve tutorial sui fondamenti della tecnologia AJAX. Non credo

5 Commenti per “Modificare le Select con DOM , Javascript e Ajax”

  1. Eccezionale, semplice, efficace. Complimenti. :)

  2. Funziona perfettamente su Firefox, ha problemi però su IE. :(

    “text” è nullo o non è un getto.

    Come potrei risolvere? Sigh…

  3. Non funziona un piffero su IE come dice Luigi…

  4. Ciao Fab,

    ho aggiornato il post, verificato e corretto.
    fai un prova con il codice che ho postato, adesso dovrebbe andare…
    cià

  5. Franky

    FANTASTICO!
    Funziona anche con doctype XHTML 1.1 content-type=”application/xml”

Lascia un messaggio