Заобикаляне на задължителния атрибут на 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>

Проблемът е, че имам бутон "игнориране", който също изпраща формуляра и логиката на бекенда след това задава правилно състояние в DB. В този случай (игнориране) валидирането не е желано (защото не е необходимо да се попълва полето "Foo").

Кой е най-добрият начин за справяне с двата сценария?

  1. Наясно съм, че мога да се откажа от „задължително“ и да направя проверката някъде другаде (бекенд / 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, за да победите подаване.

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