Discussione:
Ciclo for sulle options di una select
(troppo vecchio per rispondere)
horowitz
2007-05-19 06:38:48 UTC
Permalink
Salve a tutti,

Sto leggendo la guida JavaScript del sito w3schools e mi sono
imbattuto in questo banale script che però non funziona. Vorrei capire
il meccanismo per il quale, pur trovando 4 elementi nella Select, il
ciclo for visualizza soltanto il primo. Sembra che si fermi comunque
dopo il primo document.write. Mi piacerebbe capirne il perché.

Testato con IE6. Grazie.

http://www.w3schools.com/js/tryit.asp?filename=try_dom_select_options
Cristiano Larghi
2007-05-19 12:17:01 UTC
Permalink
Post by horowitz
Sto leggendo la guida JavaScript del sito w3schools e mi sono
imbattuto in questo banale script che però non funziona. Vorrei capire
il meccanismo per il quale, pur trovando 4 elementi nella Select, il
ciclo for visualizza soltanto il primo. Sembra che si fermi comunque
dopo il primo document.write. Mi piacerebbe capirne il perché.
function getOptions()
{
var x=document.getElementById("mySelect");

e ok, qua hai recuperato un riferimento all'oggetto select. ricorda: l'id
deve essere univoco nella pagina

for (i=0;i<x.length;i++)

qua sta l'errore: x.length; non so cosa possa restituire: come dicevo sopra
è univoco e non restituisce un array ... a naso, se usa value come
proprietà predefinita, potrebbe restituire la lunghezza del value, ma la
sto sparando (non ha senso length applicato a un oggetto che non sia una
collection)

qua un po' di semplicissimi esempi sulle select e options:
http://www.criosoftware.it/defaultTIselect.aspx
--
"qualcuno è andato per età
qualcuno perchè già dottore
e insegue una maturità, si è sposato, fa carriera
ed è una morte un po' peggiore"
F.G.
gnurant
2007-05-19 17:42:18 UTC
Permalink
Post by Cristiano Larghi
for (i=0;i<x.length;i++)
qua sta l'errore: x.length; non so cosa possa restituire: come dicevo sopra
è univoco e non restituisce un array ... a naso, se usa value come
proprietà predefinita, potrebbe restituire la lunghezza del value, ma la
sto sparando (non ha senso length applicato a un oggetto che non sia una
collection)
Non e' qui il problema: seppur teoricamente scorretto (e non chiedermi
perche' non fanno x.options.length, visto che il for scorre proprio le
options) ritorna il valore giusto (in questo caso 4).
ZER0
2007-05-19 22:49:34 UTC
Permalink
Post by gnurant
Non e' qui il problema: seppur teoricamente scorretto (e non chiedermi
perche' non fanno x.options.length, visto che il for scorre proprio le
options)
Beh, non è tecnicamente scorretto, fa parte delle specifiche. Diciamo
che spesso si preferisce riferirsi a "options" perché è su quella che
poi si lavora: in quei casi spesso non mantengo neppure alcun tipo di
riferimento alla select. Qualcosa tipo:

var opts = document.getElementById("mysel").options;

for (var i=0;i<opts.length;i++)
alert(opts[i].value);

Tornando allo script, questo visualizza solo la prima "option" per un
semplice motivo: utilizzando document.write dopo che la pagina ha già
completato il caricamento, la "sovrascrive". Quindi eseguito il primo
step del ciclo, lo script non è più presente in memoria perché IE gli
ha dato un bel colpo di spugna e ha cancellato ogni bene.
--
~ Se i sintomi persistono, insultare il medico.
ZER0
2007-05-19 23:00:06 UTC
Permalink
Post by horowitz
Sto leggendo la guida JavaScript del sito w3schools e mi sono
imbattuto in questo banale script che però non funziona.
Non conosco la guida, sinceramente, ma se tutti gli script sono fatti
in quel modo, ti consiglio di cambiarla. :)
Post by horowitz
ciclo for visualizza soltanto il primo. Sembra che si fermi comunque
dopo il primo document.write. Mi piacerebbe capirne il perché.
Ho risposto a questo nel post precedente, ovvero:

<news:17f3b3ynmvfo2$***@ID-171124.news.individual.net>

Il concetto di fondo comunque, è che document.write va a scrivere nel
buffer di output del documento. Ora, se questo non è ancora stato del
tutto chiuso, il testo passato come parametro viene accodato. Invece,
se è stato chiuso - ovvero, la pagina è stata finita di caricare - ne
viene aperto uno nuovo in cui scrivere.
La conseguenza è che la pagina corrente viene "cancellata". In quello
script, quindi, dopo la prima chiamata a document.write, il codice JS
viene eliminato e IE6 non sa più cosa chiamare.

E difatti, genera un errore se ci fai caso.
--
~ Se i sintomi persistono, insultare il medico.
ZER0
2007-05-19 23:02:50 UTC
Permalink
Post by horowitz
Sto leggendo la guida JavaScript del sito w3schools e mi sono
imbattuto in questo banale script che però non funziona.
Non conosco la guida, sinceramente, ma se tutti gli script sono fatti
in quel modo, ti consiglio di cambiarla. :)
Post by horowitz
ciclo for visualizza soltanto il primo. Sembra che si fermi comunque
dopo il primo document.write. Mi piacerebbe capirne il perché.
Ho risposto a questo nel post precedente, ovvero:

<news:17f3b3ynmvfo2$***@ID-171124.news.individual.net>

Il concetto di fondo comunque, è che document.write va a scrivere nel
buffer di output del documento. Ora, se questo non è ancora stato del
tutto chiuso, il testo passato come parametro viene accodato. Invece,
se è stato chiuso - ovvero la pagina ha completato il suo caricamento
- ne viene aperto uno nuovo in cui scrivere.
La conseguenza è che la pagina corrente viene "cancellata": In quello
script, quindi, dopo la prima chiamata a document.write, il codice JS
viene eliminato e IE6 non sa più a cosa riferirsi, cosa eseguire.

E difatti, genera un errore se ci fai caso.
--
~ Se i sintomi persistono, insultare il medico.
Loading...