2014-07-08 34 views
0

我正在编写一个锁定屏幕,它从Windows 8获取“灵感”。当用户单击图像时,它向上滑动以显示密码输入字段等。我希望锁定屏幕“过渡”或“动画”,而不仅仅是改变显示属性。Javascript“Maximum Call Size Stack Exceeded”

我已经为调用一个名为SlideLockscreenUp的函数的click设置了一个事件处理程序。这是当我运行这个,我遇到了“最大调用大小堆栈超过”错误。最初,我的代码是:

function slideLockscreenUp(){ 

    t = setTimeout(function(){ 
     ls.style.top = '-1%'; 
    }, 100); 

    slideLockscreenUp(); 
} 

当我第一次我以为这是因为我还没有设置递归停止任何条件的错误,因此它会继续永远迫使浏览器的干扰。

原来这就是我想出了下一个:

  function slideLockscreenUp(){ 

      do{ 
       t = setTimeout(function(){ 
        ls.style.top = '-1%'; 
       }, 10); 

       slideLockscreenUp(); 
      } while(ls.style.top < "-100%"); 

     } 

正如你可以看到我的测试显示属性停止功能时的位置:顶部是-100%。然而,我仍然得到这个错误,现在我对此有些困惑。任何帮助将是伟大的!

+1

Javascript是单线程的。只要while循环运行,'setTimeout'函数将永远不会运行。 – Barmar

+0

嗯。有没有其他的循环可以用来解决这个问题?谢谢 – Joshua

+0

最好的解决方案是利用CSS转换,而不是试图在Javascript中做到这一点。 – Barmar

回答

2

您需要递归调用slideLockscreenUp才能在setTimeout回调函数中,否则在调用第一个setTimeout回调函数之前它将被多次调用。

我建议您使用setIntervalclearInterval而不是多次调用setTimeout

function slideLockscreenUp(){ 

    t = setInterval(function(){ 
     ls.style.top = '-1%'; 

     if (/* exit condition */) { 
      clearInterval(t); 
     } 
    }, 100); 

}