2012-12-04 122 views
1

我想在Javascript中创建一个jQuery淡入淡出效果类型,但是我的setTimeout命令出现问题。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

没有这个,超时运行正常。但是,有了它,它会一次贯穿整个功能,然后死亡。虽然我觉得这是一个简单的错误,但我没有解决它的想法。

任何意见将不胜感激。

预先感谢您。

+0

浏览器是...? –

+0

你的代码在[这个小提琴](http://jsfiddle.net/JdmJt/)中工作正常。 –

+0

它适合我这里工作正常:http://jsfiddle.net/3yDMP/可能你在dom准备好之前调用它? –

回答

1

确保您正在运行之后test元素已经可用。这工作正常:http://jsfiddle.net/3yDMP/。在这里:http://jsfiddle.net/3yDMP/3/ - 不,因为函数在头部调用,而不是在onload(如第一个小提琴),当dom还没有准备好,并且不可用时。

所以,你可能是

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

啊!非常感谢你!这让它工作。我现在感到愚蠢吗?让我们把它归因于我花这么多时间在这个小小的动画上,我的眼睛正在融化掉我的头骨。我非常感谢你的帮助。 – user1874309

0

恕我直言,这将是更好的setTimeout调用一个内部关闭,其中当前的不透明度级别保持淡出功能本身之外,所以你不必传递它。

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); 
     } 
    })(); 
} 

演示在http://jsfiddle.net/alnitak/TQHYj/

+0

你意识到在IE8中,你创建了两个完全不同的'fade'函数,对吧? http://blog.niftysnippets.org/2010/09/double-take.html –

+0

该死的浏览器......理想情况下,我会在'setTimeout'调用中使用一个匿名函数和'arguments.callee',但是在它们的ECMA中智慧已弃用'arguments.callee':感叹: – Alnitak

+0

你只需要使用一个匿名函数:'var fade = function(){...}; fade();'或'function fade(){...} fade();' –

2

你重新声明y每次执行textfade(),从而有效地删除/复位传递的参数。

删除:

var y;