Подтвердить что ты не робот

HTML-форма с несколькими скрытыми элементами управления с тем же именем

Является ли законным иметь HTML-форму с более чем одним "скрытым" элементом управления с тем же именем? Я ожидаю получить значения всех этих элементов на сервере. Если это законно, делают ли основные браузеры правильное поведение?

4b9b3361

Ответ 1

В браузерах все в порядке. Однако, как анализирует библиотека приложений, она может различаться.

Предполагается, что программы должны группировать идентично названные элементы вместе. Хотя спецификация HTML явно не говорит об этом, она неявно указывается в документации на флажках:

Несколько флажков в форме могут делиться одно и то же имя управления. Таким образом, для Например, флажки позволяют пользователям выберите несколько значений для одного и того же свойство.

Ответ 2

Различные серверные технологии будут отличаться. С помощью PHP вы можете использовать синтаксис стиля массива для имени, чтобы заставить коллекцию создавать на сервере. Если отправлено на сервер, $_POST['colors'] будет массивом с двумя значениями, #003366 и #00FFFF:

<input type="hidden" name="colors[]" value="#003366" />
<input type="hidden" name="colors[]" value="#00FFFF" />

Вообще говоря, вы захотите использовать стандартное имя без квадратных скобок. Большинство серверных технологий смогут анализировать полученные данные и предоставлять коллекцию некоторого типа. Node.js предоставляет полезные функции через querystring.parse:

const querystring = require('querystring')

querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] }

Ответ 3

Если у вас есть что-то вроде этого:

<input type="hidden" name="x" value="1" />
<input type="hidden" name="x" value="2" />
<input type="hidden" name="x" value="3" />

Строка запроса будет выглядеть как x=1&x=2&x=3... В зависимости от программного обеспечения сервера, которое вы используете для синтаксического анализа строки запроса, это может не сработать.

Ответ 4

Да, и большинство серверов приложений будут собирать соответствующие элементы и объединять их запятыми, чтобы такая форма была такой:

<html>
<form method="get" action="http://myhost.com/myscript/test.asp">
<input type="hidden" name="myHidden" value="1">
<input type="hidden" name="myHidden" value="2">
<input type="hidden" name="myHidden" value="3">
<input type="submit" value="Submit">
</form>
</html>

... будет преобразован в URL (в случае GET - POST будет работать точно так же), например:

http://myhost.com/myscript.asp?myHidden=1&myHidden=2&myHidden=3

... и будет представлен вам в следующем коде: (например, после чего-то вроде Response.Write(Request.QueryString("myHidden")):

1, 2, 3

Таким образом, чтобы получить значения, вам нужно просто разделить строку и получить к ним доступ в виде массива (или любого другого сопоставимого на выбранном вами языке).

(Следует уточнить: в PHP это немного отличается (как указывает Джонатан, нотация в скобках представляет элементы в виде массива в коде PHP), но ASP, ASP.NET и ColdFusion представляют значения в виде списка через запятую Так что да, дубликат именования полностью действителен.)

Ответ 5

HTML5

Ненормативный раздел 4.10.1.3 Настройка формы для связи с сервером явно говорит, что она действительна:

Несколько элементов управления могут иметь одно и то же имя; например, здесь мы присваиваем всем флажкам одно и то же имя, а сервер выделяет, какой флажок был проверен, видя, какие значения передаются с этим именем - например, переключатели, им также присваиваются уникальные значения с атрибутом value.

Нормативная версия этого просто заключается в том, что она не запрещена нигде, и алгоритм представления формы точно определяет, какой запрос должен быть сгенерирован:

Ответ 6

Специально для PHP я провел несколько тестов с именами массивов в скрытых входах и поделился здесь своими результатами:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Post Hidden 2D Arrays</title>
  </head>
  <body>
    <form name="formtest" method="POST" target="_self">
      <input type="hidden" name="elem['name'][]" value="first">
      <input type="hidden" name="elem['name'][]" value="second">
      <input type="hidden" name="elem['name'][]" value="third">
      <input type="hidden" name="elem['name'][]" value="fourth">
      <input type="hidden" name="elem['type'][]" value="normal">
      <input type="hidden" name="elem['type'][]" value="classic">
      <input type="hidden" name="elem['type'][]" value="regular">
      <input type="hidden" name="elem['type'][]" value="basic">
      <input type="hidden" name="elem['size'][]" value="4">
      <input type="hidden" name="elem['size'][]" value="7">
      <input type="hidden" name="elem['size'][]" value="3">
      <input type="hidden" name="elem['size'][]" value="6">
      <input type="hidden" name="elem['form'][]" value="triangle">
      <input type="hidden" name="elem['form'][]" value="square">
      <input type="hidden" name="elem['form'][]" value="hexagon">
      <input type="hidden" name="elem['form'][]" value="circle">
      <input type="submit" name="sendtest" value="Test">
    </form>
    <xmp>
<?php
    print_r($_POST);
?>
    </xmp>
  </body>
</html>

Ответ 7

Я считаю, что это законно, по крайней мере, в случае переключателей и флажков. Когда мне нужно динамически добавлять входные данные в XSLT, я даю им одно и то же имя; в ASP.NET, Request.Form [ "whatever_name" ] - это строка всех этих значений, разделенных запятыми.

Ответ 8

Я только что попытался использовать одно и то же имя управления, counties [] для нескольких входов SELECT, так что графства в Англии, Шотландии, Уэльсе и Ирландии в каждом из них передаются как значения для одного и того же параметра. PHP отлично справляется с этим, но HTML-валидатор дает предупреждение. Я не знаю, обрабатывали бы все браузеры таким же образом.