添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
< >
  •     var rightTimmer;
        var leftTimmer;
        function goLeftTimmer() {
            leftTimmer = setInterval("goleft()", 5);
        function goleft() {
            var container = document.getElementById("container");
            if (container.scrollLeft === 3240) {
                container.scrollLeft = 0;
            container.scrollLeft += 5;
            if (container.scrollLeft === 3240) {
                container.scrollLeft = 0;
                clearInterval(leftTimmer);
            } else if (container.scrollLeft % 810 === 0) {
                clearInterval(leftTimmer);
    

    用console.log(lefttimmer)可以看出这个lefttimmer不是定时器本身,它只是一个用于传递的返回值,如果把他当成一个可以覆盖的值每次都清除再初始化就错了,  每一次给timer赋值都是在创建新的定时器对象,之前的定时器也并没有被清除,所以这时候调用clearInterval(timer)只是清除了最后一个timmer   所以肉眼可以看到点击一次轮播正常,连续点两次就会一直轮播

    解决方法:

    方法一:在每次单击初始化定时器操作前,把定时器清除

        var rightTimmer;
        var leftTimmer;
        function goLeftTimmer() {
            clearInterval(leftTimmer);//清除定时器
            leftTimmer = setInterval("goleft()", 5);
        function goleft() {
            var container = document.getElementById("container");
            if (container.scrollLeft === 3240) {
                container.scrollLeft = 0;
            container.scrollLeft += 5;
            if (container.scrollLeft === 3240) {
                container.scrollLeft = 0;
                clearInterval(leftTimmer);
            } else if (container.scrollLeft % 810 === 0) {
                clearInterval(leftTimmer);
    

     方法二:可通过for循环清除页面所有定时器 简单粗暴

    var rightTimmer;
    var leftTimmer;
    document.getElementById("left").onclick = function(){
            leftTimmer = setInterval("goleft()",5);
    function goleft() {
            var container = document.getElementById("container");
            if (container.scrollLeft === 3240) {
                container.scrollLeft = 0;
                console.log(container.scrollLeft);
            container.scrollLeft += 5;
            if (container.scrollLeft === 3240) {
                container.scrollLeft = 0;
                for (var i = 1; i<=leftTimmer; i++){//用for循环清除页面所有定时器
                    clearInterval(i);               
                // clearInterval(leftTimmer);
                console.log(container.scrollLeft);
            } else if (container.scrollLeft % 810 === 0) {
                for (var i = 1; i<=leftTimmer; i++){
                    clearInterval(i);
                // clearInterval(leftTimmer);
                console.log(container.scrollLeft);
                        在图片轮播中点击下一张图片按钮,setinterval定时器多次初始化,导致清除失效在使用定时器做图片轮播时,连续两次点击下一张图形会越走越快,清除定时器失效&lt;div class="out"&gt;    &lt;div id="container"&gt;        &lt;a href="#" id="left" onclick="goRightTimmer()"&gt;&lt;&lt;/a&gt;        &lt;a href="#" id="right" oncl
    				
    使用场景:我在函数A调用定时器函数,定时器是单独写的一个函数 原因:页面加载时我调用了1次函数A,然后又单独调用了一次定时器函数,导致调用了2次setInterval(),导致有setInterval_id有2个值。 通过打印定时器的值发现的问题。 clearInterval()只关闭了其一个setInterval_id,另一个setInterval_id还会启动setInterval()。 解决方法:把单独调用定时器函数去掉。 补充知识:js vuesetTimeout无法通过clearTimeout清除问题 在异步清除,利用vue data存放setTimeout的标识进行清除
    解决JavaScript定时器问题 之前在项目写了定时器来做循环播放,但是总是会有问题,开始是以为前后的HTML代码拼接的有问题,时间紧急的情况下反复改了很多也没什么效果,后来发现是js定时器问题,在这里记录一下。 (setinterval多次初始化 使用js定时器setinterval)首要的问题就是要记得清除,即调用(clearInterval)方法,由于没有使用定时器的经验,我一开始是没有清除定时器,程序每一次初始化的时候都调用一次定时器,之前的定时器实例没有被销毁,新的定时器又开始执行,就会出现1s变0.5s,0.5s变0.25秒的情况,从观感上来看就是定时
    function do(){ //clearInterval要放在方法开始,不然的话,下面的代码还没运行到clearInterval,又开始了循环了。 clearInterval(timer) //do something...
    19.js定时器,以及解释、解决多次点击/触发定时器——软设问题总结19.1 js定时器19.2 定时器的使用19.3 定时器的原因19.4 解决定时器”的问题 19.1 js定时器 在菜鸟教程介绍到: js 定时器有以下两个方法: setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。 setTimeout() :在指定的毫秒数后调用函数或计算表达式。 两个方法都有三个
    setInterval(function(){}, milliseconds)——会不停的调用函数 setTimeout(function(){}, milliseconds)——只执行函数一次 乍看之下,setInterval会符合我们的业务需求,然而 按理清除定时器后,定时器里的代码不会再执行。但是通过控制台输出后发现定时器还在定时执行。。 最后debug出原因是因为,代码包含了多个定时器。当一个定时器取消后,另一个还在继续。因此如果我们想多个定时器独立进行的话。每个定时的正确写法应该是: let timer = setInterval(() => { clearInterval(timer);//一定要写清楚是清除哪一个定时器 },200);
    使用 setInterval() 创建的定时器确保了定时器代码规则地插入队列。这个方式的问题在于,定时器代码可能在代码再次被添加到队列之前还没有完成执行,结果导致定时器代码连续运行好几次,而之间没有任何停顿。幸好,Javascript 引擎够聪明,能够避免这个问题。当使用setInterval() 时,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列。这确保了定时器代码加入到队列的最小时间间隔为指定间隔。
    下午的时候,产品说某项目的某功能不要了,客户看着眼花(mmp,这个功能当时非要吵吵着加上,现在过了好几版以后,又说不要了) 该功能是使用setinerval 实现的,为了省事,即没有回滚版本(该功能已经被覆盖了好几版了,不容易检出),也没有大片注释代码(注释执行方法以后,代码编辑以后会有已经声明,未使用的waring) 所以直接修改了setinerval的间隔时间。 但是直接修改成了1000 * 60 * 60 * 24 * 30 = 30天,后来发现代码直接速执行,但是修改为2000 以后又正常。 1.可以在 clearInterval(timer) 先console一下timer的值,看看是什么 2.一般清除不掉setInterval的情况是因为每次在清除之前重新了一遍改组件的js代码,使timer又成了初始值null,再去clearInterval(timer);肯定不会成功了。 解决办法: 再组件外声明 tim
    问题很好理解,在业务环境需要的情况下,进入页面即执行,如做倒计时 把拥有定时器和渲染页面数据this.set,this.set,this.set,this.forceUpdate()函数,放在一起的时候 出现了问题:即在执行渲染函数时,页面重新生成了新的定时器,所以会造成 指数形式重复调用 解决问题: 1.只有一个定时器时,吧定时器定义到window下,执行前先行判断,如果有则不再创建,或者删除 if(!window.setTime){ window.setTime = setInterval(this.