Допустимо ли иметь два элемента ввода с одинаковым именем?


80

то есть:

<form 1>
<input type="hidden" name="url" value="1">
</form 1>

и

<form 2>
<input type="hidden" name="url" value="2">
</form 2>

Это разрешено и действительно?


Ответы:


61

Да, это действительно

Это хорошо

<form name="form1">
  <input type="hidden" name="url" value="1">
</form>

<form name="form2">
  <input type="hidden" name="url" value="2">
</form>

Это тоже нормально и обычно интерпретируется как массив значений, например {url: [1, 2]}, в зависимости от того, что делает ваш сервер. В кодировке URL это будет выглядеть так url=1&url=2.

<form name="form1">
  <input type="hidden" name="url" value="1">
  <input type="hidden" name="url" value="2">
</form>

28
Это действительно так. Это не создаст путаницы для языка на стороне сервера (даже PHP с его соглашениями для именования полей, которые имеют общее имя, будет последовательно и предсказуемо обрабатывать несколько входных данных, которые не используют это соглашение). Это не создаст путаницы для JavaScript (который представит элементы как коллекцию и не проигнорирует один из них). Это / может / создать путаницу для авторов, которые пишут код, не зная, что они делают, но это нормально по спецификации.
Квентин

@ Дэвид Дорвард: Спасибо за объяснение, я удалил эту часть.

14
Этот пост вводит в заблуждение. входы с одинаковыми именами одинаковой формы являются частью стандарта HTML - они используются, например, для флажков.
beldaz

1
Допустимо разместить несколько входов (скрытых или иных) с одним и тем же именем в одной форме. Более того, он весьма полезен при отправке структурированных списков или ассоциативных карт и часто намного чище (и менее хрупкий), чем хакерская сериализация DIY.
Candu

1
Я знаю, что это старый пост, но он требует уточнения. PHP требует, чтобы вы сообщили ему, что элементы формируют массив, например: <code> <input type = "hidden" name = "url []" value = ....... </code> Если вы этого не сделаете сделайте это, php возьмет последнее значение последнего поля и вставит его в массив формы для ключа «url».
Марк К.

12

Да.

Более того, это важно, если вы имеете дело с группами переключателей.


Точно. Или с помощью флажков, и в этом случае вы можете поместить [] в конец «url []», и это создаст массив, который нужно выбрать.
Керри Джонс

2
@Kerry - Это PHPизм. Большинство библиотек обработки форм вполне довольны отсутствием специальных имен для групп элементов управления.
Квентин

8

"Это не хорошо" правильно разбирается во всех известных мне браузерах; если в строке, закодированной для URL-адреса, появятся два URL-адреса, они будут рассматриваться как массив. Попробуйте это в JQuery:

$('<form name="form1">\
     <input type="hidden" name="url" value="1">\
     <input type="hidden" name="url" value="2">\
</form>').serialize()

и вы получите: "url=1&url=2"

хорошо написанный парсер строки запроса вернет такую ​​структуру json:

 {"url":["1", "2"]}

Это строго спецификация? Нет, но ни один из них не создает многострочную строку, экранируя EOL обратной косой чертой, как я сделал выше.


6

Да - каждый будет отправлять только свои формы.

Если у вас они в той же форме, один будет иметь приоритет над другим, и это недействительно.

РЕДАКТИРОВАТЬ: Как указал Махмудвкс, переопределение происходит только на некоторых языках (например, PHP), поскольку оно не присуще самому HTML.


12
Вы неправы. Если у вас есть несколько входов с одинаковым именем, один не переопределит другой. Все входные данные будут добавлены к телу запроса в том порядке, в котором они отображаются в HTML. И это действительно так: HTML-форма с несколькими скрытыми элементами управления с тем же именем
Mahmoodvcs

5
@Mahmoodvcs: Это не совсем так. Если форма отправляется в службу PHP, то выигрывает последнее значение. Если вы хотите, чтобы одному имени было присвоено несколько значений, каждое имя должно заканчиваться на '[]'.
Джефф Лоури,

6
Здесь мы говорим об HTML, а не о PHP.
Mahmoodvcs,

2
@yardpenalty - я не понимаю вашего вопроса (не уверен, ответит ли Джефф), но если вы сомневаетесь в возможностях PHP, это определенно верно (по крайней мере, до PHP7 - я не проверял, изменились ли они что еще)
Керри Джонс

Извините, я понял это. Если вы собираетесь обрабатывать с помощью php, вам необходимо создать массив имен. Я думаю, что это bootstrap, которому нужно, чтобы переключатели имели такое же имя или что-то в этом роде. В любом случае, да, вы можете.
yardpenalty.com


2

A) Ваш первый пример в порядке, потому что время отправки форм будет другим:

<form id="1">
    <input type="hidden" name="url" value="1">  
</form>
<form id="2">
    <input type="hidden" name="url" value="2">  
</form>

Б) Ваш второй пример тоже хорош, но не стандартная практика кодирования:

<form>
    <input type="hidden" name="url" value="1">  
    <input type="hidden" name="url" value="2">  
</form>

Код Java 2 извлекает оба значения:

Map<String,String[]> parmMap = requestObj.getParameterMap();   
String input1 = parmMap.get("url")[0];   
String input2 = parmMap.get("url")[1];
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.