LINUX.ORG.RU

Запретить повторное отправление формы

 , ,


1

1

Есть простая форма:

<form method="get">
  <input type="text" name="email">
</form>

Так исторически сложилось в html, что при нажатии на Enter — она отправляется. Проблема в том, что Enter можно нажать много раз и хотелось бы после первого нажатия заблокировать возможность повторной отправки.

Если сделать:

<form onsubmit="email.disabled=true;">...</form>

то форма игнорирует disabled поля и она приходит пустой.

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

Ответ на: комментарий от t184256

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

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Это обработчик запросов фреймворка.

При этом у тебя форма, делающая POST на сервер по энтеру??????

Проще всего повесить в JS скрипт отправки формы на сервер, а в форме - вызов скрипта.

Если нужно сохранить совместимость с HTML без JS, внизу страницы скрипт, который заменяет обработчик формы.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Ну почему не меняет. Проблема в том, что после submit пользователя перенаправляет на страницу с результатами:

http://domain.com/admin/?email=requested@email

Проблема лишь в том, что если сделать disable — то email не будет отправлен на сервер.

conformist ★★★
() автор топика
Ответ на: комментарий от XoFfiCEr

Зачем? Форма ничего не меняет, интерактивность тут не нужна. Нужно лишь запретить ещё раз её отправить.

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Нужно лишь запретить ещё раз её отправить.

Как ты это собрался делать без JS? HTML такую хотелку не имеет (или я что-то пропустил?).

Как выше писал Shadow, юзай по Return вызов скрипта, а дальше дело техники…

white_bull
()
Последнее исправление: white_bull (всего исправлений: 1)
Ответ на: комментарий от white_bull

Я не говорил, что собрался делать это без js. Проблему полностью решает добавление кнопки:

<form method="get" onsubmit="btn.disabled=true;">
  <input type="text" name="email">
  <input type="submit" name="btn" value="Search">
</form>

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

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Вот и XoFfiCEr пишет - используй ajax.

Я предлагаю в конце страницы с формой сделать скрипт, подменяющий обработчик формы на ajax обработчик. IMHO, единственный простой и быстрый вариант.

Shadow ★★★★★
()

Добавь hidden поле, и при отправке проверяй его. Если пустое - шли форму и пиши туда что нибудь. Если не пустое - не шли.

skyman ★★★
()

Попробуй что-то вроде

<form onsubmit="event.target.onsubmit = (e) => e.preventDefault()">

ddidwyll ★★★★
()
Последнее исправление: ddidwyll (всего исправлений: 2)

В общем добавил кнопку, самое простое решение. Заодно теперь форму можно подтверждать кликом. Всем спасибо.

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Тебе уже сказали — запрети на сервере. Данным извне доверять нельзя. А все твои попытки накостылить касаются именно что внешней стороны.

deep-purple ★★★★★
()
Ответ на: комментарий от conformist

Давай адрес с формой, я тебе щас туда 10к кликов по форме оформлю, дружок.

deep-purple ★★★★★
()

ну повесь событие на enter.

if (!window.form_already_sent) {window.form_already_sent = true; send_form();}, нутыпонел

Ford_Focus ★★★★★
()
Последнее исправление: Ford_Focus (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.