Як змусити перевірити форму html5, не надсилаючи її через jQuery


286

У мене є ця форма у своєму додатку, і я надішлю її через AJAX, але я хочу використовувати HTML5 для перевірки на стороні клієнта. Тому я хочу мати змогу перевірити форму, можливо, через jQuery.

Я хочу запустити перевірку, не надсилаючи форму. Це можливо?


Чи можете ви вказати, в який момент ви хотіли б підтвердити форму? Що запускає перевірку? Ви хочете перевірити кожне поле, коли користувач вводить, залишає / залишає поле, змінює значення?
Петро Пайчл

6
Я хотів би, щоб було можливо зробити щось подібне: $ ("# my_form"). ТримачHtml5Validation ()
різнихha

Ця сторінка може допомогти посиланням
Dan Bray

Ви можете досягти цього без jQuery. Дивіться моє рішення.
Ден Брей

Відповіді:


444

Щоб перевірити, чи певне поле дійсне, скористайтеся:

$('#myField')[0].checkValidity(); // returns true/false

Щоб перевірити, чи форма дійсна, скористайтеся:

$('#myForm')[0].checkValidity(); // returns true/false

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

var $myForm = $('#myForm');

if(! $myForm[0].checkValidity()) {
  // If the form is invalid, submit it. The form won't actually submit;
  // this will just cause the browser to display the native HTML5 error messages.
  $myForm.find(':submit').click();
}

Сподіваюсь, це допомагає. Майте на увазі, що перевірка HTML5 підтримується не в усіх браузерах.


1
Я спробував ваше рішення, але воно все ще надсилає форму, коли виконується рядок $ myForm.submit ().
Яшпал Сінгла

27
Спробуйте замінити $myForm.submit()на$myForm.find(':submit').click()
Авраам

8
Авраам правильний. Ви повинні фактично натиснути кнопку подання (програмно). Виклик $ myForm.submit () не призведе до перевірки.
Кевін Тіге

75
Якщо у вашій формі немає кнопки надсилання, ви можете підробити її:$('<input type="submit">').hide().appendTo($myForm).click().remove();
philfreo

15
Ця відповідь дуже корисна через підказку checkValidity(), але вона також має небезпечну помилку. checkValidity()це те, що запускає повідомлення про помилки нативної браузера, а не натискання кнопки подання. Якщо у вас є слухач подій, який слухає клацання кнопки подання, ви запускаєте його, коли ви зробите `$ myForm.find (': submit'). Click ()`, що запустить себе і спричинить нескінченну рекурсію.
Поганий запит

30

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

action="javascript:myFunction();"

Тоді у вас є перевірка html5 ... дуже просто :-)


3
Це працювало і для мене, і я вважаю, що це найкраща відповідь. Я встановив action="javascript:0"на <form>і пов'язанийclick подію на <button>до MyFunction()і все працювало чудово. Я уникаю всіх JS від HTML. MyFunctionможна перевірити, form.checkValidity()щоб продовжити.
orad

3
Зразок коду завжди корисний.
BJ Patel

10
Прив’язка до форми onsubmit()майже завжди краща, ніж прив’язка до кнопки onclick(), оскільки є інші способи подати форму. (Особливо, натиснувши наreturn клавішу.)
alttag

+1 Це дивовижно. більше немає перевірки методу javascript, якщо поле порожнє або якщо його електронна пошта. Браузер може це зробити для нас! Чи сумісний цей крос-браузер?
Джо Е.

2
Ні action="javascript:myFunction();" ні action="javascript:0"більше працює в останній Firefox (67). Однак працює на Chrome.
Бобз

23
    if $("form")[0].checkValidity()
      $.ajax(
        url: "url"
        type: "post"
        data: {

        }
        dataType: "json"
        success: (data) ->

      )
    else
      #important
      $("form")[0].reportValidity()

від: перевірка форми html5


4
reportValidityце підтримується тільки на Chrome 40.0
MM

Це CoffeeScript.
амфетамахін

1
reportValidity зараз підтримується Firefox з версії 49
Джастін

Мені подобається ця частина $("form")[0].reportValidity(). Мені це потрібно, якщо перевірка валідності виявиться невдалою.
fsevenm

Чудово! Дякую!
stefo91

18

нижче код працює для мене,

$("#btn").click(function () {

    if ($("#frm")[0].checkValidity())
        alert('sucess');
    else
        //Validate Form
        $("#frm")[0].reportValidity()

});

1
reportValidity()є найкращою функцією для виділення обов'язкових полів.
Джамшад Ахмад

Так, це працює як шарм, але лише якщо браузер його підтримує. caniuse.com/#search=reportValidity
MegaMatt

16

Ось більш загальний спосіб, який є трохи чистішим:

Створіть форму такою (це може бути фіктивна форма, яка нічого не робить):

<form class="validateDontSubmit">
...

Прив’яжіть усі форми, які ви дійсно не бажаєте надсилати:

$(document).on('submit','.validateDontSubmit',function (e) {
    //prevent the form from doing a submit
    e.preventDefault();
    return false;
})

Тепер скажемо, що у вас є <a>(у межах <form>), що при натисканні ви хочете перевірити форму:

$('#myLink').click(function(e){
  //Leverage the HTML5 validation w/ ajax. Have to submit to get em. Wont actually submit cuz form
  //has .validateDontSubmit class
  var $theForm = $(this).closest('form');
  //Some browsers don't implement checkValidity
  if (( typeof($theForm[0].checkValidity) == "function" ) && !$theForm[0].checkValidity()) {
     return;
  }

  //if you've gotten here - play on playa'
});

Кілька приміток тут:

  • Я помітив, що вам не потрібно насправді подавати форму для підтвердження - заклик до checkValidity() цього достатній (принаймні, в хромі). Якщо інші зможуть додати коментарі, перевіряючи цю теорію в інших браузерах, я оновлю цю відповідь.
  • Те, що запускає перевірку, не повинно бути в межах <form>. Це був просто чистий і гнучкий спосіб отримати рішення загального призначення ..

12

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

Проблема полягає в тому, що ваш <form>DOM містить один <button>елемент, щойно вистрілиться, який <button>автоматично перетворить форму. Якщо ви граєте з AJAX, вам, ймовірно, потрібно запобігти дії за замовчуванням. Але є улов: Якщо ви просто зробите це, ви також запобіжите основну перевірку HTML5. Тому добре закликати запобігати встановленню за замовчуванням цієї кнопки лише у випадку, якщо форма дійсна. Інакше перевірка HTML5 захистить вас від надсилання. jQuerycheckValidity() допоможе у цьому:

jQuery:

$(document).ready(function() {
  $('#buttonID').on('click', function(event) {
    var isvalidate = $("#formID")[0].checkValidity();
    if (isvalidate) {
      event.preventDefault();
      // HERE YOU CAN PUT YOUR AJAX CALL
    }
  });
});

Код, описаний вище, дозволить вам використовувати базову перевірку HTML5 (з відповідності типу та шаблону) БЕЗ форми подання.


6

Ви говорите про дві різні речі "перевірка HTML5" та перевірка форми HTML за допомогою JavaScript / jquery.

HTML5 "має" вбудовані параметри для перевірки форми. Наприклад, використання атрибута "обов'язковий" у полі, яке може (на основі впровадження браузера) не дати подання форми без використання javascript / jquery.

За допомогою javascrip / jquery ви можете зробити щось подібне

$('your_form_id').bind('submit', function() {
   // validate your form here
   return (valid) ? true : false;
});

2
Я хочу запустити перевірку, не надсилаючи форму.
різга

Згідно з вашим оновленням - я все ще думаю, що це правильне рішення. Ви не вказали, як потрібно запустити triggerHtml5Validation()функцію. Вищевказаний код додасть подію подання до вашої форми; після подачі ви перехоплюєте подію та підтверджуєте форму. Якщо ви ніколи не хочете подавати форму, просто, return false;і надсилання ніколи не відбудеться.
Петро Пайчл

7
return (valid) ? true : false=== return valid. :)
Davi Koscianski Vidal

1
На жаль, я + 1'ed @davi, тому що я спочатку думав саме те саме. Але це насправді не те саме, так як просто return validне повертає false для null / undefined значень. Але це насправді не має значення, відповідь все одно був псевдо-кодом, справа в тому: використовуйте return false, щоб не надсилати форму ^^
T_D

5
var $myForm = $('#myForm ');
if (!$myForm[0].checkValidity()) {
  $('<input type="submit">').hide().appendTo($myForm).click().remove();
}

він не працює на хромі 74. Чи можу я піднести світло на нього?
codexplorer

3

Щоб перевірити всі необхідні поля форми без використання кнопки подання, ви можете скористатися функцією нижче.

Ви повинні призначити необхідний атрибут елементам управління.

  $("#btnSave").click(function () {
    $(":input[required]").each(function () {                     
        var myForm = $('#form1');
        if (!$myForm[0].checkValidity()) 
          {                
            $(myForm).submit();              
          }
        });
  });

3

Для цього вам не потрібен jQuery. У свою форму додайте:

onsubmit="return buttonSubmit(this)

або в JavaScript:

myform.setAttribute("onsubmit", "return buttonSubmit(this)");

У своїй buttonSubmitфункції (або як би ви її не назвали) ви можете подати форму за допомогою AJAX.buttonSubmitбуде викликано, лише якщо ваша форма підтверджена в HTML5.

Якщо це допомагає комусь, ось моя buttonSubmitфункція:

function buttonSubmit(e)
{
    var ajax;
    var formData = new FormData();
    for (i = 0; i < e.elements.length; i++)
    {
        if (e.elements[i].type == "submit")
        {
            if (submitvalue == e.elements[i].value)
            {
                submit = e.elements[i];
                submit.disabled = true;
            }
        }
        else if (e.elements[i].type == "radio")
        {
            if (e.elements[i].checked)
                formData.append(e.elements[i].name, e.elements[i].value);
        }
        else
            formData.append(e.elements[i].name, e.elements[i].value);
    }
    formData.append("javascript", "javascript");
    var action = e.action;
    status = action.split('/').reverse()[0] + "-status";
    ajax = new XMLHttpRequest();
    ajax.addEventListener("load", manageLoad, false);
    ajax.addEventListener("error", manageError, false);
    ajax.open("POST", action);
    ajax.send(formData);
    return false;
}

Деякі мої форми містять кілька кнопок подання, звідси і цей рядок if (submitvalue == e.elements[i].value). Я встановлюю значення submitvalueвикористання події клацання.


2

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

Основою було те, що це також було ненав’язливо, тому я не міг просто зробити його звичайною кнопкою. Але також хотів використати перевірку html5.

Також подія подання була відмінена у випадку, якщо користувач натиснув клавішу Enter, щоб викликати очікуване подання за замовчуванням; у цьому прикладі зберегти.

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

Демонстрація jsFiddle - перевірка HTML5 з перевірками надсилання та натискання

xHTML

<form>
    <input type="text" required="required" value="" placeholder="test" />
    <button type="submit" name="save">Save</button>
    <button type="submit" name="delete">Delete</button>
</form>

JavaScript

//wrap our script in an annonymous function so that it can not be affected by other scripts and does not interact with other scripts
//ensures jQuery is the only thing declared as $
(function($){
    var isValid = null;
    var form = $('form');
    var submitButton = form.find('button[type="submit"]')
    var saveButton = submitButton.filter('[name="save"]');
    var deleteButton = submitButton.filter('[name="delete"]');

    //submit form behavior
    var submitForm = function(e){
        console.log('form submit');
        //prevent form from submitting valid or invalid
        e.preventDefault();
        //user clicked and the form was not valid
        if(isValid === false){
            isValid = null;
            return false;
        }
        //user pressed enter, process as if they clicked save instead
        saveButton.trigger('click');
    };

    //override submit button behavior
    var submitClick = function(e){
        //Test form validitiy (HTML5) and store it in a global variable so both functions can use it
        isValid = form[0].checkValidity();
        if(false === isValid){
            //allow the browser's default submit event behavior 
            return true;
        }
        //prevent default behavior
        e.preventDefault();
        //additional processing - $.ajax() etc
        //.........
        alert('Success');
    };

    //override submit form event
    form.submit(submitForm);

    //override submit button click event
    submitButton.click(submitClick);
})(jQuery);

Застереження щодо використання Javascript полягає в тому, що onclick браузера за замовчуванням повинен поширюватися на подію подання, ОБОВ'ЯЗКОВО відбуватись для відображення повідомлень про помилки, не підтримуючи кожен браузер у вашому коді. В іншому випадку, якщо подія натискання буде замінена на event.preventDefault () або повернеться помилковою, вона ніколи не поширюватиметься на подію подання браузера.

Варто зазначити, що в деяких браузерах не буде спровоковано подання форми, коли користувач натискає кнопку, замість цього вона запустить першу кнопку подання у формі. Отже, існує console.log ("форма надсилання"), щоб показати, що він не спрацьовує.


Ми чудово усвідомлюємо, що це можна зробити без jQuery, але назва цієї теми є власником ОР: "Як змусити перевірку форми HTML5, не надсилаючи її через jQuery", явно пропонуючи використовувати jQuery.
vzr

@vzr Мою відповідь jQueryявно використовую . Він відрізняється тим, що він обробляє обробку перевірки HTML5 за допомогою декількох кнопок подання та запобігає надсиланню форми AJAX, коли вона недійсна. Невдача до saveдії, коли користувач натискає enterклавішу на клавіатурі. Що під час мого опублікування жодної із наданих відповідей не було рішенням як для декількох кнопок подання, так і для захоплення ключа введення, щоб запобігти надсиланню Ajax.
fyrye

2

Ви можете це зробити, не подаючи форму.

Наприклад, якщо кнопка подання форми з ідентифікатором "пошук" знаходиться в іншій формі. Ви можете зателефонувати події клацання на цій кнопці подання та зателефонувати ev.preventDefault після цього. У моєму випадку я підтверджую форму B з подання форми A. Подобається це

function validateFormB(ev){ // DOM Event object
  //search is in Form A
  $("#search").click();
  ev.preventDefault();
  //Form B validation from here on
}

2

Цей спосіб добре працює для мене:

  1. Додайте onSubmitатрибут у свій form, не забудьте включити returnу значення.

    <form id='frm-contact' method='POST' action='' onSubmit="return contact()">
  2. Визначте функцію.

    function contact(params) {
        $.ajax({
            url: 'sendmail.php',
            type: "POST",
            dataType: "json",
            timeout: 5000,
            data: { params:params },
            success: function (data, textStatus, jqXHR) {
                // callback
            },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log(jqXHR.responseText);
            }
        });
    
        return false;
    }

1
$("#form").submit(function() { $("#saveButton").attr("disabled", true); });

не найкраща відповідь, але працює для мене.


1

Я знаю, що на це вже відповіли, але у мене є інше можливе рішення.

Якщо ви використовуєте jquery, ви можете це зробити.

Спочатку створіть пару розширень на jquery, щоб ви могли використовувати їх за потреби.

$.extend({
    bypassDefaultSubmit: function (formName, newSubmitMethod) {
        $('#'+formName).submit(function (event) {
            newSubmitMethod();
            event.preventDefault();
        }
    }
});

Далі зробіть щось подібне там, де ви хочете його використовувати.

<script type="text/javascript">
    /*if you want to validate the form on a submit call, 
      and you never want the form to be submitted via
      a normal submit operation, or maybe you want handle it.
    */
    $(function () {
        $.bypassDefaultSubmit('form1', submit);
    });
    function submit(){ 
        //do something, or nothing if you just want the validation
    }

</script>


1

Це працювало у формі, щоб я відображав нативні повідомлення про помилки HTML 5 із підтвердженням форми.

<button id="btnRegister" class="btn btn-success btn btn-lg" type="submit"> Register </button>



$('#RegForm').on('submit', function () 
{

if (this.checkValidity() == false) 
{

 // if form is not valid show native error messages 

return false;

}
else
{

 // if form is valid , show please wait message and disable the button

 $("#btnRegister").html("<i class='fa fa-spinner fa-spin'></i> Please Wait...");

 $(this).find(':submit').attr('disabled', 'disabled');

}


});

Примітка: RegForm - це те form id.

Довідково

Надія комусь допомагає.


Ви повинні додати подію, щоб увімкнути кнопку відключення відключеного
talsibony

1

Це досить прямий спосіб змусити HTML5 виконати перевірку будь-якої форми, в той час як все ще має сучасний JS-контроль над формою. Єдине застереження - кнопка подання повинна знаходитися всередині <form>.

html

<form id="newUserForm" name="create">
Email<input type="email" name="username" id="username" size="25" required>
Phone<input type="tel" id="phone" name="phone" pattern="(?:\(\d{3}\)|\d{3})[- ]?\d{3}[- ]?\d{4}" size="12" maxlength="12" required>
<input id="submit" type="submit" value="Create Account" >
</form>

js

// bind in ready() function
jQuery( "#submit" ).click( newAcctSubmit );

function newAcctSubmit()
{
  var myForm = jQuery( "#newUserForm" );

  // html 5 is doing the form validation for us,
  // so no need here (but backend will need to still for security)
  if ( ! myForm[0].checkValidity() )
  {
    // bonk! failed to validate, so return true which lets the
    // browser show native validation messages to the user
    return true;
  }

  // post form with jQuery or whatever you want to do with a valid form!
  var formVars = myForm.serialize();
  etc...
}

0

Я думаю, що найкращий підхід

буде використовувати jQuery Validation плагін який використовує кращі практики для перевірки форми, а також має гарну підтримку браузера. Тож вам не потрібно турбуватися про проблеми сумісності браузера.

І ми можемо використовувати функцію jQuery validation valid (), яка перевіряє, чи обрана форма є дійсною чи чи всі вибрані елементи дійсні, не надсилаючи форму.

<form id="myform">
   <input type="text" name="name" required>
   <br>
   <button type="button">Validate!</button>
</form>
<script>
  var form = $( "#myform" );
  form.validate();
  $( "button" ).click(function() {
    console.log( "Valid: " + form.valid() );
  });
</script>

0

Згідно з питанням, дійсність html5 повинна бути перевірена на перших порах, використовуючи jQuery, і в більшості відповідей цього не відбувається, і причина цього полягає в наступному:

під час перевірки використовуючи функцію за замовчуванням html5 форми

checkValidity();// returns true/false

нам потрібно зрозуміти, що jQuery повертає масив об'єктів, при цьому вибираючи так

$("#myForm")

отже, вам потрібно вказати перший індекс, щоб змусити функцію checkValidity () працювати

$('#myForm')[0].checkValidity()

ось повне рішення:

<button type="button" name="button" onclick="saveData()">Save</button>

function saveData()
{
    if($('#myForm')[0].checkValidity()){
        $.ajax({
          type: "POST",
          url: "save.php",
          data: data,
          success: function(resp){console.log("Response: "+resp);}
        });
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.