Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >setInterval中的Javascript setTimeout

setInterval中的Javascript setTimeout
EN

Stack Overflow用户
提问于 2013-07-14 07:16:56
回答 2查看 2.1K关注 0票数 1

我这里有个问题..我使用setInterval函数将页面加载到div中,每30秒加载一次。好吧..。在该页面中,我有另一个setInterval函数,它由每秒更改一个数字倒计时组成。问题是,一次倒计时会跳过3秒,即使它必须在1秒内回调。就像: 01:24 -> 01:21 -> 01->19...

下面是我的第一个setinterval的代码:

代码语言:javascript
运行
AI代码解释
复制
<script>
    var t;
    t=setInterval(function(){
        $.get('<?=return_url("php/home_new.php");?>', { k: "1" } ).done(function(data){
            if(data)$("#ex_start_test").html(data);});
        },
        30000
    );
</script>

以及倒计时的代码:

代码语言:javascript
运行
AI代码解释
复制
<?
$query=q_return("SELECT nume, cod, data, MINUTE(data_start) as minute, data_start FROM chestionare WHERE data_start>date_sub(now(), interval 2 minute)");?>

<script>
    var timp_c="<?=$query['minute'];?>";
    var sec;
    var min;
    $.get('<?=return_url("php/getimp.php");?>', { k: "sec" } ).done(function(data){sec=data;});
    $.get('<?=return_url("php/getimp.php");?>', { k: "min" } ).done(function(data){min=data;});

    setTimeout(refresh, 1000);

    function refresh(){
        if(sec>=1){
            sec=sec-1; 
        }else{
            min=min-1;
            sec=59;
        }

        if(sec<10){
            $("span#ex_start_timp_ramas_sec").each(function(){
                $(this).html("0"+sec);
            });
        }else{
            $("span#ex_start_timp_ramas_sec").each(function(){
                $(this).html(sec);
            });
        }
               $("span#ex_start_timp_ramas_min").each(function(){
            $(this).html(min);
        });

        if(sec==0 && min==0){
            //$("#ex_click_final").trigger('click');
            clearInterval(t);
            $("#ex_new_test").hide();
        }

        setTimeout(refresh, 1000);
    } 
</script>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-14 07:33:21

我猜您的问题在于,每次使用setInterval重新加载页面时,您都会产生另一个setTimeout链,而没有清除前一个链。

尝试保存timeoutId并将其清除,将其作为倒计时代码的第一件事。像这样的东西应该是有效的:

代码语言:javascript
运行
AI代码解释
复制
<?
$query=q_return("SELECT nume, cod, data, MINUTE(data_start) as minute, data_start FROM chestionare WHERE data_start>date_sub(now(), interval 2 minute)");?>

<script>
var timp_c="<?=$query['minute'];?>";
     var sec,
         min,
         timeoutId;
     $.get('<?=return_url("php/getimp.php");?>', { k: "sec" } ).done(function(data){sec=data;});
     $.get('<?=return_url("php/getimp.php");?>', { k: "min" } ).done(function(data){min=data;});

     if (timeoutId) {
         clearTimout(timeoutId);
     }

     timeoutId = setTimeout(refresh, 1000);

     function refresh(){
         if(sec>=1){
             sec=sec-1; 
         }else{
             min=min-1;
             sec=59;
         }

         if(sec<10){
             $("span#ex_start_timp_ramas_sec").each(function(){
                 $(this).html("0"+sec);
             });
         }else{
             $("span#ex_start_timp_ramas_sec").each(function(){
                 $(this).html(sec);
             });
         }

         $("span#ex_start_timp_ramas_min").each(function(){
             $(this).html(min);
         });

         if(sec==0 && min==0){
             //$("#ex_click_final").trigger('click');
             clearInterval(t);
             $("#ex_new_test").hide();
         }

         timeoutId = setTimeout(refresh, 1000);
    }
</script>
票数 0
EN

Stack Overflow用户

发布于 2013-07-14 08:00:18

我认为这里的问题是,您发出了两个Ajax请求,然后您希望启动计时器,但这些请求需要时间来执行,因为它们是异步的,这可以解释您看到的结果。

$.when()拯救了我们:

代码语言:javascript
运行
AI代码解释
复制
var $getsec = $.get('<?=return_url("php/getimp.php");?>', { k: "sec" } ),
$getmin = $.get('<?=return_url("php/getimp.php");?>', { k: "min" } );

$.when($getsec, $getmin).done(function($sec, $min) {
    min = $min[0]; // [0] = data
    sec = $sec[0];
    // start refresh
    setTimeout(refresh, 1000);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17637371

复制
相关文章
编程篇(006)-请写出以下代码的执行结果
(function() { fn(); var fn = function() { alert(1); } fn(); function fn() { alert(2) } })() 参考答案: 第一次弹出2,第二次弹出1 解析: // 变量提升之后的代码: (function() { function fn() { alert(2) } var fn; fn(); // 弹出2
齐丶先丶森
2022/05/12
2650
编程篇(007)-请写出以下代码的执行结果
以上两个例子中,除了var aValue = e;这一句位置不同:例1位于外层匿名函数中、例2位于内层匿名函数中,其他部分完全相同。为什么结果不同?
齐丶先丶森
2022/05/12
3280
hibernate for循环执行添加操作出错问题
hibernate插入对象的时候,对于id唯一,数据库设置为自增的时候执行完操作后会将id赋予该对象
陈灬大灬海
2018/09/12
8130
hibernate for循环执行添加操作出错问题
Oracle——无法在查询中执行 DML 操作
create or replace function test_f(id varchar2) return varchar2 is Result varchar2(100); begin insert into sfcs_temp_17109 (sn)values(id);
_一级菜鸟
2019/09/10
4.4K0
Oracle——无法在查询中执行 DML 操作
Oracle中执行truncate操作出现hang
同事说某套Oracle中有一张94G容量的表需要清空,用delete删除的,但是一直卡着。
bisal
2021/11/08
6880
JS动态添加表单
<script type=”text/javascript”> function addRow()<!–js实现添加一行内容!–> { var tr=document.createElement(“tr”); var td=document.createElement(“td”); var input=document.createElement(“input”); input.setAttribute(“type”,”file”); input.setAttribute(“name”,”image[]”)
苦咖啡
2018/05/07
14.2K0
oracle 添加执行上一条指令 安装rlwrap
https://linux.linuxidc.com/index.php?folder=cHViLzIwMTEvMDcvMDQvcmx3cmFw rpm -ivh http://mirror.cent
用户5760343
2022/05/20
3930
Oracle 利用执行计划来避免排序操作
在Oracle中,利用index来避免排序 SQL> CREATE TABLE T_NOSORT (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30) NOT NULL); SQL> CREATE INDEX IND_T_NOSORT_NAME ON T_NOSORT(NAME); SQL> INSERT INTO T_NOSORT SELECT ROWNUM, TABLE_NAME FROM USER_TABLES; SQL> COMMIT; SQL> SET AUTOT O
星哥玩云
2022/08/17
3430
Oracle中对临时表空间执行shrink操作
《Oracle一个诡异的临时表空间不足的问题》中提到对临时表空间执行shrink space的操作,以前一直理解只有对表能做shrink space的操作,但从官方文档看,11g开始,就可以对临时表空间执行相同的操作。
bisal
2022/09/19
5730
Oracle中对临时表空间执行shrink操作
《Oracle一个诡异的临时表空间不足的问题》中提到对临时表空间执行shrink space的操作,以前一直理解只有对表能做shrink space的操作,但从官方文档看,11g开始,就可以对临时表空间执行相同的操作。
bisal
2022/09/19
4920
14表单操作
表单操作 获取表单 获取表单元素 通过常规方式 Document对象方式。document.getElementById('form')等。 通过Document的属性forms ``document.forms` 返回结果为HTMLCollection。 通过表单的name名字。 此方法不推荐。因为在新版本的浏览器中可能不再支持。 如果返回结果为一个时类型为对象,多个时是集合。 获取表单组件元素 常规方式 Document对象方式。document.getElementById('form_input
Dreamy.TZK
2020/05/15
3860
ElementUI动态添加表单项
chao超的搬运文章
2023/10/15
3310
Hplus框架动态添加选项卡功能(扩展)
hplus框架确实是后端开发人员的福音,但是有很多功能没有实现,我根据网上大神的做法,实现了动态添加选项卡来打开新页面的功能。
别团等shy哥发育
2023/02/25
7770
Hplus框架动态添加选项卡功能(扩展)
WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
  在前面一篇文章里面,我们实现了AvalonDock选项卡的动态添加,但是对于选项卡里面的内容,我们并没有实现任何有用的功能。   这篇文章里面,我们将实现对选项卡里面的内容和功能实现自定义。 完整系列   ● 第一部分   ● 第二部分   ● 第三部分 在Git中下载工程源码
全栈程序员站长
2022/09/13
1.7K0
WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
JQuery表格表单操作
1、多选框应用代码示例 <form action=”#” method=”post”> 你喜欢的明星是?<br /> <input type=”checkbox” name=”boxs” value=”张嘉译” id=”1″ /><label for=”1″>张嘉译</label> <input type=”checkbox” name=”boxs” value=”周润发” id=”2″ /><label for=”2″>周润发</label> <input type=”checkbox” name=”bo
苦咖啡
2018/05/07
1.6K0
jquery 操作表单表格
$("tr:contains('王五')").addClass("selected")
用户5760343
2019/10/08
1.6K0
jquery 操作表单表格
oracle添加not null约束
大家好,又见面了,我是你们的朋友全栈君。在创建表时,为列添加not null约束,形式如下: column_name data_type [constraint constraint_name] not null 其中,constraint constraint_name 表示为约束指定名称。 也可以为已创建的表中添加not null约束,这时就需要使用alter table… modify语句,形式如下: alter table table_name modify column_name [constraint constraint_name] not null;
全栈程序员站长
2022/09/06
8130
用 PyQt 打造具有专业外观的 GUI
如果您一直在创建表单以执行将数据输入数据库等操作,那么QFormLayout适合您。此类将小部件布置为两列布局。第一列通常显示描述预期输入的标签,第二列通常包含允许用户输入或编辑数据的输入小部件,例如QLineEdit,QComboBox或QSpinBox。
sergiojune
2021/07/19
2.9K0
用 PyQt 打造具有专业外观的 GUI
Contact Form 7插件添加表单教程
作为一个网站所有者,你绝对应该学习如何添加一个联系表单到WordPress。你的网站不是一个匿名实体。大多数人都想知道,偶尔也会和他们所读内容背后的人互动。你认为为什么会有作者简介和博客评论?今天外贸
Hoan外贸建站
2020/12/03
1.9K0
dreamweaver添加表单_dreamweaver网页制作代码
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169646.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
1.8K0
dreamweaver添加表单_dreamweaver网页制作代码

相似问题

如何构造Python包(?)要向各个模块添加文件,请执行以下操作

13

要向选项卡添加更具描述性/更有意义的id名称,请执行以下操作

22

要添加文件,请执行以下操作

10

Jquery:如果选中单选按钮A,请执行以下操作。如果检查B,请执行以下操作

27

若要在表中添加列表项,请执行以下操作

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档