Javascript 我无法正确处理设置超时
我试图只在字段模糊且计时器结束时提交表单 下面是我的想法:Javascript 我无法正确处理设置超时,javascript,jquery,Javascript,Jquery,我试图只在字段模糊且计时器结束时提交表单 下面是我的想法: function adminRefresh() { $("input").blur(function() { $(this).css('background-color', "pink"); setTimeout(delayedSubmit, 15000); }); }; function delayedSubmit() { $.ajax({ url: $('#r
function adminRefresh() {
$("input").blur(function() {
$(this).css('background-color', "pink");
setTimeout(delayedSubmit, 15000);
});
};
function delayedSubmit() {
$.ajax({
url: $('#refresh').attr("action"),
type: "POST",
data: $('#refresh').serialize(),
dataType: 'js',
success: function(response) {}
});
}
下面是调用函数时我的HTML代码示例:
<tr>
<td><p>Téléphone</p></td>
<td class='float-label'>
<%= f.input: phone_number, label: false %>
</td>
</tr>
电话
基本上,我希望在字段模糊15秒后触发delayedSubmit
功能。但是,它一直被提交,没有做任何事情
有什么帮助吗?非常感谢 像这样的
//延迟了2秒,因此您不必等待20秒进行测试
var delayDuration=2000//以毫秒计
var trigger=document.getElementById('trigger');
trigger.addEventListener('blur',function(){
setTimeout(函数(){
console.log(“模糊”);
//在这里发送请求
}延迟时间);
});代码>
问题在于您设置setTimeout
语句的方式
您在blur
上添加了setTimeout
,因此每次字段模糊时setTimeout(delayedSubmit,15000)代码>将被执行,15秒后表单将被提交
可以通过添加以下条件来解决此问题:
var isHandlerAttached = null;
$("input").blur(function(){
$(this).css('background-color', 'pink');
if (isHandlerAttached) {
clearTimeout(isHandlerAttached);
}
isHandlerAttached = setTimeout(delayedSubmit, 15000);
});
只有在字段模糊至少15秒后,才能执行delayedSubmit
除此之外,您还应该考虑以下几点:
只执行一次。如果要多次执行,则会多次添加blur
处理程序,并多次执行,这将多次提交表单
添加条件以在表单提交后停止提交表单。您可以通过使用另一个变量isFormSubmitted
并将其初始值设置为false来完成此操作。在delayedSubmit()
函数中检查它,如果它为false,则只执行该函数。并在delayedSubmit()
函数末尾或在ajax的成功响应中(以适合您的为准)将其值设置为true
李>
您何时调用adminRefresh()
?给出您所展示的最小代码示例,那么您所得到的应该可以工作。如果你能看到一个更完整的代码摘录,以及当一个字段在一个类型表单上模糊时,我会调用它的HTMLI,这会有很大帮助。我会编辑我的代码,这样你们就可以看到。“当一个字段在一个类型表单上模糊时,我会调用它”…嗯$(“输入”).blur的回调是字段模糊时的调用。但是需要调用adminRefresh,以便首先设置“模糊”事件处理程序。如果每次事件模糊时都调用adminRefresh,那么您也会不断添加越来越多的“模糊”事件处理程序。这个逻辑是有缺陷的。所以你在模糊字段时调用adminRefresh()
函数?如果是这样,那就是你的问题。当某个事件发生时,您正在为该事件创建一个事件处理程序,因此当该事件下次发生时,事件处理程序将触发两次,下次触发三次,依此类推。要解决这个问题,只需删除adminRefresh()
函数,并在页面加载时绑定blur()
处理程序,这是一个很好的解释!谢谢,这在我脑子里更清楚了一点。然而,倒计时仍然不起作用。我会想办法弄清楚到底出了什么问题,我成功了!我以错误的方式调用了delayedSubmit()
函数。。。再次感谢,这很清楚!很高兴这有帮助。如果这是正确答案,则应将其设置为“已接受答案”。欢迎来到StackOverflow:)