浏览器对非当前标签页元素的控制问题。

kakakali
  • 51

如下代码,如果一直置于当前标签页,则一切正常。
但是途中只要切换到别的标签页停留数秒,再切换回来就崩溃了。
具体什么原理?
(当然我知道有很多别的方法可以避免这种情况,不过很想了解这类问题的机制)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        a {
            text-decoration: none;
        }

        .wrapper {
            padding: 10px;
            border: 1px solid #000;
            width: 300px;
            margin: 0 auto;
        }

        .container {
            height: 200px;
            position: relative;
            font-size: 0px;
            overflow: hidden;
        }

        .banner {
            position: absolute;
            width: 1800px;
        }

        .banner a {
            display: inline-block;
            width: 300px;
            height: 200px;
            font-size: 50px;
        }

        .banner a:nth-child(1) {
            background-color: rgb(219, 106, 106);
        }

        .banner a:nth-child(2) {
            background-color: rgb(108, 223, 73);
        }

        .banner a:nth-child(3) {
            background-color: rgb(194, 57, 212);
        }

        .banner a:nth-child(4) {
            background-color: rgb(219, 106, 106);
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <div class="container">
            <div class="banner">
                <a href="#">1</a>
                <a href="#">2</a>
                <a href="#">3</a>
                <a href="#">3(2)</a>
            </div>
        </div>
    </div>
</body>
<script>
    let banner = document.getElementsByClassName('banner')[0],
        unitWidth = 300,
        unitNum = 3

    let move = function (e, ds, callback) {
        e.move = setInterval(function () {
            if (ds > 0) {
                e.style.left = e.offsetLeft + 10 + 'px'
                ds -= 10
            } else if (ds < 0) {
                e.style.left = e.offsetLeft - 10 + 'px'
                ds += 10
            } else {
                clearInterval(e.move)
                callback()
            }
        }, 20)
    }

    let autoStart = function () {
        banner.auto = setInterval(function () {
            move(banner, -300, function () {
                if (banner.offsetLeft === -unitWidth * unitNum) {
                    banner.style.left = 0
                }
            })
        }, 1600)
    }

    autoStart()
</script>

</html>
回复
阅读 1.5k
3 个回答
✓ 已被采纳

帮你优化了下,你看下代码

let banner = document.getElementsByClassName('banner')[0],
        unitWidth = 300,
        unitNum = 3
    var ods;
    let move = function (e, ds, callback) {
        if(ods && ods!=0)return;
        clearTimeout(e.move);
        ods=ds;
        e.move = setInterval(function () {
            if (ods > 0) {
                e.style.left = e.offsetLeft + 10 + 'px'
                ods -= 10
            } else if (ods < 0) {
                e.style.left = e.offsetLeft - 10 + 'px'
                ods += 10
            } else {
                callback();
                clearInterval(e.move);
            }
            // console.log(ds);
        }, 30)
    }

    let autoStart = function () {
        clearInterval(banner.auto);
        // if(Math.abs(banner.offsetLeft)%300!=0)return;
        banner.auto = setInterval(function () {
            move(banner, -300, function () {
                if (banner.offsetLeft <= (-unitWidth * unitNum)) {
                    banner.style.left = 0;
                }
            })
        }, 1600)
    }

    autoStart()

现在JQ或者CSS3已经很方便使用了,如果你要快捷开发,就少用点原生JS吧
如果是要理解原理 是没什么问题

期望你早日解决问题~

window.onblur 切换页面时把定时器清了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏