防止 AJAX 重复提交是一个常见的需求,尤其是在用户可能会多次点击提交按钮的情况下。以下是一些基础概念和相关解决方案:
在用户点击提交按钮后,立即禁用该按钮,防止用户再次点击。
document.getElementById('submitBtn').addEventListener('click', function() {
var btn = this;
btn.disabled = true;
btn.innerHTML = '提交中...';
var xhr = new XMLHttpRequest();
xhr.open('POST', '/submit', true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
btn.disabled = false;
btn.innerHTML = '提交';
// 处理成功后的逻辑
}
};
xhr.send();
});
通过防抖或节流技术限制函数的执行频率。
function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
document.getElementById('submitBtn').addEventListener('click', debounce(function() {
var xhr = new XMLHttpRequest();
xhr.open('POST', '/submit', true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// 处理成功后的逻辑
}
};
xhr.send();
}, 1000));
在每次请求时生成一个唯一的 Token,并将其存储在 Session 或 Cookie 中。服务器端验证 Token 的唯一性,防止重复提交。
// 前端代码
document.getElementById('submitBtn').addEventListener('click', function() {
var token = generateToken(); // 生成唯一 Token
var xhr = new XMLHttpRequest();
xhr.open('POST', '/submit', true);
xhr.setRequestHeader('X-CSRF-Token', token);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// 处理成功后的逻辑
}
};
xhr.send();
});
// 后端代码(Node.js 示例)
app.post('/submit', function(req, res) {
const token = req.headers['x-csrf-token'];
if (validateToken(token)) { // 验证 Token 是否有效
// 处理提交逻辑
res.send('提交成功');
} else {
res.status(403).send('重复提交');
}
});
通过上述方法可以有效防止 AJAX 重复提交,提升系统的稳定性和用户体验。
领取专属 10元无门槛券
手把手带您无忧上云