2012-03-30 15 views
11

Me di cuenta de que si tiene un par de radios juntas, se requiere que el nombre sea idéntico en todas para que las radios funcionen como se espera:Atributos de entrada que pueden tener el mismo "nombre"

<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> 

¿La entrada de radio es el único tipo de entrada donde puede tener atributos de nombre duplicados (y necesarios para hacerlo)? Si hago esto en cualquier otra entrada, el navegador lo considerará no válido, ¿verdad?

Pregunto esto porque necesito manejar esta situación en un script, y quiero saber si hay otros tipos de entrada que debería tener en cuenta cuando trato con nombres idénticos múltiples.

Respuesta

12

Desde una perspectiva de interacción del usuario, los elementos input:radio usan el mismo [name] para que el navegador sepa que solo permite que uno sea :checked a la vez.

Desde una perspectiva forma de presentación, los elementos pueden tener el mismo nombre, todos ellos serán serializado en la cadena de consulta como se define en el HTML Spec

Aquí hay un par de ejemplos:

<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> 

el envío de esta forma (con el botón de radio bar comprobado) dará lugar a una cadena de consulta de:

?fizz=buzz&foo=bar 

Ho Wever, si cambia el nombre del 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> 

La cadena de consulta será:

?foo=buzz&foo=bar 

El servidor debe analizar correctamente esta manera que se puede obtener tanto buzz y bar valores, sin embargo, he encontrado que algunos lenguajes del lado del servidor tienen peculiaridades cuando se trata de análisis de cadena de consulta.

PHP, en particular, a su vez, claves en matrices si la clave tiene el sufijo []:

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

9

es la entrada de radio el único tipo de entrada donde se puede tener los atributos de nombre duplicado

No. Cualquier forma de control puede compartir un nombre con cualquier otra forma de control.

Esto es particularmente útil para casillas de verificación (le permite decir "Escoja cualquier número de estos" y luego recorra los resultados en el servidor sin tener que codificar un nombre diferente para cada elemento) y envíe botones (le permite decir cuál fue cliqueado sin hacer un bucle sobre todos los nombres posibles).

(y necesarios para hacerlo)?

Sí. Solo los botones de radio obtienen un comportamiento especial basado en nombres compartidos.

+0

lado del servidor puede tener un comportamiento "especial" para otros elementos que comparten el mismo nombre, en términos de la forma en que se analizan/encuadernado. Por supuesto, eso no forma parte de las especificaciones de HTML y varía de un marco a otro. – AaronLS

1

Bueno, técnicamente todo lo que importa es la cadena URL generada. Por lo que podría, teóricamente, tiene dos botones de envío con el mismo nombre ...

1

no, algunos otros controles son existen con el nombre de la duplicación;)

2

Es perfectamente válido tener el mismo valor para los atributos de nombre en las páginas.

Una alternativa común para las casillas de verificación es tener una entrada oculta del mismo nombre con un valor establecido en false. Al usar los mismos valores de nombre, asegúrese de verificar dos veces la salida esperada, normalmente el último valor que se analizará sobrescribirá los parámetros anteriores con el mismo nombre.

Si necesita agrupar varios campos con el mismo nombre en realidad se puede crear una matriz con múltiples elementos, por ejemplo:

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

¡también tenga cuidado con el riesgo de seguridad de campo oculto! –

+2

Suponiendo que el último valor ganará y tener '[]' al final del nombre es una * muy * vista del universo centrada en PHP. – Quentin

+1

@AshokRaj ¿qué tipos específicos de riesgo de seguridad introducen los campos ocultos que cualquier otro tipo de entrada no ofrece? – Dunhamzzz

0

algunos nombres de elementos o atributos cuando se utilizan varias veces son simplemente ignorados por el analizador de HTML
Por ejemplo, si usa más de una identificación, solo se considera la primera.

+0

Tenga en cuenta que está hablando del 'id', del cual no debería tener duplicados por el motivo que ha mencionado. Sin embargo, el 'nombre' puede tener múltiples de. – AaronLS

1

También puede tener múltiples entradas ocultas del mismo nombre. Como se señaló, es una cuestión de cómo el marco del lado del servidor los analizará. En .NET MVC, el corrector de modelos buscará una colección del mismo nombre en el parámetro del método de acción posterior o una propiedad en el parámetro de modelo de vista de la acción de publicación. Tal como List<int>, List<Guid>, o List<string>

Ver como ejemplo: https://stackoverflow.com/a/2013915/84206

Cuestiones relacionadas