Newsgroup: it.comp.lang.javascript
Titolo: contare il numero di textbox

Ciao,
ho un form che viene creato dinamicamente, non so come quante input
text mi creerà perchè dipende dalla query che faccio, come faccio a
sapere il numero di tutte le input text che si chiamano con un certo
nome e poi un numero che è l'indice della query?
Ciao pippo



Domanda a)
Esiste getElementsByName ma purtroppo con IE è fallace (come del resto dice
la stessa Microsoft, vedi
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/getelementsbyname.asp
)
<ipotesi>
Hai una sola form
</ipotesi>
<tesi scritta al volo>
var tot=0;
for(var x=0;x<document.forms[0].elements.length;x++)
if(document.forms[0].elements[x].tagName=='input'&&document.forms[0].elements[x].name=='tuoname')
tot++;
alert(tot);
</tesi scritta al volo>
domanda b) Perché non lo metti come suffisso del name? (*NON* metterlo come
prefisso perché non può iniziare con un numero)
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

prefisso perché non può iniziare con un numero)
infatti lo metto come suffisso :-)

</ipotesi>
come mai???!
se come poi fai nello script comunque il nome del form lo specifichi
quindi dovrebbe funzionare anche se ce ne fossero di più?! 
a parte che comunque ho solo un form

 quindi dovrebbe funzionare anche se ce ne fossero di piů?! 
Sě, č vero, era solo per completezza (nel senso che se ne hai piů di una
non č detto che sia la prima). ho usato forms[0] e non forms['name'] perché
name non č accettato da xhtml 1.1 .
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

name non č accettato da xhtml 1.1 .
ma quindi c'č differenza tra scrivere document.forms[0]
document[nomeform] document.nomeform
????

 wrote:
non mi funge anche se poi mancherebbe un if che guarda il value però
già così non entra mai nell'if
function chkcod()
{
if (document.forminserimento.codice.value!='')
{
var tot=0;
for(var x=0;x<document.forminserimento.elements.length;x++)
 {
if(document.forminserimento.elements[x].tagName=='input'&&document.forminserimento.elements[x].name=='codice_esistente'+x)
   {
	alert(document.forminserimento.elements[x].value);
	tot++;
	alert(tot);
   }
  else
  {
  alert('Nessun Codice Esistente');
  }
 }	 
}
}
<form name="forminserimento" method="post"
enctype="multipart/form-data" onsubmit="return
checkForminsserimento();">
...
<input name="codice_esistente1" type="text"  size="3" maxlength="3"
value="001">
<input name="codice_esistente2" type="text" size="3" maxlength="3"
value="002">
<input name="codice_esistente3" type="text" size="3" maxlength="3"
value="003">
ecc
...
</form>

 Esiste getElementsByName ma purtroppo con IE è fallace 
E' fallace solo se scrivi del codice "equivoco".Io su IE non sono mai
andato incontro a questo tipo di incongruenze.
Non e' per difendere IE, tutt'altro. Solo che il getElementsByName e'
utilissimo in moltissimi casi, e' standard, ed il difetto da te segnalato
non e' a mio avviso un motivo valido per non usarlo; anche perche', ripeto,
si verificano incongruenze solo nel momento in cui si scrive "male" il
codice di markup.
-- 
ZER0://coder.gfxer.web-designer/
~ Non esistono donne brutte. Dipende solo da quanta vodka bevi.
(proverbio russo)
on air ~ "Green Day - Boulevard of Broken Dreams"

 name non č accettato da xhtml 1.1 .
E' sempre possibile estendere la DTD, del resto i browser continuano a
supportarlo, quindi e' un problema solo nella validazione.
-- 
ZER0://coder.gfxer.web-designer/
~ "Stiamo facendo un programma talmente innovativo che se ci guardiamo
indietro vediamo il futuro."


 document[nomeform] document.nomeform
Non a livello di codice, anche se personalmente preferisco passare sempre
dalla collection form se non ho un riferimento diretto (quindi escludo le
ultime due notazioni), che sia tramite indice o nome e' irrilevante.
Sono tutti modi per recuperare un riferimento ad un oggetto form. Il
risultato poi e' il medesimo.
Quello che cercava di dirti Cristiano, e' che nelle specifiche dell'XHTML
1.0 Strict / 1.1, l'attributo "name" nel tag "form" non e' piu' supportato,
quindi il tuo codice - a meno di non estendere la dtd - non sarebbe
validabile.
I browser, comunque, continuano ad interpretarlo.
-- 
ZER0://coder.gfxer.web-designer/
~ Non esistono donne brutte. Dipende solo da quanta vodka bevi.
(proverbio russo)
on air ~ "Green Day - Boulevard of Broken Dreams"

 value="003">
Se dai name diversi agli input, perdi l'utilita' che ti fornisce tale
attributo nel binding con javascript.
Quindi riscriverei il codice di markup:
<input name="codice_esistente" type="text"  size="3" maxlength="3"
value="001">
<input name="codice_esistente" type="text"  size="3" maxlength="3"
value="002">
<input name="codice_esistente" type="text"  size="3" maxlength="3"
value="003">
Poi, se vuoi usare getElementsByName, puoi sapere il numero degli elementi
semplicemente recuperando la collection:
alert(document.getElementsByName("codice_esistente").length);
anche senza avere il riferimento della form.
Altrimenti, col riferimento form:
alert(document.forms["forminserimento"].codice_esistente.length);
Ovviamente entrambi i metodi ti restituiscono una lista degli oggetti con
tale name, quindi puoi non solo recuperarne la lunghezza, ma anche fare un
ciclo per eseguire operazioni sugli stessi.
-- 
ZER0://coder.gfxer.web-designer/
~ Il computer e' una macchina progettata per velocizzare e automatizzare
gli errori.
on air ~ "raf in tutti i miei giorni"


Ma se poi voglio confrontare il value come lo identifico la input se
hanno tutte lo stesso nome?!
Ciao pippo

 a meno di non estendere la dtd
Se scopri come fare ad estenderla e validarla fammi sapere (sarebbe
eccezionale), io dopo 2 settimane di colloqui non proprio simpatici col
creatore ci ho rinunciato: o valida l'xhtml, o valida l'estensione. Non ho
trovato un modo per validarli entrambi.
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 hanno tutte lo stesso nome?!
Come ho scritto nel post precedente:
"Ovviamente entrambi i metodi ti restituiscono una lista degli oggetti con
tale name, quindi puoi non solo recuperarne la lunghezza, ma anche fare un
ciclo per eseguire operazioni sugli stessi."
Il che significa che le due istruzioni:
document.getElementsByName("codice_esistente")
e
document.forms["forminserimento"].codice_esistente
Ti restituiscono una lista degli oggetti aventi quel nome. Quindi se vuoi
accedere al primo elemento chiamato codice_esistente, ti bastera' ottenere
la lista:
var listaOggetti=document.getElementsByName("codice_esistente");
oppure
var listaOggetti=document.forms["forminserimento"].codice_esistente;
e poi accedervi tramite indice:
alert(listaOggetti[0].value) /* visualizzo il value del PRIMO elemento */
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 3 hours, 6 minutes and 43 seconds ago.

 andato incontro a questo tipo di incongruenze.
Beh, Microsoft dice che restituisce sia name che ID, e per me questo è già
quantomeno fuorviante.
Ma dalle prove che avevo fatto (non ricordo se IE6sp1 o inferiore) se non
trovava nulla cercava name o id "simili" (ossia se non esisteva un
name="piccolo" ma esisteva un name="picco" restituiva quest'ultimo...).
Io da allora lo ho evitato come la peste (e come 'sta influenza che sta
girando in 'sti giorni!)


 eccezionale),
Se n'era gia' parlato di questo, vatti a ripescare i post relativi :)
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 3 hours, 52 minutes and 53 seconds ago.

 Se n'era gia' parlato di questo, vatti a ripescare i post relativi :)
Non mi risulta si siano trovate soluzioni ad estendere la dtd; ricordo di
xsl o simili, ma nulla. Io ero arrivato a questo (spero sia corretto, č
l'ultimo che mi ero salvato)
  <!ENTITY % html4 system 
     "
http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd
"
     >
%html4;
  <!ATTLIST a obbligo  CDATA  #IMPLIED>
  <!ATTLIST body scrollbar-face-color CDATA #IMPLIED>
In questo modo l'attributo obbligo veniva validato nel tag a, ma in
compenso non controllava piů l'xhtml...
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 girando in 'sti giorni!)
Ti ripeto,allora che fai smetti di usare anche getElementById?
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 4 hours and 17 seconds ago.

 Non mi risulta si siano trovate soluzioni ad estendere la dtd; 
Rileggi, rileggi. Io ti avevo detto che conservavo "gelosamente" un metodo
per rendere estendere la DTD in un certo modo (in realta' erano due i
metodi), e che avevo anche scritto a Zeldman per avere una sua opinione in
merito ma non avendo ricevuto risposta me li son tenuti per me.
E se non ricordo male tali approcci non ti sarebbero comunque serviti per
quello che specificatamente volevi fare tu all'epoca; c'e' un post sul
quale se ne e' parlato lo ricordo benissimo. Per questo ti ho detto di
ricercartelo.
Cio' non toglie che io con questi estendo la DTD, e se voglio che il tag
input abbia l'attributo "onvalidate" glielo aggiungo.
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 4 hours, 7 minutes and 9 seconds ago.

 input abbia l'attributo "onvalidate" glielo aggiungo.
'mbč, getti l'amo e poi ritiri la lenza? Sei una bellissima fanciulla che
ci prova in tutti i modi ma al momento buono scappa? :-)
Io ci ho rinunciato (e non ho piů tempo sinceramente adesso, ci avevo
ritagliato qualche giorno tempo fa), se pubblicherai la soluzione fammi
sapere.


 Ti ripeto,allora che fai smetti di usare anche getElementById?
Non penso getElementById abbia il comportamento "se non trovi id='picco'
restituiscimi 'piccolo'...per name=id invece concordo con te (anche se non
comunque corretta la restituzione). Io lo avevo mollato per il secondo
problema, non per il primo.
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 restituiscimi 'piccolo'...
Dovrebbe averlo nelle versioni di IE dove anche il getElementsByName ne
soffre, dato che alla fine utilizzano la stessa "sorgente".
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 4 hours, 49 minutes and 1 seconds ago.

 ci prova in tutti i modi ma al momento buono scappa? :-)
No, ti ho detto semplicemente che ricordo di averne gia' parlato con te in
questa sede, e che ricordo anche che nel post in questione c'erano le
motivazioni per le quali non ti sarebbe andata bene la mie soluzione; ergo
ti ho spronato a cercare tale post, se ti interessa, perche' io non ricordo
chiaramente quali fossero le succitate motivazioni :)
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 4 hours, 50 minutes and 47 seconds ago.

 chiaramente quali fossero le succitate motivazioni :)
No, mi hai detto che hai trovato un paio di hack ma non hai dato
motivazioni (e non li hai postati).
Comunque mi ero sbagliato io: alla fin fine la dtd "proprietaria" sembra
funzionare, solo che il w3 non la valida!
http://makeashorterlink.com/?V27612F4A


 soffre, dato che alla fine utilizzano la stessa "sorgente".
Mi sembra strano che IE5 abbia questo problema...alla prima occasione
verifico. Altrimenti vedrò di invertire la GetRef (attualmente prima
verifica getElementById, poi document.all => li inverto e ciao ciao IE).


 verifica getElementById, poi document.all => li inverto e ciao ciao IE).
Ingenuo. :) 
Dove pensi che i due metodi in questione vadano a pescare i dati?
Sono dei wrapper della document.all; e' per questo che "soffrono" delle
problematiche name/id: perche' la collection all non fa distinzione tra i
due.
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 5 hours, 27 minutes and 2 seconds ago.

 Ingenuo. :) 
Eh, mi č venuto in mente 1 secondo dopo aver postato che probabilmente
erano la stessa cosa...ma sai, Tommaso insegna, proverņ.


 erano la stessa cosa...ma sai, Tommaso insegna, proverņ.
Sul fatto che la sorgente e' la stessa, e' fuori questione.. prova pure
quanto vuoi, test e reference dicono chiaramente che document.all accetta
name e id senza fare distinzioni.
Sul fatto che document.getElementById possa soffrire dei medesimi bug di
getElementsByName laddove getElementsByName ne ha qualcuno, dovrebbe essere
cosi' dato rimappano la stessa sorgente (e quindi il bug ce l'ha in quel
caso, document.all).
Ma come vedi, sia in questo che nell'altro post ho usato il condizionale;
perche' e' da una vita che non ho piu' a che fare con i vecchi IE
direttamente, e non ho mai scritto codice che potesse generare questo tipo
di fraintendimenti. Quindi, se verifichi tu mi eviti la fatica di
verificare da me :) Mi raccomando, fai i test sia con
document.getElementById, document.getElementsByName e document.all.
-- 
ZER0
~ The Tangent Universe collapsed 5930 days, 5 hours, 42 minutes and 36 seconds ago.