Newsgroup: it.comp.lang.javascript
Titolo: aggiungere una option in una select

Ho fatto una funzione che elimina il valore selezionato di una option
function elimina(eForm,eSel) {
var Sel = eForm.elements[eSel];
if(Sel.length > 0) {
var Num = Sel.selectedIndex;
Sel.options[Sel.selectedIndex]=null;
Sel.selectedIndex = Num;
}
}
ora ho provato a fare la seguente funzione per aggiungere un valore, ma non 
funziona
function aggiungi(aForm,aSel) {
nAgg=prompt("Comprati/Venduti?","");
nuovo = new Option(document.aForm.nAgg.value);
document.aForm.aSel.options[document.aForm.aSel.length] = nuovo;
document.aForm.nAgg.value = "";
}

 document.aForm.aSel.options[document.aForm.aSel.length] = nuovo;
Se "aSel" è già un oggetto select, non devi impostare i precedenti
riferimenti (document.aForm); mentre se non lo è - come sospetto -, ma è
solo il "name", allora devi utilizzare la collection elements così come hai
fatto per la funzione che elimina l'option:
Se "aForm" è un "name" di una form:
with ( document.forms[aForm].elements[aSel] )
	options[options.length]=nuovo;
Se invece è un riferimento a oggetto form:
with ( aForm.elements[aSel] )
	options[options.length]=nuovo;
-- 
ZER0
~ The Tangent Universe collapsed 6032 days, 16 hours, 4 minutes and 11 seconds ago.
on air ~ "luca dirisio - usami"

praticamente aForm è il nome del Form che passo quando richiamo la funzone
e aSel è il nome della select...
ho provato facendo così
function aggiungi(aForm,aSel) {
nAgg=prompt("Comprati/Venduti?","");
nuovo = new Option(document.aForm.nAgg.value);
with ( document.forms[aForm].elements[aSel] )
options[options.length]=nuovo;
}
ma non funziona comunque.. 

 ma non funziona comunque..
Ricordati sempre che dire "non funziona" non è di alcun aiuto. E' troppo
generico, e non vuol dire nulla. Solitamente quando si è tentati di dire
che "non funziona" in verità si sta intendendo che "non mi restituisce il
risultato che mi aspetto".. ma un risultato lo fornisce quasi sempre.
Prova, in questi casi, a controllare la Javascript console dei browser
gecko based (Firefox, Mozilla, Netscape..) che ti segnala tutti questi
errori che portano al mancato "funzionamento" del codice; in modo da capire
che "risultato" ti ha generato.. anche se non era quello da te voluto.
In questo modo è più semplice, sia per te che per noi, identificare il
problema.
-- 
ZER0
~ .. six thousand and thirty five days, seven hours, thirty nine minutes, thirty nine seconds.
That is when the world ended.

grazie per tutti i suggerimenti...
ora ho provato con il tuo codice ma mi da questo errore
document.forms[...].elements è nullo o non è un oggetto
se dal tuo codice tolgo i document.forms e le parentesi da [nAgg]
mi aggiungere uno spazio vuoto alla select... ma non mi da alcun errore 

 mi aggiungere uno spazio vuoto alla select... 
In tal caso vorrebbe dire che, al contrario di quanto hai detto, aForm č
l'oggetto form e non una variabile stringa contenente il nome; e che esiste
un elemento chiamato "nAgg" all'interno dell'HTML.
In tal caso hai fatto un po' di confusione tra codice di markup e codice
Javascript.
Scrivi un post con il codice HTML della form in questione, cosě che si
possa fugare ogni dubbio.
-- 
ZER0
~ .. six thousand and thirty six days, two hours, thirty five minutes, fifty three seconds.


ahm.. allora
<form name="formname">
<TR class="t2">
<TD width=9%>
<select name="codice" size="1" multiple class="form" 
onContextMenu="modifica(this.form,
this.name
);">';
<option value="">'.$var[$i][0].'</option>
</select>
</TD
........
poi ho varie TD che si ripetono con nomi di select diverse 

</TD
<form>
<table>
<tr>
<td>
[...]
</table>
</form>
Perche':
<table>
<form>
<tr>
<td>
...
</form>
</table>
E' sbagliato, table non permette children di tipo form.
'bye

 </TD
Okay. Allora tu stai passando alla funzione (ma non si chiamava
"aggiungi"?), come primo parametro, il riferimento all'oggetto form stesso,
mentre passi il name della select.
Cosa, tra l'altro, che ha poco senso. Puoi direttamente passare il
riferimento della select e basta:
oncontextmenu="aggiungi(this)"
e poi all'interno della funzione fare qualcosa del genere:
function aggiungi (aSel){
	aSel.options[aSel.options.length]=new Option("some text");
}
Se ad esempio hai un campo nella stessa form della select di questo tipo:
<input type="text" value="default value" name="txtValue" />
e vuoi assegnare come testo della nuova option il valore di tale campo, ti
basta fare:
function (aSel){
	aSel.options[aSel.options.length]=new Option(aSel.form.txtValue.value);
}
Purtroppo dal codice che hai postato non č ben chiara la parte relativa al
"nAgg", quindi non sono potuto scendere nello specifico. Se vuoi chiarire
anche quella parte, vediamo di stilare un codice piů adatto al tuo caso.
-- 
ZER0
~ .. six thousand and thirty six days, eleven hours, twenty four minutes, twenty seven seconds.
That is when the world ended.
on air ~ "Metallica - Turn The Page"

hai ragione... scusa se nn ho postato il codice di nAgg..
vedo di spiegarmi una volta per tutte
<select name="vendita" class="form" 
onContextMenu="modifica(this.form,
this.name
);">';
function modifica(nForm,nSel) {
var annulla = window.confirm("Premere OK per aggiungere una nuova voce, 
ANNULLA per annullare il valore selezionato");
if (!annulla) {
elimina(nForm,nSel);
}
else {
aggiungi(nForm,nSel);
}
}
ho provato a non passare (this.form,
this.name
) e ho messo solo 
modifica(this) e ho tolto il nome del FORM, ma poi mi da errore.. "elements 
è nullo o non è un oggetto" perchè nella funzione elimina utilizzo il valore 
this.form che ho passato, come
puoi vedere dal seguente codice..
function elimina(eForm,eSel) {
var Sel = eForm.elements[eSel];
if(Sel.length > 0) {
Sel.options[Sel.selectedIndex]=null;
var Num = Sel.selectedIndex;
}
}
function aggiungi(aForm,aSel) {
nAgg=prompt("Comprati/Venduti?","");
aSel.options[aSel.options.length]=new Option(nAgg.value);
} 

ci sono riuscito.. con
function aggiungi(aForm,aSel) {
aNum=prompt("Comprati/Venduti?","");
aEur=prompt("Al prezzo di?","");
nuovo=new Option(aNum+' - '+aEur+'?');
with (aForm.elements[aSel])
options[options.length]=nuovo;
}
però mi scrive il valore dopo quelli che si sono già nella select...
se invece volessi scriverlo prima di tutti gli altri? 

 }
nAgg è una stringa, non un elemento. Quindi:
function aggiungi(sender){
	var szText=prompt("Comprati/Venduti?","");
	sender.options[sender.options.length]=new Option(szText);
}
Se hai qualche dubbio, fischia.
-- 
ZER0
~ .. six thousand and thirty seven days, four hours, fifty one minutes, thirty eight seconds.


 se invece volessi scriverlo prima di tutti gli altri?
Quello che abbiamo scritto fin'ora è codice che è valido anche per browser
vetusti come Netscape 4 e compagnia.
Per fare quello che vuoi fare tu, è preferibile usare le DOM API; però così
facendo escludi i succitati browser. Dipende se a te questa cosa interessa
o meno.
P.S.
Potresti anche fare un ciclo che ti "sposta" in basso tutti gli elementi,
così facendo manterresti la retrocompatibilità anche con i vecchi browser. 
A mio parere i browser che fanno uso delle DOM API sono a tutt'oggi i più
diffusi, e a meno che non vi sia qualche serio motivo per supportare a
livello di JS anche i browser più arcaici, puoi benissimo usare tali API.
-- 
ZER0
~ .. six thousand and thirty seven days, four hours, fifty six minutes, twenty two seconds.


perfetto ti ringrazio..
la dichiarazione var Num = Sel.selectedIndex;
l'avevo messa per far si che una volta cancellato il valore
selezionato mi visualizasse qualcosa... ma ora che ci penso
vorrei ke visualizzasse sempre una option che dovrebbe
essere per altro incancellabile... è possibile?
perchè ho fatto un ciclo che mi immette nella select, per ogni
option dei valori letti da un file di testo, e l'ultima option è la
somma di tutte le altre... e vorrei che questa ultima option
non si potesse cancellare, e che dopo aver cancellato una delle
option, mi rivisualizzasse l'ultima...
spero di essermi spiegato!!
ho provato con mettere come prima riga della funzione elimina
if (sender.selectedIndex == sender.options.length-1) break;
perchè se la mia select contiene 3 option... l'ultima avrà come valore 2
e quindi controllo se 2 = 3-1 mi fermo... ma mi da errore
"previsto oggetto".... ma dove? 

 "previsto oggetto".... ma dove?
Avevo lasciato "sel" invece di sostituire anch'esso con "sender", nelle
varie modifiche del codice.
-- 
ZER0
~ .. six thousand and thirty nine days, four hours, forty minutes, thirty seconds.
