data-request-validate
是一个自定义HTML属性,通常用于前端表单验证场景,表示该表单需要在提交前进行客户端验证。结合form_ajax()
函数,可以实现异步表单提交与验证的结合。
首先,在HTML表单中添加data-request-validate
属性:
<form id="myForm" data-request-validate="true" action="/submit" method="POST">
<input type="text" name="username" required minlength="3">
<input type="email" name="email" required>
<button type="submit">提交</button>
</form>
/**
* 处理带有验证的AJAX表单提交
* @param {HTMLFormElement} formElement - 表单DOM元素
* @param {Object} options - 配置选项
* @param {Function} options.onSuccess - 成功回调
* @param {Function} options.onError - 错误回调
*/
function form_ajax(formElement, options = {}) {
// 默认配置
const defaultOptions = {
onSuccess: () => {},
onError: () => {},
validateBeforeSubmit: true
};
const finalOptions = { ...defaultOptions, ...options };
// 检查是否需要验证
const shouldValidate = formElement.hasAttribute('data-request-validate') ||
finalOptions.validateBeforeSubmit;
// 表单提交处理器
async function handleSubmit(event) {
event.preventDefault();
if (shouldValidate && !formElement.checkValidity()) {
// 触发浏览器原生验证提示
formElement.reportValidity();
return;
}
try {
const formData = new FormData(formElement);
const response = await fetch(formElement.action, {
method: formElement.method,
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
finalOptions.onSuccess(data, response);
} catch (error) {
finalOptions.onError(error);
}
}
// 绑定事件
formElement.addEventListener('submit', handleSubmit);
}
// 获取表单元素
const form = document.getElementById('myForm');
// 初始化form_ajax
form_ajax(form, {
onSuccess: (data) => {
console.log('提交成功', data);
alert('表单提交成功!');
},
onError: (error) => {
console.error('提交失败', error);
alert('提交失败,请重试');
}
});
可以扩展form_ajax
函数以支持自定义验证:
function form_ajax(formElement, options = {}) {
// ...之前的代码...
async function handleSubmit(event) {
event.preventDefault();
if (shouldValidate) {
// 原生验证
if (!formElement.checkValidity()) {
formElement.reportValidity();
return;
}
// 自定义验证
if (options.customValidate && !options.customValidate(formElement)) {
return;
}
}
// ...提交逻辑...
}
// ...绑定事件...
}
form_ajax(form, {
customValidate: (form) => {
const password = form.querySelector('[name="password"]').value;
const confirmPassword = form.querySelector('[name="confirmPassword"]').value;
if (password !== confirmPassword) {
alert('两次输入的密码不一致');
return false;
}
return true;
},
// ...其他选项...
});
通过这种方式构建的form_ajax
函数可以很好地与data-request-validate
属性配合使用,实现灵活的表单验证和异步提交功能。
没有搜到相关的文章