2012-12-04 227 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;