Newsgroup: it.comp.lang.javascript
Titolo: Modifica campi di un form in tempo reale...

Domanda da un milione di euri:
è possibile modificare il numero di campi di una form in tempo reale?
Mi spiego meglio:
supponiamo che abbia una determinata form con i soliti campi nome, cognome
ecc da inserire e poi un certo numero di campi uguali (ad esempio... chessò,
supponiamo che ci sia una voce "hobby" e che io voglia un campo distinto per
ogni hobby immesso dall'utente, ogni campo avrà id= hobby1, hobby2 ecc...).
Posso supporre di metterne ad esempio tre di default ma se l'utente ne vuole
inserire 4 dovrebbe avere un pulsantino "+" che aggiunge il campo "hobby4"
alla form (tenendo invariato i contenuti già immessi)
Come si può fare?
Grazie mille
--
S.

Qualcosa del genere può fare al caso tuo:
<html>
<head>
<script language="javascript">
i=0;
function addField(num)
{
	document.forms[0].innerHTML = document.forms[0].innerHTML + "<input
type='text' name='hobby"+num+"'/>";
}
</script>
</head>
<body>
<form name="laform">
<input type="text" name="cognome"/>
<input type="text" name="nome"/>
</form>
<button onclick="addField(i++);">+</button>
</body>
</html>
Ciao
Lorenzo

 type='text' name='hobby"+num+"'/>";
E sei sicuro che poi questo input aggiunto funzioni come normale input?
Secondo me con IE non viene associato alla form e non viene inviato...
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

Secondo me con IE non viene associato alla form e non viene inviato...
Provato con client un IE6.0SP1, mentre lato server un IIS e pagina ASP
di prova.
Risultato: funziona perfettamente.
Ciao
Lorenzo

 Risultato: funziona perfettamente.
:-O
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.





Si, ma rimane un po' una "tepppistata". Con quel codice fai fare la
serializzazione degli elementi HTML contenuti nella form, ci aggiungi del
testo alla stringa così ottenuta, e poi gli fai fare di nuovo il parse di
*tutti* gli elementi HTML presenti; non "aggiungi" solamente il nuovo campo
di input: riscrivi tutto da capo.
-- 
ZER0 
~ "Sai che ogni volta che vedo un tramonto mi girano i coglioni perché
è passato un'altro giorno."

 Come si puņ fare?
Un esempio al volo:
<form>
	<input type="text" name="hobby" value="" style="display:block"/>
	<input type="button" value="add" onclick="addHobby()" />
<form>
<script type="text/javascript">
	function addHobby(){
		var hobbies=document.getElementsByName("hobby"),
			node=hobbies[hobbies.length-1],
			dolly=node.cloneNode(true);
 
		dolly.value="<default value>";
 
		node.parentNode.insertBefore(dolly,node.nextSibling);
		dolly=null;
		node=null;
	}
</script>
-- 
ZER0 
~ "La prova che l'universo ha deciso di ignorarti e' quando non ricevi piu'
e-mail neppure dagli spammer."

 di input: riscrivi tutto da capo.
Il contesto rimane sempre la "form", ovviamente. Quindi mi riferisco a
tutti gli elementi all'interno della form, quando mi riferisco a quelli
"presenti" e quelli "riscritti".
-- 
ZER0 
~ "Compiere l'impossibile e' impresa che risiede nel cuore degli uomini"
(Mariners and generals)

>                node.parentNode.insertBefore(d­olly,node.nextSibling);
Perfettamente daccordo con te, la tua soluzione è migliore.
Non ho suggerito questo, solo perchè non so se
il metodo insertBefore sia largamente supportato.
Ciao
Lorenzo

 il metodo insertBefore sia largamente supportato.
Non fraintendere, al posto di insertBefore potevo usare anche appendChild,
ottenendo esattamente l'output che avresti ottenuto tu con l'approccio
"innerHTML". Ho usato insertBefore solamente per posizionare il nuovo campo
creato nel punto che preferivo.
Per rispondere alla domanda, insertBefore è supportato dai browser che
supportano le DOM API, e quindi quelli che hanno metodi come getElementById
e appendChild per intenderci.
-- 
ZER0 
~ Un computer e' fondamentalmente stupido.
Non fa cio' che vuoi che faccia, ma cio' che gli dici di fare.
Solo, e' uno stupido dannatamente veloce.