我在提交表单时使用 jquery $.post 。我想在单击按钮后禁用该按钮 5 秒钟,以避免多次提交表单。
这是我现在所做的:
$('#btn').click(function(){
$.post(base_url + 'folder/controller/function',$('#formID').serialize(),function(data){
$('#message').slideDown().html('<span>'+data+'</span>');
});
});
我之前使用过fadeIn和fadeOut,但是当我测试快速点击按钮时仍然不起作用。我应该做什么才能实现我想要发生的事情?
你可以像这样做你想做的事:
var fewSeconds = 5;
$('#btn').click(function(){
// Ajax request
var btn = $(this);
btn.prop('disabled', true);
setTimeout(function(){
btn.prop('disabled', false);
}, fewSeconds*1000);
});
或者你可以使用 jQuery 的
.complete()
方法,该方法在 ajax 收到响应后执行:
$('#btn').click(function(){
var btn = $(this);
$.post(/*...*/).complete(function(){
btn.prop('disabled', false);
});
btn.prop('disabled', true);
});
编辑: 这是一个示例,服务器端响应延迟为 3 秒
即使这个答案已经有 8 年历史了,但仍然受到关注,而且 jQuery 越来越不受欢迎,我认为值得添加示例 不使用 jQuery
const fewSeconds = 3
document.querySelector('#btn').addEventListener('click', (e) => {
e.target.disabled = true
setTimeout(() => {
e.target.disabled = false
}, fewSeconds * 1000)
})
<input type='button' id="btn" value="click me" />
只需将其放入提交按钮所在页面的 JS 中
<script type="text/javascript">
$(document).ready(function(){
$("input[type='submit']").attr("disabled", false);
$("form").submit(function(){
$("input[type='submit']").attr("disabled", true).val("Please wait...");
return true;
})
})
</script>
在@Teneff回答的扩展中,如果表单中有多个提交按钮并且您希望在服务器端提供按钮的名称。
<script type="text/javascript">
var fewSeconds = 5;
$('button').click(function(){
var btn = $(this);
var text = btn.text();
setTimeout(function(){
btn.prop('disabled', true);
btn.text("Wait...");
}, 10);
setTimeout(function(){
btn.prop('disabled', false);
btn.text( text);
}, fewSeconds*1000);
});
<script>
看看 .success 函数这里这就是你所需要的。
所以你要做的就是禁用点击按钮
$('#btn').click(function(){
$('#btn').attr('disabled', true);
$.post(base_url + 'folder/controller/function', $('#formID').serialize(), function(data) {
// code on completion here
})
.success(function() {
$('#btn').attr('disabled', false);
})
});
});
这种方式更好,因为如果你的请求返回时间超过 5 秒会发生什么?
采用任何形式的按钮并将其值累加到变量中。将值替换为“请稍候...”,5 秒后将之前保存的变量传回并禁用为 false。
$('input[type=submit], input[type=button]').click(function(){
var btn = $(this);
var textd = btn.attr("value");
btn.prop('disabled', true);
btn.attr('value', 'Please wait...');
setTimeout(function(){
btn.prop('disabled', false);
btn.attr('value', textd);
}, fewSeconds*1000);
});
$('#btn').live('click', function () {
$(this).prop('disabled', true).delay(800).prop('disabled', false);
});
//或者
$('#btn').live('click', function () {
var obj = $(this);
obj.prop('disabled', true);
$.post(base_url + 'folder/controller/function', $('#formID').serialize(), function (data) {
$('#message').slideDown().html('<span>' + data + '</span>');
obj.prop('disabled', false);
});
});
DOM 查询:
let btn = document.querySelector('#your-button')
将临时DisableBtn()添加到事件监听器:
btn.addEventListener('click', function () {
// your extra code here
temporarilyDisableBtn(btn)
}
禁用和重新启用 btn 的代码:
function temporarilyDisableBtn(btn) {
btn.disabled = true;
setTimeout(function () {
btn.disabled = false;
}, 1000);
}
这是适用于大多数实现的通用解决方案。