2016-12-01 3 views
3

Недавно я подошел к новой (для меня) теме проверки формы HTML5. Я тестировал его с успехом, но я все еще довольно смущен тем, как и почему его использовать. Позвольте мне попытаться объяснить на простом примере.Проверка формы HTML5 без проверки Javascript

Моя форма содержит 10 полей (текст, цифры, даты ...); у каждого из них есть свои required и pattern.
Проверка достоверности работы visual; в каждом поле отображается статус Go/NoGo: все в порядке.
Но, когда дело доходит до отправки формы с помощью javascript, следует ли мне повторно проверять каждое поле?
Другими словами, проверка HTML5 является лишь визуальным артефактом; это не мешает подаче формы. Если пользователь хочет ввести неправильный контент, игнорируя красный флаг, он может это сделать.

Если я прав, почему я должен использовать HTML для выполнения того, что я могу (и должен) делать с JS? Возможно, у JS есть возможность узнать, что все нормально, чтобы продолжить, без дополнительной проверки.

+0

[Аналогичный вопрос] (http://stackoverflow.com/q/12470622/863110) –

+0

Нет ничего «вы должны делать». Существуют разные возможности для решения поставленной задачи. Имея в своем распоряжении атрибуты проверки, вы можете избежать использования javascript для простой проверки формы. Иногда это нормально. Иногда вам лучше работать с javascript. –

ответ

0

Когда вы применяете проверку HTML через HTML к элементу формы, и значение этого элемента не соответствует критериям проверки, форма НЕ будет отправлена.

Но, если вы используете JavaScript, вам придется взять под контроль этот процесс. Самый простой способ - просто проверить правильность формы.

«Но когда дело доходит до отправки формы с помощью JavaScript, следует ли мне повторно проверять каждое поле?»

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

«Другими словами, проверка HTML5 только визуальный артефакт, это не мешает представление формы Если пользователь хочет ввести неправильное содержание Игнорируя красный флаг, он может это сделать.».

Когда вы придерживаетесь только HTML и не используете JavaScript, то проверка является более чем просто визуальной. Форма не будет отправлена. Эта функциональность испечена в HTML5-совместимых браузерах.

«Если я прав, почему я должен использовать HTML для выполнения чего-то, что я могу (и должен) делать с JS? Может быть, для JS есть способ узнать, что все нормально, без дополнительной проверки ».

Опять же, использование только разметки HTML предоставит вам множество валидаторов (обязательно, шаблон, номер и т. Д.), И они будут работать прямо из коробки. Тем не менее, вы не сможете контролировать то, что говорят валидационные сообщения, или точно, когда и где они будут отображаться (или даже как они выглядят). Это зависит от браузера. Вот почему спецификация HTML5 Forms включает очень надежный API (через JavaScript) - для того, чтобы вы могли полностью контролировать процесс проверки и уведомления.

var btn = document.getElementById("btnSubmit"); 
 
var frm = document.getElementById("frmTest"); 
 

 

 
btn.addEventListener("click", function(){ 
 
    // The HTML 5 Forms API provides a .checkValidity() 
 
    // method to your form object so that you can know 
 
    // if the form is valid or not: 
 
    if(frm.checkValidity()){ 
 
    frmTest.submit(); 
 
    } 
 
});
<form method=post action="http://www.somewhere.com" id=frmTest> 
 
    
 
    <input required> 
 
    <input type=button id=btnSubmit value=submit> 
 
    
 
</form>

Вот основная функция JavaScript, которая демонстрирует то, что вы можете сделать с помощью HTML5 Forms API:

// Custom form validation logic: 
    function validate(evt) { 

    // An HTML5 form has a checkValidity() method which forces it 
    // to examine the validity of all controls that know how to validate 
    // and it returns a boolean indicating if ALL these controls are valid 
    // or if any ONE of them is not. 
    var valid = theForm.checkValidity(); 
    if (valid) { 
     // Everything is good. Submit the form: 
     theForm.submit(); 
    } else { 
     // At least one form element is invalid. Loop through all the elements to 
     // see which one(s) they are: 
     var theElements = theForm.elements; 

     for (var i = 0; i < theElements.length; i++) { 
     var theElement = theElements[i]; 

     // If the form element participates in the HTML5 Validity Framework and 
     // if it is invalid... 
     if (theElement.willValidate && !theElement.validity.valid) { 

      console.warn(theElement.id + " validity details: "); 

      // ...The object will have a validity object property: 
      console.log(theElement.validity); 

      // The element is invalid. Loop through all the validity object's 
      // properties to see why it is invalid: 
      for (var constraint in theElement.validity) { 

      // Check the particular validity constraint for true 
      if (theElement.validity[constraint]) { 
       // Update the span element next to the offending form element with the reason: 
       theElement.nextElementSibling.innerHTML = constraint; 
      } // End If 

      } // End For 

     } // End If 

     } // End For 

    } // End If 

    } // End Function 
+0

@Alexander Taran Пожалуйста, не редактируйте чей-то ответ, чтобы он говорил что-то принципиально иное, чем написал автор. –

+0

Вместо обработчика щелчка, вы должны действительно обрабатывать форму submit. Существуют альтернативные способы подачи формы, например, просто нажатие ввода на поле ввода. – Brad

+0

@Brad Вы заметите, что кнопка не является кнопкой отправки, так что событие щелчка является правильным подходом. Если вы собираетесь отправлять через JavaScript, вы не должны использовать кнопку отправки, потому что вам придется потенциально отменить событие и пузырь. –

-1

Вы можете предотвратить поведение по умолчанию при отправке (включая проверку формы html5) и запустить эту проверку js для обработки данных.

-2

Вот пример, в котором можно проверить поле ввода запрашивает имя с помощью HTML5 формы проверки:

<input id="name" name="name" value="" aria-describedby="name-format" required aria-required=”true” pattern="[A-Za-z-0-9]+\s[A-Za-z-'0-9]+" title="firstname lastname"> 

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

При использовании атрибута pattern подразумеваются значения^и $ для начала и конца регулярного выражения и их не нужно включать.

Вы можете помочь пользователю, указав атрибут title, который сообщает им формат, который вам нужен.

Чтобы убедиться, что ваш пользователь вводит правильные данные в электронную почту, веб-сайт, а также количество билетов полей, вы можете использовать некоторые из новых типов ввода, добавленных в HTML5:

<input type="email" id="email" name="email" required> 
… 
<input type="url" id="url" name="url"> 
… 
<input type="number" id="numTickets" name="numTickets" required> 

Указав соответствующий тип , ваш браузер будет проверять данные для вас и убедиться, что у вас есть адрес электронной почты в поле электронной почты, URL-адрес в поле веб-сайта и номер в поле количества билетов.

+0

Почему это уменьшается? – Mjuice

+0

@ Scott Marcus Я нашел ваш ответ очень полезным, и я не понимаю нисходящее голосование (я его проголосовал). Я считаю, что «frm.checkValidity()» - это то, что я искал. Возможно, я не ясно объяснил свои сомнения, из-за моего английского тоже. Я не «публикую» форму обычным способом; содержимое собрано JS, разработано и позже отправлено в почтовую программу PHP. По этой причине я оставляю HTML для проверки и только тогда, когда все в порядке, JS берет на себя управление второй фазой. Ваше решение кажется идеальным – Orionis

+0

Хорошо, я рад, что вы сочли это полезным.Я иногда чувствую, что эта игра по возврату и уменьшению ответов в stackoverflow чрезвычайно детски! Он превращает всех друг в друга. – Mjuice

0

Когда проверка HTML5 не проходят, браузер не должен позволять пользователь должен отправить форму. HTML5 предлагает хорошую проверку, но если вы хотите более сложную проверку или хотите настроить таргетинг на браузеры, которые не поддерживают проверку HTML5, используйте js.

+0

HTML5 обеспечивает очень надежный API проверки. –

+0

@Scott Marcus ok, я знаю, исправлено, я просто хотел указать что для более сложной проверки он должен использовать js. –

+0

Ваша формулировка звучит так же, как использование JavaScript означает, что вы больше не используете HTML5, и это неверно. HTML5 - это не только разметка - она ​​включает в себя множество JavaScript-интерфейсов. –

2

Другими словами, проверка HTML5 является лишь визуальным артефактом; это не препятствует отправке формы.

Это не то, как это должно работать. По дизайну, проверка HTML5 должна предотвратить неправильное заполнение формы из представления. И это так - in most browsers. К сожалению, есть a bug in Safari, что приводит к описанному вами поведению. Поэтому до тех пор, пока эта ошибка не будет исправлена, да, вам может понадобиться также проверить форму с помощью JS, но это связано не с природой проверки HTML5, а только из-за отсутствия поддержки в Safari.

Смежные вопросы