ฉันมีแบบฟอร์มนี้ในแอพของฉันและฉันจะส่งทาง AJAX แต่ฉันต้องการใช้ HTML5 สำหรับการตรวจสอบลูกค้า ดังนั้นฉันจึงต้องการที่จะบังคับให้มีการตรวจสอบแบบฟอร์มอาจจะผ่าน jQuery
ฉันต้องการทริกเกอร์การตรวจสอบโดยไม่ต้องส่งแบบฟอร์ม เป็นไปได้ไหม?
ฉันมีแบบฟอร์มนี้ในแอพของฉันและฉันจะส่งทาง AJAX แต่ฉันต้องการใช้ HTML5 สำหรับการตรวจสอบลูกค้า ดังนั้นฉันจึงต้องการที่จะบังคับให้มีการตรวจสอบแบบฟอร์มอาจจะผ่าน jQuery
ฉันต้องการทริกเกอร์การตรวจสอบโดยไม่ต้องส่งแบบฟอร์ม เป็นไปได้ไหม?
คำตอบ:
ในการตรวจสอบว่าเขตข้อมูลนั้นถูกต้องหรือไม่ให้ใช้:
$('#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
$myForm.submit()
ด้วย$myForm.find(':submit').click()
$('<input type="submit">').hide().appendTo($myForm).click().remove();
checkValidity()
แต่ก็มีข้อผิดพลาดที่เป็นอันตรายด้วย checkValidity()
เป็นสิ่งที่ทริกเกอร์ข้อความแสดงข้อผิดพลาดของเบราว์เซอร์ดั้งเดิมไม่ใช่การคลิกปุ่มส่ง หากคุณมีผู้ฟังเหตุการณ์ที่ฟังการคลิกที่ปุ่มส่งคุณจะทริกเกอร์เมื่อคุณทำ $ $ myForm.find (': submit') คลิก () `ซึ่งจะเรียกตัวเองและทำให้เกิดการเรียกซ้ำไม่รู้จบ
ฉันพบวิธีแก้ปัญหานี้เพื่อใช้งานได้สำหรับฉัน เพียงเรียกใช้ฟังก์ชันจาวาสคริปต์ดังนี้:
action="javascript:myFunction();"
ถ้าอย่างนั้นคุณก็มีการตรวจสอบ html5 ... ง่ายมาก :-)
action="javascript:0"
บน<form>
และผูกพันclick
เหตุการณ์บน<button>
ไปMyFunction()
และทุกการทำงานที่ดี ฉันเลิกใช้จาวาทั้งหมดแล้ว MyFunction
สามารถทดสอบform.checkValidity()
เพื่อดำเนินการต่อ
onsubmit()
เชื่อมโยงกับแบบฟอร์มนั้นเกือบจะดีกว่าการเชื่อมโยงกับปุ่มonclick()
เสมอเนื่องจากมีวิธีอื่นในการส่งแบบฟอร์ม (สะดุดตาด้วยการกดปุ่มreturn
.)
action="javascript:myFunction();"
หรือaction="javascript:0"
ทำงานได้อีกต่อไปใน Firefox ล่าสุด (67) ทำงานบน Chrome ได้
if $("form")[0].checkValidity()
$.ajax(
url: "url"
type: "post"
data: {
}
dataType: "json"
success: (data) ->
)
else
#important
$("form")[0].reportValidity()
reportValidity
จะได้รับการสนับสนุนโดย Chrome 40.0
$("form")[0].reportValidity()
นี้ ฉันต้องการสิ่งนั้นในกรณีที่การตรวจสอบความถูกต้องล้มเหลว
รหัสด้านล่างใช้งานได้สำหรับฉัน
$("#btn").click(function () {
if ($("#frm")[0].checkValidity())
alert('sucess');
else
//Validate Form
$("#frm")[0].reportValidity()
});
reportValidity()
เป็นฟังก์ชั่นที่ดีที่สุดสำหรับการเน้นฟิลด์ที่จำเป็น
นี่เป็นวิธีทั่วไปที่สะอาดกว่า:
สร้างแบบฟอร์มของคุณเช่นนี้ (อาจเป็นรูปแบบจำลองที่ไม่ทำอะไรเลย):
<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>
สิ่งที่ก่อให้เกิดการตรวจสอบที่ไม่จำเป็นต้องเป็นภายใน นี่เป็นเพียงวิธีที่สะอาดและยืดหยุ่นในการแก้ปัญหาทั่วไปอาจจะสายไปงานเลี้ยง แต่อย่างใดฉันพบคำถามนี้ในขณะที่พยายามแก้ปัญหาที่คล้ายกัน เนื่องจากไม่มีรหัสจากหน้านี้ทำงานสำหรับฉันในขณะที่ฉันมากับวิธีแก้ปัญหาที่ทำงานตามที่ระบุ
ปัญหาคือเมื่อ<form>
DOM ของคุณมี<button>
องค์ประกอบเดียวเมื่อถูกไล่ออกนั่น<button>
จะเป็นรูปแบบโดยอัตโนมัติ หากคุณเล่นด้วย AJAX คุณอาจต้องป้องกันการกระทำเริ่มต้น แต่มีการจับคือถ้าคุณทำเช่นนั้นคุณจะป้องกันการตรวจสอบ HTML5 ขั้นพื้นฐาน ดังนั้นจึงเป็นการโทรที่ดีเพื่อป้องกันค่าเริ่มต้นที่ปุ่มนั้นเฉพาะเมื่อแบบฟอร์มนั้นถูกต้อง มิฉะนั้นการตรวจสอบ HTML5 จะปกป้องคุณจากการส่ง jQuery checkValidity()
จะช่วยในเรื่องนี้:
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 พื้นฐาน (พร้อมการจับคู่ประเภทและรูปแบบ) โดยไม่ต้องส่งแบบฟอร์ม
คุณพูดถึงสองสิ่ง "การตรวจสอบความถูกต้องของ HTML5" และการตรวจสอบความถูกต้องของรูปแบบ HTML โดยใช้ javascript / jquery
HTML5 "มี" ตัวเลือกในตัวสำหรับการตรวจสอบความถูกต้องของฟอร์ม เช่นการใช้แอตทริบิวต์ "ต้อง" ในเขตข้อมูลซึ่งอาจ (ขึ้นอยู่กับการใช้งานเบราว์เซอร์) ล้มเหลวในการส่งแบบฟอร์มโดยไม่ต้องใช้ javascript / jquery
ด้วย javascrip / jquery คุณสามารถทำสิ่งนี้ได้
$('your_form_id').bind('submit', function() {
// validate your form here
return (valid) ? true : false;
});
triggerHtml5Validation()
ฟังก์ชันอย่างไร รหัสด้านบนจะแนบส่งกิจกรรมไปยังแบบฟอร์มของคุณ เมื่อส่งคุณดักกิจกรรมและตรวจสอบความถูกต้องของแบบฟอร์ม หากคุณไม่เคยต้องการที่จะส่งแบบฟอร์มเพียงreturn false;
และการส่งจะไม่เกิดขึ้น
return (valid) ? true : false
return valid
=== :)
return valid
ไม่ส่งคืนค่าเท็จสำหรับค่า null / undefined แต่มันไม่สำคัญจริงๆคำตอบคือหลอกรหัสต่อไปประเด็นคือ: ใช้ return false เพื่อไม่ส่งแบบฟอร์ม ^^
var $myForm = $('#myForm ');
if (!$myForm[0].checkValidity()) {
$('<input type="submit">').hide().appendTo($myForm).click().remove();
}
ในการตรวจสอบฟิลด์ที่จำเป็นทั้งหมดของแบบฟอร์มโดยไม่ต้องใช้ปุ่มส่งคุณสามารถใช้ฟังก์ชั่นด้านล่าง
คุณต้องกำหนดคุณสมบัติที่จำเป็นให้กับการควบคุม
$("#btnSave").click(function () {
$(":input[required]").each(function () {
var myForm = $('#form1');
if (!$myForm[0].checkValidity())
{
$(myForm).submit();
}
});
});
คุณไม่จำเป็นต้องมี 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
ใช้งานคลิกเหตุการณ์
ฉันมีสถานการณ์ที่ค่อนข้างซับซ้อนซึ่งฉันต้องการปุ่มส่งหลายปุ่มเพื่อดำเนินการสิ่งต่าง ๆ ตัวอย่างเช่นบันทึกและลบ
พื้นฐานก็คือมันก็ไม่เป็นการรบกวนดังนั้นฉันจึงไม่สามารถทำให้มันเป็นปุ่มปกติ แต่ยังต้องการใช้การตรวจสอบ html5
เช่นกันเหตุการณ์ส่งถูกแทนที่ในกรณีที่ผู้ใช้กด Enter เพื่อทริกเกอร์การส่งเริ่มต้นที่คาดไว้ ในตัวอย่างนี้บันทึก
นี่คือความพยายามของการประมวลผลของแบบฟอร์มที่จะยังคงทำงานโดยมี / ไม่มี javascript และการตรวจสอบความถูกต้อง 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 คือการคลิกเริ่มต้นของเบราว์เซอร์ต้องเผยแพร่สู่เหตุการณ์ส่งต้องเกิดขึ้นเพื่อแสดงข้อความแสดงข้อผิดพลาดโดยไม่สนับสนุนแต่ละเบราว์เซอร์ในรหัสของคุณ มิฉะนั้นหากเหตุการณ์การคลิกถูกแทนที่ด้วย event.preventDefault () หรือส่งคืนค่าเท็จจะไม่เผยแพร่ไปยังกิจกรรมส่งของเบราว์เซอร์
สิ่งที่จะชี้ให้เห็นคือในบางเบราว์เซอร์จะไม่ทริกเกอร์การส่งแบบฟอร์มเมื่อผู้ใช้กดป้อน แต่มันจะทริกเกอร์ปุ่มส่งครั้งแรกในแบบฟอร์ม ดังนั้นจึงมี console.log ('ส่งแบบฟอร์ม') เพื่อแสดงว่ามันไม่ได้ทริกเกอร์
jQuery
อย่างชัดเจน มันแตกต่างกันที่จะจัดการกับการประมวลผลการตรวจสอบ HTML5 ด้วยปุ่มส่งหลายและป้องกันการส่งแบบฟอร์ม AJAX เมื่อไม่ถูกต้อง เริ่มต้นsave
การดำเนินการเมื่อผู้ใช้กดenter
ปุ่มบนแป้นพิมพ์ ซึ่งตอนที่ฉันโพสต์ไม่มีคำตอบที่ให้ไว้เป็นวิธีแก้ปัญหาสำหรับปุ่มส่งหลายปุ่มหรือการจับปุ่ม Enter เพื่อป้องกันการส่ง ajax
คุณสามารถทำได้โดยไม่ต้องส่งแบบฟอร์ม
ตัวอย่างเช่นหากปุ่มส่งแบบฟอร์มที่มี id "ค้นหา" อยู่ในรูปแบบอื่น คุณสามารถโทรคลิกเหตุการณ์ที่ปุ่มส่งและโทร ev.preventDefault หลังจากนั้น สำหรับกรณีของฉันฉันตรวจสอบแบบฟอร์ม B จากการส่งแบบฟอร์ม แบบนี้
function validateFormB(ev){ // DOM Event object
//search is in Form A
$("#search").click();
ev.preventDefault();
//Form B validation from here on
}
วิธีนี้ใช้ได้ดีสำหรับฉัน:
เพิ่มonSubmit
แอตทริบิวต์ในของคุณform
อย่าลืมที่จะรวมreturn
ไว้ในค่า
<form id='frm-contact' method='POST' action='' onSubmit="return contact()">
กำหนดฟังก์ชั่น
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;
}
$("#form").submit(function() { $("#saveButton").attr("disabled", true); });
ไม่ใช่คำตอบที่ดีที่สุด แต่ใช้ได้สำหรับฉัน
ฉันรู้ว่าสิ่งนี้ได้รับคำตอบแล้ว แต่ฉันมีวิธีแก้ไขปัญหาอื่นที่เป็นไปได้
หากใช้ 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>
$(document).on("submit", false);
submitButton.click(function(e) {
if (form.checkValidity()) {
form.submit();
}
});
สิ่งนี้ทำงานได้แบบฉันเพื่อแสดงข้อความแสดงข้อผิดพลาด 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
เป็น
หวังว่าจะช่วยให้ใครบางคน
นี่เป็นวิธีการที่ตรงไปตรงมาในการทำให้ 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...
}
ฉันคิดว่าวิธีที่ดีที่สุด
จะใช้ปลั๊กอินการตรวจสอบ jQueryซึ่งใช้แนวปฏิบัติที่ดีที่สุดสำหรับการตรวจสอบความถูกต้องของฟอร์มและยังมีการสนับสนุนเบราว์เซอร์ที่ดี ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับปัญหาความเข้ากันได้ของเบราว์เซอร์
และเราสามารถใช้ฟังก์ชั่นตรวจสอบความถูกต้อง 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>
ตามคำถาม 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);}
});
}
}