321

我的应用程序中有这个表单,我将通过 AJAX 提交它,但我想使用 HTML5 进行客户端验证。所以我希望能够强制表单验证,也许是通过 jQuery。

我想在不提交表单的情况下触发验证。是否可以?

4

21 回答 21

481

要检查某个字段是否有效,请使用:

$('#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 验证。

于 2012-08-08T14:42:42.850 回答
49

下面的代码对我有用,

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

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

});
于 2019-06-24T12:39:34.887 回答
38

我发现这个解决方案对我有用。只需像这样调用一个javascript函数:

action="javascript:myFunction();"

然后你就有了 html5 验证......真的很简单:-)

于 2013-02-06T16:42:47.807 回答
33
    if $("form")[0].checkValidity()
      $.ajax(
        url: "url"
        type: "post"
        data: {

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

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

来自:html5表单验证

于 2015-07-15T10:15:40.707 回答
17

这是一种更通用的方式,更简洁:

像这样创建你的表单(可以是一个什么都不做的虚拟表单):

<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()就足够了(至少在 chrome 中)。如果其他人可以通过在其他浏览器上测试该理论来添加评论,我将更新此答案。
  • 触发验证的东西不必在<form>. 这只是拥有通用解决方案的一种干净而灵活的方式。
于 2013-02-27T16:38:27.753 回答
15

聚会可能迟到了,但不知何故我在尝试解决类似问题时发现了这个问题。由于此页面中没有代码对我有用,同时我想出了按规定工作的解决方案。

问题是当您的<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 验证(类型和模式匹配)。

于 2016-09-13T12:23:35.510 回答
6

您谈到了两个不同的事情“HTML5 验证”和使用 javascript/jquery 验证 HTML 表单。

HTML5“具有”用于验证表单的内置选项。例如在字段上使用“必需”属性,这可能(基于浏览器实现)在不使用 javascript/jquery 的情况下使表单提交失败。

使用 javascrip/jquery 你可以做这样的事情

$('your_form_id').bind('submit', function() {
   // validate your form here
   return (valid) ? true : false;
});
于 2012-08-08T14:44:38.200 回答
5
var $myForm = $('#myForm ');
if (!$myForm[0].checkValidity()) {
  $('<input type="submit">').hide().appendTo($myForm).click().remove();
}
于 2016-12-21T07:43:06.523 回答
3

要在不使用提交按钮的情况下检查表单的所有必填字段,您可以使用以下功能。

您必须为控件分配必需的属性。

  $("#btnSave").click(function () {
    $(":input[required]").each(function () {                     
        var myForm = $('#form1');
        if (!$myForm[0].checkValidity()) 
          {                
            $(myForm).submit();              
          }
        });
  });
于 2013-10-04T06:35:27.530 回答
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使用点击事件的值。

于 2016-03-19T20:31:56.077 回答
3

这种方式对我很有效:

  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;
    }
    
于 2018-09-17T06:23:35.430 回答
2

我有一个相当复杂的情况,我需要多个提交按钮来处理不同的事情。例如,保存和删除。

基础是它也不显眼,所以我不能让它成为一个普通的按钮。但也想利用 html5 验证。

在用户按下回车键触发预期的默认提交的情况下,提交事件也会被覆盖;在这个例子中保存。

这是处理表单的努力,无论是否使用 javascript 和 html5 验证,提交和点击事件。

jsFiddle Demo - 带有提交和点击覆盖的 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 必须传播到提交事件必须发生,以便在不支持代码中的每个浏览器的情况下显示错误消息。否则,如果 click 事件被 event.preventDefault() 覆盖或返回 false,它将永远不会传播到浏览器的提交事件。

需要指出的是,在某些浏览器中,当用户按下回车键时不会触发表单提交,而是会触发表单中的第一个提交按钮。因此有一个 console.log('form submit') 表明它没有触发。

于 2014-02-10T01:05:46.893 回答
2

您可以在不提交表单的情况下执行此操作。

例如,如果 id 为“search”的表单提交按钮在另一个表单中。您可以在该提交按钮上调用 click 事件,然后调用 ev.preventDefault 。对于我的情况,我从表单 A 提交中验证表单 B。像这样

function validateFormB(ev){ // DOM Event object
  //search is in Form A
  $("#search").click();
  ev.preventDefault();
  //Form B validation from here on
}
于 2014-02-14T06:37:08.517 回答
2

2022香草JS解决方案

纯 JavaScript 具有您需要的所有功能。我知道这个问题是关于 jQuery 的,但我确信我不是唯一一个在这里搜索 vanilla JS 解决方案的人,所以这就是我发现的。

测试整个表格

let form = document.getElementById('formId');
// Eventlistener can be another event and on another DOM object this is just an example
form.addEventListener('submit', function (event) {
    // Only needed if event is submit, otherwise this line can be skipped 
    event.preventDefault();

    // This is the important part, test if form is valid
    if (form.checkValidity() === false){
        // This is the magic function that displays the validation errors to the user
        form.reportValidity();   
        return; 
    }

    // Code if all fields are valid; continue form submit or make Ajax call.
})

测试特定字段

checkValidity()并且reportValidity()不仅可以在表单上使用,还可以在特定字段上使用。如果不需要,无需创建表单或虚拟提交按钮。

// Get field of interest
let inputElement = document.querySelector("[name='" + inputName + "']");
// Check if the element is valid
if (inputElement.checkValidity() === false){
    // If not, show the errors to the user
    inputElement.reportValidity();
    return;
}

// Nothing? Great, continue to the Ajax call or whatever

显然,这必须在事件侦听器调用的函数中才有意义。

于 2022-02-17T12:15:10.717 回答
1
$("#form").submit(function() { $("#saveButton").attr("disabled", true); });

不是最佳答案,但对我有用。

于 2015-04-22T04:11:05.573 回答
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>
于 2015-07-31T04:53:29.123 回答
1
$(document).on("submit", false);

submitButton.click(function(e) {
    if (form.checkValidity()) {
        form.submit();
    }
});
于 2015-12-19T05:49:34.763 回答
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.

参考

希望能帮助某人。

于 2016-11-19T10:31:19.650 回答
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...
}
于 2016-12-14T22:40:58.687 回答
0

我认为最好的方法

将使用jQuery Validation插件,该插件使用最佳实践进行表单验证,并且它还具有良好的浏览器支持。因此您无需担心浏览器兼容性问题。

我们可以使用 jQuery 验证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>
于 2019-05-29T08:02:42.220 回答
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);}
        });
    }
}
于 2019-07-03T11:03:22.380 回答