JavaScript之关闭轮询定时器(setTimeout/clearTimeout|setInterval/clearInterval)小结-程序员宅基地

已知:

  1.1 开启Timeout程序: scope.setTimeout("functionName()" | functionHandle, timeValue) 返回值:timerID

  1.2 关闭Timeout程序: scope.clearTimeout(timerID);

  

  2.1 开启Interval程序: scope.setInterval("functionName()" | functionHandle, timeValue)  返回值:timerID

  2.2 关闭Interval程序: scope.clearInterval(timerID);

一、背景

  在替实验室小伙伴解决问题过程中,出现了这样一个问题:

    她用网页做了一个轮播图,利用不断地轮询setTimeout + 切换被轮播图片的css属性opacity:0/1来达到轮播效果;

    当网页加载后,图片轮播自动执行;当用户鼠标移动到图片轮播区域上时,立即停止轮播(即 清除 setTimeout定时器),而不是继续轮播图片(使用户看不到想看的图片内容,提高用户体验);

    然而,在全局域中,使用clearTimeout()方法可以实现,但在鼠标触发事件的函数内部调用,却失败,百思不得其解!(这个问题,实际上本文并没有解决!)

    为了解决这个需求,我模拟了这一个过程,并对setTimeout轮询方法与图片轮播的方法进行解耦(分离成为两个函数),然后在封装的轮询定时器Timer中依次调用图片轮播方法和setTimeout方法,同时在轮询过程中,总是记录最近(最后)一次setTimeout方法返回的timerID值,这一点很重要;

    最后:当鼠标滑过目标区域时,通过记录的最后一次timerID和clearTimeeout值来关闭图片轮播整个轮询

    【原理:即关闭最后一次(也是程序执行的最近一次)循环的timeID,使循环停止】

 

二、源码

  

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>demo setTimeout & clearTimeout</title>
</head>
<body>
    <ul>
        <li><a href="#"><input type="number" value="0"></a></li>
        <li><a href="#"><input type="number" value="1"></a></li>
    </ul>
    <script type="text/javascript">
        var aNodes = document.getElementsByTagName("a");
        var inputNodes = document.getElementsByTagName("input");
        
        //console.log('test:aNodes ' + aNodes.length);
        var changeNum =  function(){
            inputNodes[0].value = parseInt(inputNodes[0].value) + 1;
        };
        
        var a1_timeoutId;
        var timeIds = -1;
        var changeNumByTimer = function(){
            // a1_timeoutId = setTimeout(function(){
     
            changeNum();
            var timeKey = setTimeout("changeNumByTimer()",1000);
            timeIds = timeKey;
            console.log('test:当前的timeID:' + timeKey);
            // timeIds.push(timeKey);
            // setTimeout(changeNum,1000);
            
            // },1000);
        } 
        changeNumByTimer();

        //当鼠标滑过
        aNodes[0].onmouseover = function(){
            console.log('test:aNodes[0].onmouseover:' + "鼠标滑过a链接[0]");
            console.log('test:aNodes[0].onmouseover: timeIds '  + timeIds);
            // for(var i = 0; i < timeIds.length; i++){
     
            //     // clearTimeout(timeIds[i]);
            //     // console.log('test: 已经关闭了 timeID:' + timeIds[i]);
            //      //clearTimeout(timeIds[timeIds.length-1]);
            //      //console.log('test: 已经关闭了 timeID:' + timeIds[timeIds.length-1]);
            
            // }
            clearTimeout(timeIds);
            console.log('test: 已经关闭了 timeID:' + timeIds);
            
        }
    </script>
</body>
</html>

 

三、效果

  

  

四、总结

  1.成功解决了需求的技术问题。

  2.其实并没有解决我们最初的问题:

    2.1 为什么全局域中可以关闭,而在onmouseover(鼠标滑过事件)函数中无法关闭的问题

  

  3.参考文档:

    MDN:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval

  4.欢迎小伙伴交流这一问题~

 

 

    

转载于:https://www.cnblogs.com/johnnyzen/p/7282116.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30301183/article/details/97173428

智能推荐

c语言1 4的商,c语言1-4章题答案.doc-程序员宅基地

文章浏览阅读60次。c语言1-4章题答案1-4章习题习题1-5#includevoid main printf "**************************\n\n" ; printf " Very Good!\n\n" ; printf "**************************\n" ; 习题1-6#includevoid main int a,b,c,max;printf "plea..._c语言的商

Vue集成百度地图实现位置选择_百度地图 vue 搜索下拉选择-程序员宅基地

文章浏览阅读3.7k次,点赞10次,收藏78次。Vue基础百度地图实现位置选择需求:添加门店时,需要选择门店的省、市、区、详细地址、以及门店的经纬度信息。解决方案:集成百度地图API,通过在地图上搜索或者点击获取门店的具体位置信息。......_百度地图 vue 搜索下拉选择

20080529转载:GridView 数据控件的七种字段类型(Fields Type)的应用-程序员宅基地

文章浏览阅读97次。9.8 数据控件的七种字段类型(Fields Type)的应用GridView共支持七种字段类型,字段原本应该叫“Column”比较恰当,但ASP.NET 2.0却采用另一个名称“Field”来表示,对于名称的命名祭司认为有点不直观,因为不明的人看了根本不知道Field代表什么东西,但既然ASP.NET 2.0使用了Field,各位就迁就一下,表9-6为GridView支持七种字段类型的说明..._[datafield("",type=)]

android-高效开发命令汇总-程序员宅基地

文章浏览阅读66次。2019独角兽企业重金招聘Python工程师标准>>> ..._androⅰd编程语句大全 site:blog.csdn.net

linux里命令的对话框whiptail-程序员宅基地

文章浏览阅读272次。Linux里面可以在命令行里形成对话框,用光标上下,左右选择,一屏一屏的问答选择,填写。whiptail是Linux不需要另行安装,默认就有的,其它的比如dialog需要另行安装,很麻烦,虽然功能比较好些。帖一个写好的东西。#!/bin/bashtrap "" 2while truedoOPTION=$(whiptail --title "Email Manager" --n..._linux whiptail 自动关闭

R语言第二章作业_.r .cxrrrr i rrzszdxx人. the rx dyfe.ifdbf. the ddr-程序员宅基地

文章浏览阅读987次,点赞2次,收藏6次。致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习过程中遇到的问题和思考,一方面是希望能够帮助到很多和自己一样处于困惑的读者。> 由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。GitHub链接https://github.com/wfy-belief尽管现在我的水平可能还不太及格,但我会尽我自己所能,做到最好。——天地有正气,杂然赋流形。下则为河岳,上则为日星。码文不易,可以给我._.r .cxrrrr i rrzszdxx人. the rx dyfe.ifdbf. the ddrxf自然段,人

随便推点

深度学习论文翻译解析(二):An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Ap...-程序员宅基地

文章浏览阅读1.5k次。论文标题:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition论文作者: Baoguang Shi, Xiang Bai and Cong Yao论文代码的下载地址:http://mc.eistar.n..._转录层与连接时间分类

dom4j生成、解析xml-程序员宅基地

文章浏览阅读64次。Java代码 /** *创建xml *@paramobj泛型对象 *@paramentityPropertys泛型对象的List集合 *@paramEncodeXML自定义编码类型 *@paramXMLPathXML文件的路径及文件名..._dom4j生成解析xml

vscode代码格式化js自动换行问题_vscode格式化定义js换行规则-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏8次。vscode代码格式化js自动换行问题如果设置了默认格式化是使用自带JavaScript和Typescript的语言功能会看的吐血类似下面这种// 使用自带JavaScript和Typescript的语言功能 var a = $(this) .closest('.b') .find('.c .d') .val() var e = '<div class="sadasd-asd-sda-ashide">' + $input + '<ul _vscode格式化定义js换行规则

ListView中嵌套ViewPager(ViewPager是item的一部分),并且存在判断位置的小白点。...-程序员宅基地

文章浏览阅读55次。============问题描述============ 被bug困扰了好久:1.白点会出现混乱,有的时候是正常的,有的时候会不动(如果界面只有一个item,白点可以正常切换,有两个item就会不动)。2.当有两个item时,如果滑动上一个item图片与下一个item一样时,下面的item的图片就会消失。本人新手,贴上代码,求各位大神..._listview 嵌套viewpager viewpager item复原

详解三次握手与四次挥手及相关面试题回答_3次握手4次挥手面试怎么回答-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏14次。三次握手含义三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。TCP报文要想弄懂三次握手,得先从TCP的报文格式入手:有32位的序号和确认序号。 ACK:置为1便是确认连接。 SYN:置为1代表发起一个新连接。 FIN:置为1代表释放一个连接。 具体过程标志位的解释前两次建立连接时._3次握手4次挥手面试怎么回答

(保姆式教学) Win10 + Ubuntu 20.04——双系统安装方法 + 配置显卡 + root权限 + flash调配_双系统安装保姆教程-程序员宅基地

文章浏览阅读9.5w次,点赞209次,收藏1.1k次。这里写自定义目录标题Win10 + Ubuntu 20.04——双系统安装方法 + 配置显卡 + root权限 + flash调配(保姆式教学)请同学们提前准备:第一步:**准备U盘**第二步:**确定自己电脑的类型**第三步:**安装ubuntu镜像**第四步:**为新系统,分配硬件存储空间**第五步:**用UltralSO软碟通,将 UBUNTU 的镜像写入 U盘**最后一步!胜利就在眼前!:**使用U盘,安装新系统**特殊事项root限权问题赠送一条Tip最后的最后Win10 + Ubuntu 20_双系统安装保姆教程