2011-05-09 74 views
0

这将是一个JavaScript函数;使用onclick事件处理程序或其他东西。 然后onclick它会淡出什么东西的框ID是使用document.getElementsById()对象,为什么它不会淡出?就像我见过的很多效果一样?另外请注意,我试图用jQuery或任何插件来做到这一点,因为我试图学习和掌握JavaScript。这个脚本为什么不能作为淡出动画效果工作

setTimeout(function() { 
     for(var i = 1; i< 9; i++) { 
      setTimeout(function() { 
      box.style.opacity = '0.'+i; 
      }, 100); 
     } 
     }, 1000); 
+0

可以提供更多的细节,以浏览器的版本和代理? – Neeraj 2011-05-09 13:46:29

+0

我正在使用Firefox 4.0 – Aaron 2011-05-09 13:47:04

+0

[Javascript:关闭循环?](http://stackoverflow.com/questions/5555464/javascript-closure-of-loop)和[许多其他](http:// stackoverflow .com/search?q = closed + in + loop +%5Bjavascript%5D) – 2011-05-09 13:55:07

回答

2

你应该递归调用该函数,就像这样:

var box = document.getElementById('box'); 
    var i = 10; 
    function fadeOut() { 
     if (i>0) { 
      i--; 
      box.style.opacity = '0.'+i; 
      setTimeout(fadeOut, 100); 
     } 
    } 
    setTimeout(fadeOut, 1000); 
+0

的作品正是我想要的,你可以请进入的一切是如何工作的,因为我希望能够了解究竟怎么回事 – Aaron 2011-05-09 13:58:26

+1

你安排几乎在同一时间所有超时(在环路)更详细,所以他们都几乎在同一时间触发。我在这里改变的是,首先'我'被设置为10,然后'fadeOut'被调用并减少i(改变为9),因此不透明度现在被设置为0.9,之后它在100ms内安排下一次更新('setTimeout(fadeOut,100)')并且重复相同的功能,直到'i'为0(并且不透明度为0.0)。检查维基百科上的递归:http://en.wikipedia.org/wiki/Recursion – Matic 2011-05-09 14:05:57

1

有几件事情:

1)你实际上是通过提高透明度,而不是通过降低不透明度淡出它的衰落在框中。

2)您正在同时设置所有setTimeout函数,在内部调用中您可能需要调用setInterval并使该增量为i。或者,您可以通过将时间设置为100 * i而不是仅仅设置100来累积setTimeouts。

+0

+1,我太在意9岁了,但这也是一个很好的答案,因为即使在修复之后,你的淡入也会等待100秒然后所有的超时将被调用。可能不是他要找的东西。 – Robert 2011-05-09 13:54:34

1

这个问题在您的问题中不太清楚,但可能会立即在0.9不透明度下看到它。原因在于for循环实际上并没有给你循环中的i的值,而只是在其中访问它的地址。如果你真的在for循环体内使用它,那很好,但是你没有那样做。当你设置超时时,在超时被调用的时候,它已经完成迭代循环,我是9.因此,每个超时只是将不透明度设置为0.9。

要解决这个问题,你可以把它包装在一个自动执行的匿名函数中,它传入i的值。这样做会导致匿名函数对范围i进行限制,并允许它在被调用时被超时访问。

setTimeout(function() { 
    for (var i = 1; i < 9; i++) (function(i) { 
     setTimeout(function() { 
      box.style.opacity = '0.' + i; 
     }, 100); 
    }(i) // (i) at the end automatically executes, with the argument of i 
}, 1000); 
相关问题