Cách bắt buộc xác thực mẫu html5 mà không cần gửi qua jQuery


285

Tôi có mẫu này trong ứng dụng của mình và tôi sẽ gửi nó qua AJAX, nhưng tôi muốn sử dụng HTML5 để xác thực phía máy khách. Vì vậy, tôi muốn có thể buộc xác thực mẫu, có lẽ thông qua jQuery.

Tôi muốn kích hoạt xác nhận mà không cần gửi biểu mẫu. Có thể không?


Bạn có thể chỉ định tại điểm nào bạn muốn xác nhận mẫu? Điều gì kích hoạt xác nhận? Bạn có muốn xác thực từng trường khi người dùng nhập, nhập / rời trường, thay đổi giá trị không?
Peter Pajchl

6
Tôi muốn có thể làm một cái gì đó như thế: $ ("# my_form"). TriggerHtml5Validation ()
razenha

Trang này có thể giúp liên kết
Dan Bray

Bạn có thể đạt được điều này mà không cần jQuery. Xem giải pháp của tôi.
Dan Bray

Câu trả lời:


444

Để kiểm tra xem một trường nhất định có hợp lệ hay không, hãy sử dụng:

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

Để kiểm tra xem biểu mẫu có hợp lệ không, hãy sử dụng:

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

Nếu bạn muốn hiển thị các thông báo lỗi gốc mà một số trình duyệt có (chẳng hạn như Chrome), thật không may, cách duy nhất để làm điều đó là bằng cách gửi biểu mẫu, như thế này:

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();
}

Hi vọng điêu nay co ich. Hãy nhớ rằng xác thực HTML5 không được hỗ trợ trong tất cả các trình duyệt.


1
Tôi đã thử giải pháp của bạn, nhưng nó vẫn gửi biểu mẫu khi dòng $ myForm.submit () được thực thi.
Yashpal Singla

27
Hãy thử thay thế $myForm.submit()bằng$myForm.find(':submit').click()
Abraham

8
Áp-ra-ham đúng. Bạn phải thực sự nhấp vào nút gửi (lập trình). Gọi $ myForm.submit () sẽ không kích hoạt xác thực.
Kevin Tighe

75
Nếu biểu mẫu của bạn không có nút gửi, bạn có thể giả mạo:$('<input type="submit">').hide().appendTo($myForm).click().remove();
philfreo

15
Câu trả lời này rất hữu ích vì mẹo về checkValidity(), nhưng nó cũng có một lỗi nguy hiểm. checkValidity()là những gì kích hoạt thông báo lỗi trình duyệt riêng, không phải nhấp vào nút gửi. Nếu bạn có một trình lắng nghe sự kiện lắng nghe nhấp vào nút gửi, bạn sẽ kích hoạt nó khi bạn thực hiện `$ myForm.find (': submit'). Click ()`, nó sẽ tự kích hoạt và gây ra đệ quy vô hạn.
Yêu cầu xấu

30

Tôi tìm thấy giải pháp này để làm việc cho tôi. Chỉ cần gọi một chức năng javascript như thế này:

action="javascript:myFunction();"

Sau đó, bạn có xác thực html5 ... thực sự đơn giản :-)


3
Điều này cũng làm việc cho tôi và tôi nghĩ đây là câu trả lời tốt nhất. Tôi đặt action="javascript:0"trên <form>và bị ràng buộc clicksự kiện trên <button>để MyFunction()và tất cả làm việc tuyệt vời. Tôi giữ tất cả JS ra khỏi HTML. MyFunctionsau đó có thể kiểm tra form.checkValidity()để tiếp tục.
orad

3
Mã mẫu luôn hữu ích.
BJ Patel

10
Liên kết với biểu mẫu onsubmit()gần như luôn luôn tốt hơn so với ràng buộc với nút onclick(), vì có nhiều cách khác để gửi biểu mẫu. (Đáng chú ý là nhấn returnphím.)
alttag

+1 Điều này thật tuyệt vời. không xác thực phương thức javascript nếu trường trống hoặc nếu đó là email. Trình duyệt có thể làm điều đó cho chúng tôi! Trình duyệt chéo này có tương thích không?
Jo E.

2
Không action="javascript:myFunction();"hoặc action="javascript:0"hoạt động nữa trong Firefox mới nhất (67). Hoạt động trên Chrome mặc dù.
Bobz

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

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

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

từ: xác thực mẫu html5


4
reportValidityđược chỉ được hỗ trợ bởi Chrome 40,0
MM

Đó là CoffeeScript.
amphetamachine

1
reportVality hiện được Firefox hỗ trợ kể từ phiên bản 49
Justin

Tôi thích phần này $("form")[0].reportValidity(). Tôi cần điều đó trong trường hợp kiểm tra tính hợp lệ là thất bại.
fsevenm

Tuyệt quá! Cảm ơn bạn!
stefo91

18

mã dưới đây làm việc cho tôi,

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

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

});

1
reportValidity()là chức năng tốt nhất để làm nổi bật các trường bắt buộc.
Jamshad Ahmad

Vâng, điều này không hoạt động như một bùa mê, nhưng chỉ khi trình duyệt hỗ trợ nó. caniuse.com/#search=reportValids
MegaMatt

16

Đây là một cách tổng quát hơn mà sạch sẽ hơn một chút:

Tạo biểu mẫu của bạn như thế này (có thể là một hình thức giả mà không làm gì):

<form class="validateDontSubmit">
...

Ràng buộc tất cả các hình thức mà bạn không thực sự muốn gửi:

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

Bây giờ hãy nói rằng bạn có một <a>(trong vòng <form>) mà khi nhấp vào bạn muốn xác thực mẫu:

$('#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'
});

Một số lưu ý ở đây:

  • Tôi đã nhận thấy rằng bạn không thực sự phải gửi biểu mẫu để xác thực xảy ra - cuộc gọi đến checkValidity()là đủ (ít nhất là bằng chrome). Nếu những người khác có thể thêm ý kiến ​​với việc kiểm tra lý thuyết này trên các trình duyệt khác, tôi sẽ cập nhật câu trả lời này.
  • Điều kích hoạt xác nhận không phải nằm trong <form>. Đây chỉ là một cách sạch sẽ và linh hoạt để có một giải pháp cho mục đích chung ..

12

Có thể bị trễ bữa tiệc nhưng bằng cách nào đó tôi đã tìm thấy câu hỏi này trong khi cố gắng giải quyết vấn đề tương tự. Vì không có mã từ trang này làm việc cho tôi, trong khi đó tôi đã đưa ra giải pháp hoạt động như được chỉ định.

Vấn đề là khi <form>DOM của bạn chứa một <button>phần tử duy nhất , một khi được bắn, nó <button>sẽ tự động chuyển sang dạng. Nếu bạn chơi với AJAX, có lẽ bạn cần ngăn hành động mặc định. Nhưng có một nhược điểm: Nếu bạn chỉ làm như vậy, Bạn cũng sẽ ngăn xác thực HTML5 cơ bản. Do đó, đây là cách tốt để ngăn chặn mặc định trên nút đó chỉ khi biểu mẫu hợp lệ. Nếu không, xác thực HTML5 sẽ bảo vệ bạn khỏi việc gửi. jQuery checkValidity()sẽ giúp với điều này:

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
    }
  });
});

Mã được mô tả ở trên sẽ cho phép Bạn sử dụng xác thực HTML5 cơ bản (có khớp mẫu và loại) mà KHÔNG cần gửi mẫu.


6

Bạn nói về hai điều khác nhau "xác thực HTML5" và xác thực mẫu HTML bằng cách sử dụng javascript / jquery.

HTML5 "có" các tùy chọn tích hợp để xác thực một biểu mẫu. Chẳng hạn như sử dụng thuộc tính "bắt buộc" trên một trường, có thể (dựa trên việc triển khai trình duyệt) không gửi biểu mẫu mà không sử dụng javascript / jquery.

Với javascrip / jquery, bạn có thể làm một cái gì đó như thế này

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

2
Tôi muốn kích hoạt xác nhận mà không cần gửi biểu mẫu.
razenha

Theo cập nhật của bạn - tôi vẫn nghĩ rằng đây là giải pháp chính xác. Bạn đã không xác định cách bạn muốn kích hoạt triggerHtml5Validation()chức năng. Các mã trên sẽ đính kèm gửi sự kiện vào mẫu của bạn; khi gửi bạn chặn sự kiện và xác nhận mẫu. Nếu bạn không bao giờ muốn gửi biểu mẫu, chỉ cần return false;và việc gửi sẽ không bao giờ xảy ra.
Peter Pajchl

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

1
Rất tiếc, tôi + 1'ed @davi vì lúc đầu tôi đã nghĩ chính xác điều tương tự. Nhưng nó không thực sự giống nhau, vì chỉ return validkhông trả về false cho các giá trị null / không xác định. Nhưng nó không thực sự quan trọng, dù sao câu trả lời là mã giả, vấn đề là: sử dụng return false để không gửi biểu mẫu ^^
T_D

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

Nó không hoạt động trên chrome 74. Tôi có thể chiếu sáng nó không?
codexplorer

3

Để kiểm tra tất cả các trường bắt buộc của biểu mẫu mà không sử dụng nút gửi, bạn có thể sử dụng chức năng bên dưới.

Bạn phải gán thuộc tính cần thiết cho các điều khiển.

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

3

Bạn không cần jQuery để đạt được điều này. Trong mẫu của bạn thêm:

onsubmit="return buttonSubmit(this)

hoặc bằng JavaScript:

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

Trong buttonSubmitchức năng của bạn (hoặc bạn gọi nó là gì), bạn có thể gửi biểu mẫu bằng AJAX. buttonSubmitsẽ chỉ được gọi nếu biểu mẫu của bạn được xác thực trong HTML5.

Trong trường hợp điều này giúp bất cứ ai, đây là buttonSubmitchức năng của tôi :

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;
}

Một số biểu mẫu của tôi chứa nhiều nút gửi, do đó dòng này if (submitvalue == e.elements[i].value). Tôi đặt giá trị của submitvalueviệc sử dụng một sự kiện nhấp chuột.


2

Tôi đã có một tình huống khá phức tạp, nơi tôi cần nhiều nút gửi để xử lý những thứ khác nhau. Ví dụ: Lưu và Xóa.

Cơ sở là nó cũng không phô trương, vì vậy tôi không thể biến nó thành một nút bình thường. Nhưng cũng muốn sử dụng xác nhận html5.

Đồng thời, sự kiện gửi đã bị ghi đè trong trường hợp người dùng nhấn enter để kích hoạt trình gửi mặc định dự kiến; trong ví dụ này lưu.

Dưới đây là những nỗ lực xử lý biểu mẫu để vẫn hoạt động với / không có javascript và với xác thực html5, với cả sự kiện gửi và nhấp.

jsFiddle Demo - Xác thực HTML5 bằng cách gửi và nhấp vào ghi đè

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);

Nhắc nhở khi sử dụng Javascript là onclick mặc định của trình duyệt phải lan truyền đến sự kiện gửi PHẢI xảy ra để hiển thị các thông báo lỗi mà không hỗ trợ mỗi trình duyệt trong mã của bạn. Mặt khác, nếu sự kiện nhấp được ghi đè bằng event.preventDefault () hoặc trả về false, nó sẽ không bao giờ lan truyền đến sự kiện gửi của trình duyệt.

Điều cần chỉ ra là trong một số trình duyệt sẽ không kích hoạt biểu mẫu gửi khi người dùng nhấn enter, thay vào đó, nó sẽ kích hoạt nút gửi đầu tiên trong biểu mẫu. Do đó, có một console.log ('mẫu gửi') để cho thấy rằng nó không kích hoạt.


Chúng tôi hoàn toàn biết rằng điều này có thể được thực hiện mà không cần jQuery, nhưng tiêu đề của OP là chủ đề của chủ đề này: "Cách buộc xác thực mẫu html5 mà không gửi nó qua jQuery", rõ ràng đề xuất jQuery phải được sử dụng.
vzr

@vzr Câu trả lời của tôi sử dụng jQueryrõ ràng. Nó khác ở chỗ nó xử lý việc xác thực HTML5 bằng nhiều nút gửi và ngăn việc gửi biểu mẫu AJAX khi không hợp lệ. Mặc định cho savehành động khi người dùng nhấn enterphím trên bàn phím. Vào thời điểm tôi đăng bài, không có câu trả lời nào được cung cấp là giải pháp cho nhiều nút gửi hoặc việc nắm bắt phím enter để ngăn việc gửi ajax.
fyrye

2

Bạn có thể làm điều đó mà không cần gửi mẫu.

Ví dụ: nếu nút gửi biểu mẫu với id "tìm kiếm" ở dạng khác. Bạn có thể gọi sự kiện nhấp vào nút gửi đó và gọi ev.preventDefault sau đó. Đối với trường hợp của tôi, tôi xác nhận mẫu B từ mẫu A nộp. Như thế này

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

2

Cách này hoạt động tốt với tôi:

  1. Thêm onSubmitthuộc tính trong của bạn form, đừng quên bao gồm returntrong giá trị.

    <form id='frm-contact' method='POST' action='' onSubmit="return contact()">
  2. Xác định hàm.

    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); });

không phải là một câu trả lời tốt nhất nhưng làm việc cho tôi


1

Tôi biết điều này đã được trả lời, nhưng tôi có một giải pháp khả thi khác.

Nếu sử dụng jquery, bạn có thể làm điều này.

Trước tiên, hãy tạo một vài tiện ích mở rộng trên jquery để bạn có thể sử dụng lại các tiện ích này khi cần.

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

Tiếp theo làm một cái gì đó như thế này, nơi bạn muốn sử dụng nó.

<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
$(document).on("submit", false);

submitButton.click(function(e) {
    if (form.checkValidity()) {
        form.submit();
    }
});

$ (tài liệu) .on ("gửi", sai); // cái này hoạt động hoàn hảo, đây là thứ tôi đang tìm kiếm :)
Akshay Shrivastav

1

Điều này làm việc với tôi để hiển thị các thông báo lỗi HTML 5 gốc với xác thực mẫu.

<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');

}


});

Lưu ý: RegForm là form id.

Tài liệu tham khảo

Hy vọng giúp được ai đó.


bạn phải thêm sự kiện để kích hoạt nút gửi bị vô hiệu hóa
talsibony

1

Đây là một cách khá đơn giản để HTML5 thực hiện xác thực cho bất kỳ biểu mẫu nào, trong khi vẫn có quyền kiểm soát JS hiện đại đối với biểu mẫu. Thông báo trước duy nhất là nút gửi phải nằm trong <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

Tôi nghĩ rằng cách tiếp cận tốt nhất

sẽ sử dụng plugin Xác thực jQuery , sử dụng thực tiễn tốt nhất để xác thực mẫu và nó cũng có hỗ trợ trình duyệt tốt. Vì vậy, bạn không cần phải lo lắng về các vấn đề tương thích trình duyệt.

Và chúng ta có thể sử dụng hàm hợp lệ () của jQuery để kiểm tra xem biểu mẫu đã chọn có hợp lệ hay không hoặc liệu tất cả các phần tử được chọn có hợp lệ hay không mà không gửi biểu mẫu.

<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

Theo câu hỏi tính hợp lệ của html5 nên có thể xác thực bằng cách sử dụng jQuery lúc đầu và trong hầu hết các câu trả lời, điều này không xảy ra và lý do cho điều này là như sau:

trong khi xác thực bằng cách sử dụng chức năng mặc định của mẫu html5

checkValidity();// returns true/false

chúng ta cần hiểu rằng jQuery trả về mảng đối tượng, trong khi chọn như thế này

$("#myForm")

do đó, bạn cần chỉ định chỉ mục đầu tiên để làm cho hàm checkValids () hoạt động

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

đây là giải pháp hoàn chỉnh:

<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);}
        });
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.