Чи дійсно мати два вхідні елементи з однаковим ім'ям?


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
Допустимо розміщувати кілька входів (прихованих чи інших) з однаковим іменем в одній формі. Більше того, це досить корисно при поданні структурованих списків або асоціативних карт, і часто набагато чистіше (і менш крихке), ніж шалена серіалізація "зроби сам".
candu

1
Я знаю, що це стара публікація, але тут слід пояснити. PHP вимагає, щоб ви повідомили, що елементи утворюють масив приблизно так: <code> <input type = "hidden" name = "url []" value = ....... </code> Якщо ви цього не зробите зробіть це, php прийме останнє значення останнього поля і підключить його до масиву форми для ключа "url".
Mark C.

12

Так.

Більше того, важливо мати справу з групами перемикачів.


Точно так. Або з прапорцями, і в цьому випадку ви можете поставити [] в кінці "url []", і це створює масив, який потрібно забрати.
Керрі Джонс,

2
@Kerry - це PHPism. Більшість бібліотек обробки форм дуже раді, що не мають спеціальних назв для груп елементів керування.
Квентін

8

"Це не добре" аналізує правильно в кожному браузері, про який я знаю; якщо дві 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

Так - кожен подає лише відповідні форми.

Якщо ви маєте їх у однаковій формі, одне замінить інше, і воно недійсне.

РЕДАКТУВАТИ: Як зазначає Mahmoodvcs, перевизначення відбувається лише в деяких мовах (наприклад, PHP), що не властиво самому HTML.


12
Ви неправі. Якщо у вас кілька входів з однаковим іменем, один не замінить інший. Усі вхідні дані будуть додані до тіла запиту в тому порядку, в якому вони відображаються в html. І це дійсно: форма HTML з декількома однойменними прихованими елементами управління
Mahmoodvcs

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

6
Тут мова йде про HTML, а не про PHP.
Mahmoodvcs

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

На жаль, я це зрозумів. Якщо ви збираєтесь обробляти за допомогою php, вам потрібно створити масив імен. Я думаю, що це завантажувальний ремінь, якому потрібні перемикачі, щоб мати те саме ім’я або щось інше. У будь-якому випадку, так, ви можете.
yardpenalty.com


2

А) Ваш перший приклад - це нормально, оскільки форми часу подання будуть різними:

<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 витягують обидва значення:

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.