代码之家  ›  专栏  ›  技术社区  ›  Dean

同时由setInterval()执行的两个函数正在互相减慢

  •  0
  • Dean  · 技术社区  · 14 年前

    我编写了一个脚本,其中有两个函数由 setInterval() .

    一个功能 rotateTheSun() 不断旋转一个物体,另一个 moveSlide() 移动滑动分区的手柄 onclick .

    每当常量函数运行时,DIV滑动非常慢。

    是JS问题,还是我刚刚写了一个糟糕的脚本(和往常一样)?

    来源:

    window.onload = initAll;
    
    function initAll(){
        slideDivs = document.getElementsByClassName("slide");
        slideLinks = document.getElementsByClassName("slide-link");
        isMoving = false;
        curSlideState = 2;
        desSlideState = "";
        transformDeg = 0;
    
        for(var i=0; i < slideDivs.length; i++){
            slideDivs[i].style.left = i*100 + "px";
        }
    
        for(var i=0; i < slideLinks.length; i++){
            slideLinks[i].onclick = moveSlide;
        }
    
        rotatingSun = document.getElementById("rotating-sun");
        rotatingSun.style.MozTransform = "rotate(" + transformDeg + "deg)";
        rotatingSun.style.WebkitTransform = "rotate(" + transformDeg + "deg)";
        rotatingSun.style.OTransform = "rotate(" + transformDeg + "deg)";
        rotatingSun.style.transform = "rotate(" + transformDeg + "deg)";
    
        sunTimer = setInterval(rotateTheSun, 33);
    }
    function moveSlide(){
        elementToMove = this.parentNode.parentNode;
    
        if(elementToMove.tagName == "DIV" && isMoving == false){
            for(var i=0; i < slideDivs.length; i++){
                if(elementToMove == slideDivs[i]){
                    desSlideState = i;
                }
            }
    
            moveAction = (curSlideState - desSlideState);
            if(moveAction == 0){
                return false;
            }
            if(moveAction > 0){
                moveDirection = 1;
            }
            else{
                moveDirection = -1;
            }
    
            switch (moveAction){
                case 0:
                    return false;
                    break;
                case +2:
                    divToMove1 = slideDivs[1];
                    divToMove2 = slideDivs[2];
                    break;
                case -2:
                    divToMove1 = slideDivs[2];
                    divToMove2 = slideDivs[1];
                    break;
                case +1:
                    if(curSlideState == 2){
                        divToMove1 = slideDivs[2];
                        divToMove2 = "";
                    }
                    else{
                        divToMove1 = slideDivs[1];
                        divToMove2 = "";
                    }
                    break;
                case -1:
                    if(curSlideState == 1){
                        divToMove1 = slideDivs[2];
                        divToMove2 = "";
                    }
                    else{
                        divToMove1 = slideDivs[1];
                        divToMove2 = "";
                    }
                    break;
                }
            }
            else{
                return false;
            }
    
            moveCounter = 0;
            isMoving = true;
            timeMove();
            return false;
        }
    
    function timeMove(){
        slideTimer = setInterval("executeMove()", 5);
    }
    function executeMove(){
        curLeft1 = parseFloat(divToMove1.style.left);
        if(divToMove2){
            curLeft2 = parseFloat(divToMove2.style.left);
        }
    
        divToMove1.style.left = curLeft1 + 10*moveDirection + "px";
        if(divToMove2){
            divToMove2.style.left = curLeft2 + 10*moveDirection + "px";
        }
    
        moveCounter += 1;
    
        if(moveCounter == 66){
            clearInterval(slideTimer);
            curSlideState = desSlideState;
            isMoving = false;
        }
    }
    
    function rotateTheSun(){
        transformDeg += 0.1;
        if(transformDeg > 360){
            transformDeg = 0;
        }
        rotatingSun.style.MozTransform = "rotate(" + transformDeg + "deg)";
        rotatingSun.style.WebkitTransform = "rotate(" + transformDeg + "deg)";
        rotatingSun.style.OTransform = "rotate(" + transformDeg + "deg)";
        rotatingSun.style.transform = "rotate(" + transformDeg + "deg)";
    }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Justin Johnson    14 年前

    javascript只有一个线程,因此即使两个函数都设置为异步执行,但一次只能执行一个。见 How JavaScript Timers Work 更多细节。

    你设定的时间也很短。记住,setInterval和setTimeout需要一个毫秒的参数,2.5毫秒甚至是不可识别的。也许你的意思是250。

    另外,作为旁注,不应该将字符串传递给setInterval和setTimeout。相反,传递函数本身

    setInterval("rotateTheSun()", 2.5); ---gt; setInterval(rotateTheSun, 250);

        2
  •  1
  •   jwueller    14 年前

    您应该为设置更高的超时值 setInterval() . 2.5表示每秒400次迭代!我建议使用16毫秒的值。这将给你每秒60步的速度。即使每33毫秒进行一次步进,您也将以每秒约30步的速度获得恒定的平滑速率。同样的情况也适用于5点的第二次间歇。这个也太低了。