Newsgroup: it.comp.lang.javascript
Titolo: non riesco a svuotare una select

Salve,
scusate se sembra banale, ma non riesco a trovare l'errore.
Ho questa funzione:
function process(res) {
	var sel = byid("lista");
	//  Svuota la select
	opts = sel.getElementsByTagName("option");
	for (i=0; i<opts.length; i++) {
		// alert("opt: "+opt.value);
		sel.removeChild(opts[i]);
	}
 
	// E la riempie con quelli nuovi
	for (var i=0; i<res.length; i++) {
		opt = document.createElement("option");
		opt.setAttribute("value", res[i]);
		opttxt = document.createTextNode(res[i]);
		opt.appendChild(opttxt);
		sel.appendChild(opt);
	}
}
(spero mantenga i tabulatori).
byid() e` un'abbreviazione per document.getElementsById()
Alla funzione viene passato un array (res) di valori, che lui deve mettere
nella select. Quindi prima la svuoto elemento per elemento, poi la riempio.
Il problema e` nella prima parte: mi toglie la meta` degli elementi.
In teoria dentro opts c'e` una serie di oggetti, quindi non dovrebbe
"scalare" quando faccio i removeChild().
Devo per forza ciclare e prendere ogni volta sel.firstChild() ?
OK, posso risolvere con innerHTML, ma volevo capire perche` il codice qui
sopra non funziona... :/
Grazie.
Bye.

 	}
eh eh ... è un problema logico, non di javascript.
esempio: select con 3 elementi
a) i=0, rimuovo elemento 0 => l'elemento 1 diventa 0 e l'elemento 2 diventa
1
b) i=1, rimuovo elemento 1 => l'elemento 0 RESTERA' PER SEMPRE 
...
devi ciclare al contrario per toglierli (dall'ultimo al primo), del tipo
 for(i=opts.length-1;i>=0;i--)
-- 
"qualcuno è andato per età
 qualcuno perchè già dottore
 e insegue una maturità, si è sposato, fa carriera
 ed è una morte un po' peggiore"
									    F.G.

 eh eh ... è un problema logico, non di javascript.
Infatti ciclando al contrario funziona. Grazie :)
Ma secondo logica, quando faccio la getElementsByTagName riempio l'array
opts, che contiene, a questo punto, oggetti del DOM, e non numeri.
Quindi io ciclo sull'array (che e` statico) e rimuovo dalla select ogni
elemento DOM usando il suo puntatore, non il numero.
E` questo che non mi torna... :/
Bye.

 E` questo che non mi torna... :/
non ti torna perché non hai capito la mia spiegazione, seguila bene: se in
un array elimino p.e. il primo elemento, gli altri "slittano" verso il
basso come indice ...
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

On 29 Jan 2007 16:51:24 GMT, Alessandro Pellizzari wrote:
[stracut]
Dato che già ti è stato risposto al problema inerente il tuo codice
nello specifico; tratterò la più generale tematica del subject.
Ma un bel:
	while ( sel.firstChild )
		sel.removeChild( sel.firstChild );
Un ti garba? (detto alla toscana) :)
In alternativa puoi usare l'approccio "unnico":
	sel.options.length = 0;
-- 
~ Plagiarism is copying from one source;
research is copying from two or more
(Wilson Mizner)

 basso come indice ...
Si`, avevo capito la spiegazione. :)
Ma il fatto e` che io non elimino mai niente dall'array. Io ho un array
(opts) che contiene, per esempio, [DOMElement1, DOMElement2, DOMElement3],
e dall'altra parte ho l'oggetto sel che e` un DOMElement (ricavato con
getElementById()) e contiene gli stessi elementi dell'array.
Ora, se io scorro in lettura opts, e cancello da sel ogni elemento
corrispondente, mi aspetto che li cancelli indipendentemente dall'ordine
in cui sono, perche` (teoricamente) sto trattando con dei puntatori agli
oggetti, non con un indice di array.
Se la corrispondenza fosse biunivoca (cioe` quando tolgo roba da sel la
tolgo anche da opts), mi basterebbe fare un unset() (sintassi PHP, non so
se in JS esista) di ogni elemento di opts per toglierlo anche dal DOM.
Volevo appunto capire cosa fa esattamente JS, come si riferisce agli
elementi del DOM. Probabilmente e` questo che non ho ancora capito.
Bye.

 	sel.options.length = 0;
Troppo unnico per me. :)
Bye.

 elementi del DOM. Probabilmente e` questo che non ho ancora capito.
Ed io non ho ben capito la domanda. :)
-- 
~ "La malinconia è la felicità di esser tristi." (Victor Hugo)

 Troppo unnico per me. :)
Beh, con le select funziona tranquillamente; solo se utilizzi
delle collection recuperate in altro modo, sollevi un'errore.
-- 
~ La donna è un male, ma un male necessario.
(Aulo Gellio)

 Hai una collection. Modo pratico per spiegarmi "ammodino":
OK, allora credo di aver capito. In pratica non ho dei puntatori agli
oggetti ma gli oggetti veri e propri, quindi rimuovendoli mi cambia anche
la collection (che, per dirla in SQL, e` una view e non una table)
Grazie mille a entrambi per la pazienza :)
Bye.

 la collection (che, per dirla in SQL, e` una view e non una table)
Secondo me ti stai un po' complicando le cose, con questo genere di
"metafore".. :)
-- 
~ Se i miei cattivi pensieri non fossero caricati a salve, ogni giorno
sarebbe una strage.

 "metafore".. :)
Il problema e` che una marea di concetti di JS sono parecchio diversi da
tutti gli altri linguaggi che ho usato.
Da una parte e` uno stimolo, da un'altra mi crea un po' di confusione,
quindi cerco analogie con qualcosa che gia` conosco.
Grazie comunque per gli aiuti :)
Bye.