66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
/**
|
|
* 表单提交防重复:网络慢时禁用按钮并显示「提交中」。
|
|
*/
|
|
(function (global) {
|
|
"use strict";
|
|
|
|
function submitButtons(form) {
|
|
if (!form) return [];
|
|
return Array.prototype.slice.call(
|
|
form.querySelectorAll('button[type="submit"], input[type="submit"]')
|
|
);
|
|
}
|
|
|
|
function lockForm(form, label) {
|
|
if (!form) return false;
|
|
if (form.dataset.submitGuard === "locked") return false;
|
|
form.dataset.submitGuard = "locked";
|
|
form.classList.add("is-form-submitting");
|
|
submitButtons(form).forEach(function (btn) {
|
|
if (btn.dataset.submitGuardOrig === undefined) {
|
|
btn.dataset.submitGuardOrig =
|
|
btn.tagName === "BUTTON" ? btn.textContent : btn.value;
|
|
}
|
|
btn.disabled = true;
|
|
if (label) {
|
|
if (btn.tagName === "BUTTON") btn.textContent = label;
|
|
else btn.value = label;
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
|
|
function unlockForm(form) {
|
|
if (!form) return;
|
|
delete form.dataset.submitGuard;
|
|
form.classList.remove("is-form-submitting");
|
|
submitButtons(form).forEach(function (btn) {
|
|
btn.disabled = false;
|
|
var orig = btn.dataset.submitGuardOrig;
|
|
if (orig !== undefined) {
|
|
if (btn.tagName === "BUTTON") btn.textContent = orig;
|
|
else btn.value = orig;
|
|
delete btn.dataset.submitGuardOrig;
|
|
}
|
|
});
|
|
}
|
|
|
|
function isLocked(form) {
|
|
return !!(form && form.dataset.submitGuard === "locked");
|
|
}
|
|
|
|
/** 已通过前端校验,发起最终 POST(页面将跳转) */
|
|
function nativeSubmitOnce(form, label) {
|
|
if (!form) return;
|
|
lockForm(form, label || "提交中…");
|
|
form.submit();
|
|
}
|
|
|
|
global.FormSubmitGuard = {
|
|
lock: lockForm,
|
|
unlock: unlockForm,
|
|
isLocked: isLocked,
|
|
nativeSubmitOnce: nativeSubmitOnce,
|
|
};
|
|
})(typeof window !== "undefined" ? window : this);
|