2013-03-30 38 views
31

Điều này phải đơn giản, nhưng điều đó khiến tôi phát điên. Tôi có một mẫu html5 mà tôi đang gửi với ajax. Nếu bạn nhập một giá trị không hợp lệ, có một phản hồi popup cho bạn biết như vậy. Làm cách nào tôi có thể kiểm tra xem các mục nhập có hợp lệ trước khi tôi gửi yêu cầu ajax của mình không?Xác thực HTML5 trước khi gửi ajax

dạng:

<form id="contactForm" onsubmit="return false;"> 
    <label for="name">Name:</label> 
    <input type="text" name="name" id="name" required placeholder="Name" /> 
    <label for="subject">Subject:</label> 
    <input type="text" name="subject" id="subject" required placeholder="Subject" /> 
    <label for="email">Email:</label> 
    <input type="email" name="email" id="email" required placeholder="[email protected]" /> 
    <label for="message">Message:</label> 
    <textarea name="message" id="message" required></textarea> 
    <input type="submit" id="submit"/> 
</form> 

nộp:

$('#submit').click(function(){ 
    var name = $("input#name").val(); 
    var subject = $("input#subject").val(); 
    var email = $("input#email").val(); 
    var message = $("input#message").val(); 

    var dataString = 'email=' + email + '&message=' + message + '&subject=' + subject + '&name=' + name ; 

    $.ajax({ 
     url: "scripts/mail.php", 
     type: 'POST', 
     data: dataString, 
     success: function(msg){ 
      disablePopupContact(); 
      $("#popupMessageSent").css("visibility", "visible"); 
     }, 
     error: function() { 
      alert("Bad submit"); 
     } 
    }); 
}); 

Trả lời

42

Theo mặc định, jQuery không biết gì về việc phê chuẩn HTML5, vì vậy bạn sẽ phải làm một cái gì đó như:

$('#submit').click(function(){ 
    if($("form")[0].checkValidity()) { 
     //your form execution code 
    }else console.log("invalid form"); 
}); 
+0

'return false' về sự kiện gửi, như được thực hiện bởi OP, là những gì tôi đang tìm kiếm .. –

+0

Trả về false (ngăn tác vụ mặc định) ... Xem câu trả lời từ csbarnes chính xác hơn. – Nuxwin

0

Không chắc chắn ý bạn là gì. Nhưng tôi cho rằng bạn muốn kiểm tra trong thời gian thực nếu đầu vào là hợp lệ. Nếu vậy bạn nên sử dụng .keyup thay vì sự kiện .click, vì điều này sẽ dẫn đến một hành động nếu người dùng nhấn gửi. Hãy xem http://api.jquery.com/keyup/

Với điều này, bạn có thể kiểm tra đầu vào bằng mỗi lần chèn và hiển thị ký tự mới, ví dụ: "không hợp lệ" cho đến khi xác thực của bạn đúng.

Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn!

4

Nếu bạn đang sử dụng xác thực biểu mẫu HTML5, bạn sẽ phải gửi yêu cầu ajax trong trình xử lý gửi của biểu mẫu. Trình xử lý gửi sẽ chỉ kích hoạt nếu biểu mẫu xác thực. Những gì bạn đang sử dụng là trình xử lý nhấn nút sẽ luôn kích hoạt vì nó không có liên kết với xác thực biểu mẫu. LƯU Ý: không phải tất cả các trình duyệt đều hỗ trợ xác thực biểu mẫu html5.

-3

U cũng có thể sử dụng phương thức xác thực jquery để xác thực biểu mẫu như

$ ("# id mẫu"). Validate();

trả về giá trị boolean dựa trên xác thực biểu mẫu & cũng bạn có thể thấy lỗi trong nhật ký sử dụng phương pháp errorList.

để sử dụng trên chức năng u phải bao gồm tập tin jquery.validate.js trong kịch bản của bạn

35

Nếu bạn liên kết với trường hợp nộp thay vì nhấp vào nó sẽ chỉ cháy nếu nó vượt qua xác nhận HTML5. Tốt nhất là nên thực hiện bộ nhớ cache bộ chọn jQuery của bạn trong các biến nếu bạn sử dụng nó nhiều lần, do đó bạn không cần phải điều hướng DOM mỗi khi bạn truy cập một phần tử. jQuery cũng cung cấp một hàm .serialize() sẽ xử lý việc phân tích dữ liệu biểu mẫu cho bạn.

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

$contactForm.on('submit', function(ev){ 
    ev.preventDefault(); 

    $.ajax({ 
     url: "scripts/mail.php", 
     type: 'POST', 
     data: $contactForm.serialize(), 
     success: function(msg){ 
      disablePopupContact(); 
      $("#popupMessageSent").css("visibility", "visible"); 
     }, 
     error: function() { 
      alert("Bad submit"); 
     } 
    }); 
}); 
+0

Đây phải là câu trả lời được chấp nhận khi xác thực HTML5 được kích hoạt trước khi gửi sự kiện. Về cơ bản, lắng nghe sự kiện gửi, sau đó ngăn chặn hành động mặc định nên thực hiện công việc. Không cần phải gọi phương thức checkValidity() như được hiển thị trong câu trả lời được chấp nhận vì nếu xác thực HTML5 không vượt qua, sự kiện gửi sẽ không được kích hoạt. – Nuxwin

+0

Mặc dù những gì bạn nói, nó được bắn mà không có bất kỳ loại xác nhận. Một phần mã của tôi: $ ('# begininstall').vào ('click', function() { $ ('# formbegininstall'). submit(); }); $ ('# formbegininstall'). On ('submit', function (ev) { ev.preventDefault(); var serializado = $ ('# formbegininstall'). Serialize(); $ .ajax ({ –

+0

Tôi không thể chỉnh sửa câu trả lời trước đây của mình. Vấn đề của tôi là tôi đã sử dụng liên kết để gửi ajax. Tất cả những gì tôi phải làm là thay thế liên kết bằng nút gửi. –

1

Tôi thích sử dụng trình xử lý gửi jQuery hơn, bạn sẽ vẫn nhận được phản hồi cho biểu mẫu của mình bằng phương pháp sau.

jQuery('#contactForm').on('submit', function (e) { 
    if (document.getElementById("contactForm").checkValidity()) { 
     e.preventDefault(); 
     jQuery.ajax({ 
      url: '/some/url', 
      method: 'POST', 
      data: jQuery('#contactForm').serialize(), 
      success: function (response) { 
       //do stuff with response 
      } 
     }) 
    } 
    return true; 
}); 
Các vấn đề liên quan