2012-03-30 2 views
11

Ho notato che se si dispone di un paio di radio insieme, è necessario rendere identico l'attributo nome su tutte le radio affinché le radio funzionino come previsto:Attributi di input che possono avere lo stesso "nome"

<label for="a1"><input type="radio" name="a" id="a1" value="1">1</label> 
    <label for="a2"><input type="radio" name="a" id="a2" value="2">2</label> 
    <label for="a3"><input type="radio" name="a" id="a3" value="3">3</label> 
    <label for="a4"><input type="radio" name="a" id="a4" value="4">4</label> 

L'ingresso radio è l'unico tipo di ingresso in cui è possibile avere attributi di nome duplicati (e richiesto per farlo)? Se lo faccio su qualsiasi altro input, sarebbe considerato non valido dal browser, giusto?

Sto chiedendo questo perché ho bisogno di gestire questa situazione in uno script, e voglio sapere se ci sono altri tipi di input che dovrei prendere in considerazione quando si tratta di nomi multipli identici.

risposta

12

Dal punto di vista dell'interazione utente, gli elementi input:radio utilizzano lo stesso [name] in modo che il browser sappia consentire solo uno di essere :checked alla volta.

Da una prospettiva forma di presentazione, eventuali elementi possono avere lo stesso nome, saranno tutti serializzato nella stringa di query come definito nella HTML Spec

Ecco un paio di esempi:

<form action="/foo/bar"> 
    <input type="hidden" name="fizz" value="buzz" /> 
    <input type="radio" name="foo" value="bar" /> 
    <input type="radio" name="foo" value="baz" /> 
    <input type="submit" value="Go" /> 
</form> 

Inviando questo form (con il tasto bar della radio controllato) si tradurrà in una stringa di query:

?fizz=buzz&foo=bar 

Ho Wever, se si modifica il nome dell'elemento input:hidden a foo:

<form action="/foo/bar"> 
    <input type="hidden" name="foo" value="buzz" /> 
    <input type="radio" name="foo" value="bar" /> 
    <input type="radio" name="foo" value="baz" /> 
    <input type="submit" value="Go" /> 
</form> 

querystring sarà:

?foo=buzz&foo=bar 

Il server dovrebbe analizzare correttamente questo modo che si può ottenere sia buzz e bar valori, tuttavia ho riscontrato che alcune lingue sul lato server hanno stranezze quando si tratta di eseguire il parsing di stringhe di query.

PHP, in particolare, si trasformerà chiavi in ​​array se la chiave viene suffisso []:

?foo[]=buzz&foo[]=bar avrà $_GET['foo'] = array('buzz', 'bar');

9

è l'ingresso della radio l'unico tipo di ingresso dove si può avere nome duplicato attributi

No. Qualsiasi forma di controllo possono condividere un nome con qualsiasi altro controllo di modulo.

Questo è particolarmente utile per le caselle di controllo (consente di pronunciare "Seleziona un numero qualsiasi di questi" e quindi eseguire il loop sui risultati sul server senza dover codificare un nome diverso per ciascun elemento). ti permette di dire quale è stato cliccato senza ricorrere a tutti i possibili nomi).

(e necessario per farlo)?

Sì. Solo i pulsanti di opzione ricevono un comportamento speciale basato su nomi condivisi.

+0

lato server può avere un comportamento "speciale" per gli altri elementi che condividono lo stesso nome, in termini di come essi vengono analizzati/bound. Ovviamente non fa parte delle specifiche HTML e varia da framework a framework. – AaronLS

1

Bene, tecnicamente tutto ciò che conta è la stringa URL generata. Così si potrebbe teoricamente avere due bottoni di invio con lo stesso nome ...

1

no, sono esistono alcuni altri controlli con il nome DUP;)

2

E 'perfettamente valido per avere lo stesso valore per gli attributi nome su pagine.

Un fallback comune per le caselle di controllo è avere un ingresso nascosto con lo stesso nome con un valore impostato su false. Quando si utilizzano gli stessi valori del nome, assicurarsi di ricontrollare l'output previsto, normalmente l'ultimo valore da analizzare sovrascriverà qualsiasi parametro precedente con lo stesso nome.

Se avete bisogno di raggruppare vari campi con lo stesso nome si può effettivamente creare un array con più elementi, come ad esempio:

<input name="list[]" /> 
<input name="list[]" /> 
<input name="list[]" /> 
+0

stai attento anche ai rischi di sicurezza del campo nascosto! –

+2

Supponendo che l'ultimo valore vince e avere '[]' alla fine del nome è una * visione * molto incentrata su PHP dell'universo. – Quentin

+1

@AshokRaj quali tipi specifici di rischi per la sicurezza fanno nascere i campi nascosti che qualsiasi altro tipo di input non lo fa? – Dunhamzzz

0

alcuni nomi di elementi o attributi quando utilizzato più volte sono semplicemente ignorati dal parser HTML
Ad esempio se si utilizza più di un ID viene considerato solo il primo.

+0

Nota che stai parlando di 'id', che non dovresti duplicare per il motivo che hai menzionato. Comunque il 'nome' puoi avere multipli di. – AaronLS

1

Si può anche avere più ingressi nascosti con lo stesso nome. Come sottolineato, si tratta di come il framework del lato server li analizzerà. In .NET MVC il raccoglitore modello cercherà una raccolta con lo stesso nome nel parametro del metodo post-azione o una proprietà nel parametro del modello di visualizzazione dell'azione post. Come ad esempio List<int>, List<Guid>, o List<string>

Vedi come esempio: https://stackoverflow.com/a/2013915/84206