setInterval和浏览器选项卡切换的问题

<!DOCTYPE html>

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <title>Question</title>

        <style>

            .outer {border:1px solid #000; width:520px; height:300px; position:relative; padding:0; overflow:hidden;}

            .inner {position:absolute;}

            .inner div{border:1px solid red; width:118px; height:138px; margin:5px 5px; float:left;}

        </style>

    </head>

    <body>

        <div class="outer">

            <div class="inner" id="inner">

                <div>1</div><div>1</div><div>1</div><div>1</div>

                <div>2</div><div>2</div><div>2</div><div>2</div>

                <div>3</div><div>3</div><div>3</div><div>3</div>

                <div>4</div><div>4</div><div>4</div><div>4</div>

                <div>5</div><div>5</div><div>5</div><div>5</div>

                <div>6</div><div>6</div><div>6</div><div>6</div>

                <div>7</div><div>7</div><div>7</div><div>7</div>

                <div>8</div><div>8</div><div>8</div><div>8</div>

                <div>9</div><div>9</div><div>9</div>

            </div>

        </div>

    </body>

    <script>

        function startScoll(){

            var outer = document.getElementById("inner"),timer,mover,tempSub,

                divs = outer.getElementsByTagName("div");

                outerH = Math.ceil(divs.length/4)*150;

            if(divs.length % 4 !== 0){

                var temp = 4 - divs.length % 4;

                for (var i = 0; i < temp; i++) {

                    outer.appendChild(document.createElement("div"));

                }

            }

            for(var i = 0; i < 8; i++){

                outer.appendChild(divs[i].cloneNode(true));

            }

            outer.style.top = "0px";

            clearInterval(timer);

            timer  = setInterval(function(){

                    tempSub = 0;

                    clearInterval(mover);

                    mover = setInterval(function(){

                        outer.style.top = delPx(outer.style.top) - 10 + "px";

                        tempSub++;

                        if(tempSub == 15){

                            clearInterval(mover);

                            if(delPx(outer.style.top) == -outerH){

                                outer.style.top = "0px";

                                return false;

                            }

                        }

                    },30);

            },3000);

            function delPx(str){

                return parseInt(str.substring(0, str.length - 2));

            }

        }

        startScoll();

    </script>

</html>

<!--

    问题解释:点开页面之后如果选项卡不切换走,焦点一直在这个页面的话,就不会出任何问题。

    如果选项卡切换到其它页面,过十几秒、二十秒回来后,发现页面滚动的位置就不准确了。

    在其它页面时间比较长,不准确的越厉害,甚至不再回来了。

    测试了在谷歌和火狐中都有这个问题。

    多测了几遍似乎是:选项卡切走之后,这边的setInterval就停止了。

    当切换回来的时候一下把没有执行的函数全部执行了,快速执行中出错了。

    当然解决方法可以通过控制top值修复滚动有误的问题,我想问的是:

    这个问题是怎么产生的?原理是什么?有没有更好的解决办法?

-->

问题解释

因为每 3000  ,可能内层还在操作

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/web/Skills/

我改成判断,内层有没在操作,没有才重新开始。

<!DOCTYPE html>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Question</title>
        <style>
            .outer {border:1px solid #000; width:520px; height:300px; position:relative; padding:0; overflow:hidden;}
            .inner {position:absolute;}
            .inner div{border:1px solid red; width:118px; height:138px; margin:5px 5px; float:left;}
        </style>
    </head>
    <body>
        <div class="outer">
            <div class="inner" id="inner">
                <div>1</div><div>1</div><div>1</div><div>1</div>
                <div>2</div><div>2</div><div>2</div><div>2</div>
                <div>3</div><div>3</div><div>3</div><div>3</div>
                <div>4</div><div>4</div><div>4</div><div>4</div>
                <div>5</div><div>5</div><div>5</div><div>5</div>
                <div>6</div><div>6</div><div>6</div><div>6</div>
                <div>7</div><div>7</div><div>7</div><div>7</div>
                <div>8</div><div>8</div><div>8</div><div>8</div>
                <div>9</div><div>9</div><div>9</div>
            </div>
        </div>
    </body>
    <script>
        function startScoll(){
            var outer = document.getElementById("inner"),timer,mover,tempSub,
                divs = outer.getElementsByTagName("div");
                outerH = Math.ceil(divs.length/4)*150;

            if(divs.length % 4 !== 0){
                var temp = 4 - divs.length % 4;
                for (var i = 0; i < temp; i++) {
                    outer.appendChild(document.createElement("div"));
                }
            }

            for(var i = 0; i < 8; i++){
                outer.appendChild(divs[i].cloneNode(true));
            }

            outer.style.top = "0px";
            clearInterval(timer);
            var doing=0,bt;
            timer  = setInterval(function(){
                            if(doing || new Date()-bt < 3000 )  return ;
                            bt=new Date();
                            console.info(doing)
                    tempSub = 0;
                    clearInterval(mover);
                    doing=1;
                    mover = setInterval(function(){
                        outer.style.top = delPx(outer.style.top) - 10 + "px";
                        tempSub++;

                        if(tempSub == 15){
                            clearInterval(mover);
                               doing=0;
                            if(delPx(outer.style.top) == -outerH){
                                outer.style.top = "0px";

                                return false;
                            }
                        }
                    },30);

            },100);

            function delPx(str){
                return parseInt(str.substring(0, str.length - 2));
            }
        }
        startScoll();
    </script>
</html>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索function
, setinterval
, length
, outer
, style
, clearInterval
, 切换div
clearInterval()
js 浏览器选项卡切换、浏览器选项卡切换、setinterval 切换页面、浏览器选项卡怎么设置、ie浏览器选项卡合并,以便于您获取更多的相关知识。

时间: 2025-01-02 21:15:30

setInterval和浏览器选项卡切换的问题的相关文章

使用CSS3实现选项卡切换的方法

 :target是什么? MDN是这样描述的::target The :target pseudo-class represents the unique element, if any, with an id matching the fragment identifier of the URI of the document. 在document中,可以设置锚链接,举个例子: CSS Code复制内容到剪贴板 <a href="#tab">Test :target<

原生javascript实现Tab选项卡切换功能

 本文主要介绍了使用原生javascript实现Tab选项卡切换的功能,虽然jQuery有很多类似的插件,单jQuery库着实有点庞大,这种小功能还是直接用javascript来做就好了.     分析个人用原生JS获取类名元素的代码:   代码如下: getByClassName:function(className,parent){ var elem = [], node = parent != undefined&&parent.nodeType==1?parent.getEleme

Win7系统如何关闭IE浏览器选项卡

  1.打开Win7系统IE浏览器,然后在IE浏览器下,点击菜单栏中的"工具",再选择"Internet选项"; 2.在打开的"Internet选项"窗口上,切换至"常规"选项卡下,然后点击"设置"按钮; 3.在Win7笔记本系统安装选项卡浏览设置窗口上,取消勾选"启用选项卡浏览"项,再点击确定保存. 按照上述方法操作之后,发现成功关闭Win7系统IE浏览器选项卡浏览窗口.

很棒的js选项卡切换效果_javascript技巧

本文实例为大家分享了js实现简单的选项卡切换效果的具体代码,供大家参考,具体内容如下 js选项卡切换代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus"> <meta name="Autho

javascript实现tabs选项卡切换效果(扩展版)_javascript技巧

前段时间写了个tabs 选项卡切换效果,今天抽空在原有的基础上进行了扩展,加入了自动轮播,这样就变成了类似图片轮播的效果了. html 代码: 复制代码 代码如下: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title>js-tabs</title> <link rel="styleshe

原生javascript实现Tab选项卡切换功能_javascript技巧

分析个人用原生JS获取类名元素的代码: 复制代码 代码如下: getByClassName:function(className,parent){             var elem = [],                 node = parent != undefined&&parent.nodeType==1?parent.getElementsByTagName('*'):document.getElementsByTagName('*'),               

JS基于myFocus库实现各种功能的tab选项卡切换效果_javascript技巧

本文实例讲述了JS基于myFocus库实现各种功能的tab选项卡切换效果.分享给大家供大家参考.具体如下: 这里介绍使用myFocus-tab实现各种功能的选项卡切换,有的是带有动画效果的,各款基于myFocus库制作的焦点图风格皮肤,可自行按需选择,myFocus焦点图库及皮肤可自由使用,保留作者相关信息即可,谢谢支持!^^ 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-myfocus-plug-tab-cha-nav-codes/ 具

javascript-js选项卡切换onMouseOver火狐用不了

问题描述 js选项卡切换onMouseOver火狐用不了 .aaleftsec2 { width:0x; background-image:url(../img1/div_Tbg.jpg); text-decoration: none; font-size:13px; font-weight: bold; position:relative; cursor: hand; letter-spacing:6px; border-left: 1px solid #669900; border-top:

基于javascript实现tab选项卡切换特效调试笔记_javascript技巧

本文实例为大家分析了javascript实现tab选项卡切换的调试笔记,供大家参考,具体内容如下 制作导航栏,点击导航栏元素时下面的内容会产生相应的变化,并且该元素显示特殊样式. js源代码: //导航栏单击变换内容 function tabSwitch(_this,num) { var tag = document.getElementById("nav9"); var number = tag.getElementsByTagName("a"); //获取导航栏