Newsgroup: it.comp.lang.javascript
Titolo: id e name

Ciao,
negli script js è molto usato il metodo getElementById, per cui sui
controlli html faccio attenzione a specificare la proprietà ID.
Siccome sto usando qualche metodo ajax (prototype) che fa rimerimento alla
proprietà name, mi tocca specificare per tutti i controlli anche il name.
Non c'è una soluzione per specificare una sola volta l'identificativo di un
controllo e che valga come id e name?

 controllo e che valga come id e name?
Innanzitutto vi è una differenza importante: id è e deve essere univoco
nella pagina, mentre name no.
A parte questo no, non vi è un metodo universale per recuperare O uno O
l'altro, puoi farti una function che usa getElementById e, se null,
recupera col name.
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 recupera col name.
così al volo (non testata):
function getElementByAll(tuoid) {
 return document.getElementById(tuoid) ||
(document.getElementsByName(tuoid) &&
document.getElementsByName(tuoid).length>0 ?
document.getElementsByName(tuoid)[0]: null);
}
-- 
"La realtà è un'illusione causata dall'assenza di alcool."
									      A.

 controllo e che valga come id e name?
IE lo fa da sé. :) Ma attenzione, la mia frase è ironica, in quanto
quello che fa IE è dichiaratamente un bug. ID e NAME sono del tutto
diversi, non sono interscambiabili. Innanzitutto l'attributo "NAME"
non è valido su ogni elemento, a differenza dell'ID. Solo pochi tag
lo supportano. Inoltre l'ID deve essere univoco, mentre il NAME no.
Quest'ultimo è difatti molto usato laddove si devono gestire gruppi
di elementi. Ad esempio:
<input type="text" id="txt-name" name="txtField" value="Name" />
<input type="text" id="txt-surname" name="txtField" value="Surname" />
Se volessi "azzerare" il valore dei due elementi, con l'ID dovrei:
	var a = document.getElementById("txt-name"),
	    b = document.getElementById("txt-surname");
	a.value = b.value = "";
Mentre con il NAME:
	var els = document.getElementsByName("txtField");
	for (var i=0;i<els.length;i++)
		els[i].value = "";
Con quest'ultimo approccio, hai il vantaggio di non dover sapere il
numero di elementi a priori, né il loro eventuale ID.
Data questa loro diversità, non puoi usarli per i medesimi scopi, e
quindi tanto meno avere un attributo che possa valere per entrambi.
-- 
~ "When you have eliminated the impossible, whatever remains, however
improbable, must be the truth." (S.H.)

 ha scritto nel messaggio
news:w8m5x5u0llhd$.dlg@ID-171124.news.individual.net...


 id?
for(var i=0,obj=tuaform.elements;i<obj.length;i++)
 if(obj[i].id&&obj[i].length>0)
  obj[i].name=obj[i].id;
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 In tal caso basta modificarlo ...
Sta parlando "di" prototype, ovvero il framework (da evitare come la
peste bubbonica, IMVHO).
-- 
~ "Il giusto altro non č che l'utile del piů forte."
(Trasimaco)

 capito) perchè non distinguerebbe più controlli con lo stesso nome.
Nono, la cosa è correttissima. Difatti il "name" nel campi form viene
utilizzato per identificare i campi da inviare al server. Se al posto
del "name" utilizzassi l'"id", vedresti come durante il submit nessun
dato sarebbe inviato alla cgi in questione.
E' quindi corretto che una procedura di serializzazione Form tenga in
considerazione il name, piuttosto che l'id. Ed in presenza di più tag
con medesimo name, si comporterà come il client presumo, gestendoli a
mo' di array.
A mio avviso, è errato l'uso che tu fai dell'ID su tali elementi, non
l'uso che fa prototype del name per la serializzazione delle form, in
quanto si comporta esattamente come il browser.
 
-- 
~ "Viviamo dei vuoti lasciati da qualcun'altro."

 ha scritto nel messaggio
news:1kjp9dst...@ID-171124.news.individual.net...


 ma perchè dici di evitare il framework prototype?  
Recuperando ciò che è già stato scritto da altri:
http://www.javascripttoolbox.com/bestpractices/#prototype
Personalmente, soprattutto per gli ultimi tre motivi.
-- 
~ "Quando ti rifiuti di imparare una lezione in un modo,
ti verrà ripresentata sotto un altro aspetto." (E.Caddy)

 sottoscritto e firmato.
Stavo giusto per fare un post "Prototype o jQuery?"
Mi pare che mi abbiate risposto. :)
A meno che anche jQuery... :)
Bye.

 A meno che anche jQuery... :)
Tra le due, sicuramente jQuery.. Premesso che non ho mai utilizzato né
l'una né l'altra; ma discutevo recentemente con lo Scartabelli di come
alcuni degli approcci di jQuery sono molto simili a del codice scritto
qualche anno fa da me per la gestione dei CSS (che in verità avevo del
tutto abbandonato, in quanto mi sembrava un metodo "barbaro").
So che recentemente è anche uscita una nuova versione di jQuery; molto
documentata, tra le altre cose. E hanno reso più veloci alcune query..
Anche se da alcuni benchmark che ho fatto, è parecchio lento su PC non
"ninja" e su query di un certo tipo (tanto da "congelare" il browser).
Non mi piace che la sintassi CSS non sia stata del tutto rispettata, e
almeno sulla vecchia versione in IE c'erano dei memory leak.
-- 
~ "The demo effect, you don't expect"

 almeno sulla vecchia versione in IE c'erano dei memory leak.
Puoi approfondire, soprattutto la parte sui css?
Grazie.

 Puoi approfondire, soprattutto la parte sui css?
Un esempio che ho visto: per gli attributi usa la sintassi XPath e non
quella dei CSS. E non supporta tutti i selettori sui nodi, e le pseudo
classi dei CSS3. E' vero che supporta anche la sintassi XPath, ma sono
sono dell'idea che meglio avere una cosa fatta a modino, piuttosto che
due o tre fatte decentemente.
-- 
~ Ci siamo fatti una scopata cosi' eccezionale che anche i vicini
hanno fumato una sigaretta.