Чому форми з одним полем введення подаються при натисканні клавіші Enter у введенні


77

Чому так, що <form>з одним <input>полем перезавантажує форму, коли користувач вводить значення і натискає Enter, а це не так, якщо в полі є 2 або більше полів <form>?.

Я написав просту сторінку, щоб перевірити це дивацтво.

Якщо ви введете значення у другій формі та натиснете Enter, ви побачите, що воно перезавантажує сторінку, що передає введене значення, ніби ви телефонували GET. чому? і як мені цього уникнути?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>testFormEnter</title>
</head>
<body>
<form>
  <input type="text" name="partid2" id="partid2" />
  <input type="text" name="partdesc" id="partdesc"  />
</form>
  <p>2 field form works fine</p>
<form>
<input type="text" name="partid" id="partid"  />
</form>
<p>One field form reloads page when you press the Enter key why</p>
</body>
</html>

Відповіді:


52

Це маловідома "Примха", яка вийшла вже деякий час. Я знаю, що деякі люди вирішували це різними способами.

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

Слід зазначити, що найчастіше я чую про цю проблему саме з IE, а не з FireFox чи іншими. Хоча, здається, це впливає і на них.


2
Дякую, хотілося б, щоб це десь було задокументовано. Я витрачав години на налагодження великої сторінки, думаючи, що це щось інше, прив'язане до мого ajax. Я виявив "химерність" лише після того, як витягнув код і почав видаляти рядок за рядком. Яка втрата часу!
sdfor 02

2
І ви маєте рацію, це легко виправити за допомогою прихованого поля. До речі, якщо впливає на firefox 3.5.2. Можливо, це вважається особливістю.
sdfor 02

Ах так, я відчуваю твій біль .... саме так я про це дізнався, скажімо, 5-6 років тому ...
Мітчел Селлерс 02

2
Також я виявив, що приховане поле не завжди працює. На одній сторінці так, а на іншій - теж дивно. але приховування поля за допомогою javascript зробило свою справу. Вам потрібно написати статтю "Речі, про які ви не знаєте, що з'їдять ваш час" - ще раз спасибі
sd для 02

3
Я налагоджую в Chrome, і сховане поле, здається, не працює.
Кріс,

49

Це відома помилка в IE6 / 7/8 . Не схоже, що ви отримаєте це виправлення.

Найкраще обхідне рішення, яке ви можете зробити для цього, - це додати ще одне приховане поле (якщо це дозволяє ваша інженерна совість). IE більше не подаватиме форму автоматично, коли виявить, що у формі є два поля типу вводу.

Оновлення

Якщо вам було цікаво, чому це так, цей самоцвіт виходить прямо із специфікації HTML 2.0 (Розділ 8.2) :

Якщо у формі є лише одне однорядкове поле введення тексту, агент користувача повинен прийняти Enter у цьому полі як запит на подання форми.


1
Це також трапляється у Firefox 3.5
cssmaniac

1
Провів години налагодження цього в Chrome. Дякуємо, що вказали, що це прийшло зі специфікації.
JM Yang

У той момент, коли ви, розробник із назвою, маєте «проект, RTFM», який видав w3org, оскільки ви не уважно прочитали документ.
Натан,

Якщо це була помилка, то лише тому, що IE застряг на впровадженні HTML 2 вже давно минувши за часом продажу. У розділі ви знайшли вже давно застарів на той час ви написали свою відповідь: HTML 2.0 вийшов в 1995 році, який був замінений HTML 3.2 в 1997 році стандарт випадає диктуючи , як браузери повинні обробляти дані форми . HTML 4.0 (1999) просто говорить про активацію кнопки подання з точки зору прикладу подання форми ( наприклад, == наприклад).
Мартін Пітерс

1
Нарешті, HTML 5, опублікований у 2012 році (тобто через 3 роки після вашої відповіді), додав поняття неявного надсилання форми , кодифікуючи те, що браузери робили весь час: подаючи форму, коли користувач натискає клавішу введення в однорядкове текстове поле.
Мартін Пітерс

8

Ні, поведінка за замовчуванням полягає в тому, що при введенні подається останнє введення у формі. Якщо ви взагалі не хочете подавати заявку, можете додати:

<form onsubmit="return false;">

Або у вашому введенні

<input ... onkeypress="return event.keyCode != 13;">

Звичайно, є більш гарні рішення, але вони простіші, без будь-якої бібліотеки чи фреймворку.


Я щойно натрапив на цю проблему для своїх веб-сайтів. Мені здається, що остання версія chrome тепер реалізує W # SEC8.2, який порушив деякі функції веб-сайтів, які я розробляю.
Девід

7

Натискання клавіші Enter працює по-різному, залежно від (а) кількості полів та (б) кількості кнопок подання. Він може нічого не робити, він може надіслати форму без жодної кнопки "успішного" надсилання, або може зробити вигляд, що натиснуто першу кнопку надсилання (навіть генеруючи натискання для неї!), І подати із значенням цієї кнопки.

Наприклад, якщо ви додасте форму input type="submit"до двох полів, ви помітите, що вона надсилається.

Це давня химерність браузера, що сягає, принаймні, раннього Netscape (можливо, і далі), який навряд чи буде змінено зараз.

<форма>

Недійсний без "дії". Якщо ви не збираєтеся подавати де-небудь, і вам не потрібна групування назв перемикачів, ви можете просто опустити елемент форми.


дякую, хороша відповідь. Хоча мені потрібна форма для серіалізації полів для Ajax. Я міг би кодувати його вручну, але для багатьох форм це було б боляче.
sdfor

7

Ось код, який я використовував для вирішення проблеми:

<form>
<input type="text" name="partid" id="partid"  />
<input type="text" name="StackOverflow1370021" value="Fix IE bug" style="{display:none}" />
</form>

3

Це не перезавантаження сторінки як такої, це подання форми.

Однак у цьому прикладі, оскільки у вас немає атрибуту дії у формі, яку вона подає сама, що створює враження перезавантаження сторінки.

Крім того, я не можу докорити поведінку, яку ви описуєте. Якщо я перебуваю у будь-якому текстовому введенні у формі і натискаю Enter, він подає форму, незалежно від того, де у формі знаходиться вхід або скільки входів.

Можливо, ви захочете спробувати це ще в різних браузерах.


Ви маєте рацію, що я вживав не потрібні слова. Він подає форму, і оскільки я не вказую дії, вона за замовчуванням визначає себе. Я скопіював точний HTML і запустив його в IE8 та Firefox 3.5.2. Клавіша Enter у перших 2 полях, які знаходяться в першій формі, не подає форму, тоді як клавіша Enter у третьому полі подає.
sdfor 02

2

як вже сказав vineet, це коріняться в специфікації html 2.0:

ось як запобігти цьому, не псуючи свої URL-адреси:

<form>
    <input type="text" name="partid" id="partid"  />
    <input type="text" style="display: none;" />
</form>

1

Дякуємо всім, хто відповів. Відкриває око, що форма з одним полем діє по-різному, ніж форма з багатьма полями.

Іншим способом боротьби з цим автоматичним надсиланням є кодування функції подання, яка повертає false.

У моєму випадку у мене була кнопка з подією onclick, тому я перемістив виклик функції із доданим returnключовим словом до події onsubmit. Якщо функція, що викликається, повертає false, подання не відбудеться.

<form onsubmit="return ajaxMagic()">
<input type="text" name="partid" id="partid"  />
<input type="submit" value="Find Part" />
</form

function ajaxMagic() {
  ...
  return (false);
}

1

Рішення, яке я знайшов для всіх перевірених браузерів (IE, FF, Chrome, Safari, Opera), полягає в тому, що перший вхідний type=submitелемент у формі повинен бути видимим і бути першим елементом у формі. Я зміг використати розміщення CSS для переміщення кнопки надсилання внизу сторінки, і це не вплинуло на результати!

<form id="form" action="/">
<input type="submit" value="ensures-the-enter-key-submits-the-form"
                      style="width:1px;height:1px;position:fixed;bottom:1px;"/>
<div id="header" class="header"></div>
<div id="feedbackMessages" class="feedbackPanel"></div>
     ...... lots of other input tags, etc...
</form>

0

Ця проблема виникає як в IE, так і в Chrome. Це не відбувається у Firefox. Простим рішенням було б додати наступний атрибут до тегу форми: onsubmit = "return false"

Це, звичайно, припускаючи, що ви подаєте форму за допомогою об’єкта XMLHttpRequest.


0

Так, форма з одним полем inputText працює так, як у HTML 4.
onSubmit return false не працює для мене, але помилка виправлення нижче працює нормально

<!--Fix  IE6/7/8 and  HTML 4 bug -->
    <input style="display:none;" type="text" name="StackOverflow1370021" value="Fix IE bug" />

0

Я вирішив це за допомогою наступного коду, але я не впевнений, що це хороший підхід. Шукаючи поля введення у заданій формі і якщо 1 перешкоджає дії за замовчуванням.

 if($j("form#your-form input[type='text']").length == 1) {
   $j(this).bind("keypress", function(event) {
     if(event.which == 13) {
       event.preventDefault();
     }
   });
 }

-1

Я думаю, що це особливість, яку я теж відключив. Не потрібно докладати великих зусиль, щоб вимкнути його. Просто захопіть клавішу введення, проігноруйте це, буде робити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.