HTML-форма с несколькими скрытыми элементами управления с тем же именем - PullRequest
47 голосов
/ 17 января 2009

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

Ответы [ 8 ]

36 голосов
/ 17 января 2009

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

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

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

26 голосов
/ 17 января 2009

Различные серверные технологии будут различаться. С помощью 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'] }
18 голосов
/ 17 января 2009

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

<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 ... В зависимости от серверного программного обеспечения, которое вы используете для разбора строки запроса, это может не работать.

5 голосов
/ 17 января 2009

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

<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 и CF все представляют значения в виде запятой разделенный список. Так что да, дублирующее наименование полностью допустимо.)

2 голосов
/ 08 июля 2016

Специально для 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>

Отправка формы приводит к следующему результату:

Array
(
[elem] => Array
    (
        ['name'] => Array
            (
                [0] => first
                [1] => second
                [2] => third
                [3] => fourth
            )
        ['type'] => Array
            (
                [0] => normal
                [1] => classic
                [2] => regular
                [3] => basic
            )
        ['size'] => Array
            (
                [0] => 4
                [1] => 7
                [2] => 3
                [3] => 6
            )
        ['temp'] => Array
            (
                [0] => triangle
                [1] => square
                [2] => hexagon
                [3] => circle
            )
    )
[sendtest] => Test
)

После просмотра этого результата я сделал больше тестов, ищущих лучшее расположение значений массива, и закончил этим (я покажу только новые скрытые входные данные):

    <input type="hidden" name="elem[0]['name']" value="first">
    <input type="hidden" name="elem[1]['name']" value="second">
    <input type="hidden" name="elem[2]['name']" value="third">
    <input type="hidden" name="elem[3]['name']" value="fourth">
    <input type="hidden" name="elem[0]['type']" value="normal">
    <input type="hidden" name="elem[1]['type']" value="classic">
    <input type="hidden" name="elem[2]['type']" value="regular">
    <input type="hidden" name="elem[3]['type']" value="basic">
    <input type="hidden" name="elem[0]['size']" value="4">
    <input type="hidden" name="elem[1]['size']" value="7">
    <input type="hidden" name="elem[2]['size']" value="3">
    <input type="hidden" name="elem[3]['size']" value="6">
    <input type="hidden" name="elem[0]['temp']" value="triangle">
    <input type="hidden" name="elem[1]['temp']" value="square">
    <input type="hidden" name="elem[2]['temp']" value="hexagon">
    <input type="hidden" name="elem[3]['temp']" value="circle">

получение этого результата после отправки формы:

Array
(
[elem] => Array
    (
        [0] => Array
            (
                ['name'] => first
                ['type'] => normal
                ['size'] => 4
                ['temp'] => triangle
            )
        [1] => Array
            (
                ['name'] => second
                ['type'] => classic
                ['size'] => 7
                ['temp'] => square
            )
        [2] => Array
            (
                ['name'] => third
                ['type'] => regular
                ['size'] => 3
                ['temp'] => hexagon
            )
        [3] => Array
            (
                ['name'] => fourth
                ['type'] => basic
                ['size'] => 6
                ['temp'] => circle
            )
    )
[sendtest] => Test
)

Надеюсь, это поможет некоторым.

2 голосов

* HTML5 1002 *

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

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

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

0 голосов
/ 08 мая 2017

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

0 голосов
/ 12 июля 2013

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

...