Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我无法正确处理设置超时_Javascript_Jquery - Fatal编程技术网

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:)