Javascript 设置超时问题

Javascript 设置超时问题,javascript,settimeout,Javascript,Settimeout,我试图在Javascript中创建jquery fadeto类型的效果,但是我的setTimeout命令有问题 代码如下: function textfade(y) { var x = document.getElementById("test"); var y; if (y == undefined) { y = 1.0; } x.style.opacity = y; y -=0.1; setTi

我试图在Javascript中创建jquery fadeto类型的效果,但是我的setTimeout命令有问题

代码如下:

function textfade(y) {
    var x = document.getElementById("test");
    var y;           
    if (y == undefined) {
        y = 1.0;
    } 

    x.style.opacity = y;
    y -=0.1;
    setTimeout(function(){ textfade(y); }, 50);
}
问题是
x.style.opacity=y

如果不这样做,超时运行正常。然而,有了它,它只运行一次函数,然后就消失了。虽然我觉得这是一个简单的错误,但我没有办法修复它

如有任何建议,将不胜感激


提前谢谢。

我想,如果
设置超时
调用一个内部闭包,当前的不透明度级别保持在淡入淡出函数本身之外,那么这样做会更好,因此您不必传递它

function textfade(el) {
    if (typeof el === "string") {
        el = document.getElementById(el);
    }

    var opacity = 1.0;

    (function fade() {
        el.style.opacity = opacity;
        opacity -= 0.1;
        if (opacity > 0) {
             setTimeout(fade, 50);
        }
    })();
}

每次执行
textfead()
时,在处演示您正在声明的
y
,有效地销毁/重置传递的参数

删除:

var y; 

确保在
test
元素已可用后运行它。在这里它可以正常工作:。这里:-不,因为当dom还没有准备好并且不可用时,函数是在head中调用的,而不是在onload中调用的(就像在Firdle中一样)

所以,在你的

<head>
  <script>
       function textfade() {...}
  </script>
</head>
<body onload="textfade()">
    <div id="test"> ... </div>

函数textfade(){…}
... 

<代码>你的代码工作得很好。这里对我来说很好:可能在DOM就绪之前调用它。与你的问题无关,但是考虑添加终止条件(<代码>如果(y==0)< /代码>)。去掉<代码> var y;<代码>行,很好。你们都接受
y
作为参数,并声明一个名为
y
的局部变量。可能想做一个或另一个。你意识到在IE8和更低版本中,你创建了两个完全不同的
fade
函数,对吗?该死的浏览器。。。理想情况下,我会使用一个匿名函数和
参数。在
setTimeout
调用中,被调用方
,但ECMA明智地反对
参数。被调用方
:叹气:您只需使用一个匿名函数:
var fade=function(){…};褪色()
函数fade(){…}fade()@JulienRoyer我更喜欢避免外部调用淡入淡出,而使用iLife的。@Alnitak:我也是,但有时你必须务实……啊!非常感谢你!这就成功了。我现在觉得自己很愚蠢。让我们把它归因于我花了太多时间在这个小动画上,以至于我的眼睛都快从脑袋里融化了。我非常感谢你的帮助。