Обойти обязательный атрибут HTML при отправке

Я использую required для первой проверки перед отправкой формы.

<form action="myform.php">
  Foo: <input type="text" name="someField" required="required">
  <input type="submit" value="submit">
  <input type="submit" value="ignore">
</form>

Проблема в том, что у меня есть кнопка «игнорировать», которая также отправляет форму, а внутренняя логика затем устанавливает правильное состояние в БД. В этом случае (игнорировать) проверка не требуется (потому что нет необходимости заполнять поле «Foo»).

Как лучше всего справиться с двумя сценариями?

  1. Я знаю, что могу отказаться от «требуется» и выполнить проверку где-нибудь еще (backend / JavaScript). Ищу способ сохранить «необходимое».
  2. Я мог бы использовать Js onclick для сценария кнопки игнорирования и удалить атрибут непосредственно перед отправкой формы (https://stackoverflow.com/a/13951500/356726).

Но на самом деле ищу что-то умнее ....

--- Редактировать ---

Да, дубликат обязательного атрибута HTML5


person Horst Walter    schedule 10.09.2013    source источник
comment
№2, вероятно, будет лучшим выбором. Это или выполнить проверку на стороне сервера полностью, а не с обязательным атрибутом, минуя проверку, если использовалось игнорирование отправки, а не отправка отправки.   -  person Kevin B    schedule 10.09.2013
comment
# 2 для меня тоже имеет смысл.   -  person andi    schedule 10.09.2013
comment
Да, я пропустил это   -  person Horst Walter    schedule 11.09.2013
comment
Во втором случае просто $('form').clone().find(':required').prop('required', false).closest('form').submit();, а исходный form останется нетронутым. Никогда не пробовал закодировать одну строчку, это просто для того, чтобы дать вам представление.   -  person SubjectDelta    schedule 19.03.2020


Ответы (4)


Никакого JavaScript, никакой второй формы не требуется, и валидация может остаться:

Именно для этого случая использования спецификация HTML5 разработала formnovalidate атрибут для элементов отправки. (например, <input type=submit>), как один из атрибуты для отправки формы:

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

Так что просто поставьте

<form action="myform.php">
  Foo: <input type="text" name="someField" required>
  <input type="submit" value="submit">
  <input type="submit" value="ignore" formnovalidate>
</form>
person Bergi    schedule 10.09.2013

Ваш № 2 - это общий подход. Что-то типа:

$('input[value="ignore"]').click(function() {
    $(this).siblings('input[type="text"]').removeAttr('required');
});

Возможно, придется использовать mousedown, чтобы победить submit.

person isherwood    schedule 10.09.2013
comment
Если нужно было использовать JavaScript, вам лучше сделать .prop("required", false) - person Bergi; 10.09.2013

Если вы не хотите использовать Javascript, вы можете сделать их отдельными формами и скрыть все входные данные для формы ignore.

Не лучший вариант, но альтернатива.

person Matt Kenefick    schedule 10.09.2013

Вам следует использовать подход №1 по следующим причинам: Основные причины использования required вместо проверки JavaScript заключаются в том, что он проще и работает даже при отключенном JavaScript. Здесь простота неприменима, поскольку использование required усложняет задачу. И последняя причина также не применима: при отключенном JavaScript и браузере, поддерживающем required, кнопка «игнорировать» не будет работать, если некоторые данные не введены в текстовое поле.

Другой альтернативой является вариант, упомянутый в ответе @MattKenefick. Это может даже привести к упрощению структуры и логики. Если форма действительно такая простая, как в примере, ее несложно разделить на две формы:

<form action="myform.php">
  Foo: <input type="text" name="someField" required="required">
  <input type="submit" value="submit">
</form>
<form action="myform.php">
  <input type="submit" value="ignore">
</form>
person Jukka K. Korpela    schedule 10.09.2013
comment
Это не означает, что это поле необходимо при любых обстоятельствах. Это означает, что поле требуется при проверке формы, чего может и не быть, см. Мой ответ. - person Bergi; 10.09.2013
comment
@Bergi, хорошо, я удалил этот абзац. - person Jukka K. Korpela; 11.09.2013