MozTW 討論區
https://forum.moztw.org/

Firefox 3.0.3 在執行Javascript的setTimeout時出現以下問題...
https://forum.moztw.org/viewtopic.php?f=13&t=24594
1 頁 (共 1 頁)

發表人:  kaneintku [ 2008-10-02, 23:55 ]
文章主題 :  Firefox 3.0.3 在執行Javascript的setTimeout時出現以下問題...

代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-tw">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Big5">
<title>淡入及淡出</title>
<style type="text/css">
#fade{
   opacity:1;
   filter: alpha(opacity=100);
}
</style>
<script type="text/javascript">
addLoadListener(init);

function addLoadListener(fn){
    window.onload = fn;
}

function init(){
   img = document.getElementById("fade");
   
   if(typeof img.style.opacity != "undefined"){
      browser = "firefox";
      img.style.opacity = 1;
   }else if(typeof img.filters.alpha.opacity == "number"){
      browser = "ie";
      //img.filters.alpha.opacity = 100;
   }
   
   fadeout();
}

function fadeout(){
   if(img.style.opacity > 0){
      img.style.opacity -= 0.1;
      setTimeout('fadeout()', 100);
   }else if(img.style.opacity == 0){
      fadein();
   }
/*
   if(img.filters.alpha.opacity > 0){
      img.filters.alpha.opacity -= 10;
      setTimeout('fadeout()', 100);
   }else if(img.filters.alpha.opacity == 0){
      fadein();
   }
*/
}

function fadein(){   
   if(img.style.opacity < 1){
      img.style.opacity += 0.1;
      setTimeout('fadein()', 100);
   }
/*
   if(img.filters.alpha.opacity < 100){
      img.filters.alpha.opacity += 10;
      setTimeout('fadein()', 100);
   }
*/
}
</script>
</head>
<body>
<img src="img10.bmp" id="fade">
<div id="output"></div>
</body>
</html>


這個網頁原本是要拿來設計成,
1.先判斷使用者是用何種瀏覽器,
2.再依據IE或FF執行所屬的程式碼
3.先將圖片img10.bmp淡出之後再淡入

但用FF跑這個程式碼時,
只跑到function fadein()的img.style.opacity += 0.1;這一行,
下一行的setTimeout卻無法執行。

若將註解區的程式碼反註解(註解區的程式碼是給IE跑的),
再用IE跑卻OK。(我是用IE 6.0)

我想問的是在FF環璄下,
是不是function fadein()裡的setTimeout中的函式參數不是這樣子寫的?

因為我若將該行改為setTimeout(function(){alert("abc");}, 100),
此時FF跑卻又OK,
所以在猜想是不是fadein()的setTimeout參數表示式不對。

煩各位先進幫忙!

發表人:  kourge [ 2008-10-03, 07:54 ]
文章主題 : 

改成 setTimeout(arguments.callee, 100); 看看。
(如果真的要做一堆特效,jQuery 就堪用。)

發表人:  kaneintku [ 2008-10-03, 14:29 ]
文章主題 : 

kourge 寫:
改成 setTimeout(arguments.callee, 100); 看看。
(如果真的要做一堆特效,jQuery 就堪用。)


還是不行耶~
一樣function fadeout的特效有出來,
但function fadein卻沒有...

發表人:  shyangs [ 2008-10-03, 18:13 ]
文章主題 : 

你在 function fadein(){},加入 alert(img.style.opacity); 觀察看看。img.style.opacity這個值一直沒有增加,總是滿足你設定的 if 條件,會無窮地一直跑初始值= =a

事實上,我遞迴觀念很弱,幫回覆一下,看能不能吸引高手來討論。

以下是我的修改

代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-tw">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Big5">
<title>淡入及淡出</title>
<style type="text/css">
#fade{
   opacity:1;
   filter: alpha(opacity=100);
}
</style>
<script type="text/javascript">
addLoadListener(init);


function addLoadListener(fn)
{
    window.onload = fn;
}

function init()
{
   img = document.getElementById("fade");
   
   if(typeof img.style.opacity != "undefined")
   {
      browser = "firefox";
      img.style.opacity = 1;
   }
   else if(typeof img.filters.alpha.opacity == "number")
   {
      browser = "ie";
   }

   fadeout();
}

function fadeout()
{
   if(img.style.opacity > 0)
   {
      img.style.opacity -= 0.1;
      setTimeout(fadeout, 100);
   }
   else if(img.style.opacity == 0)
   {
      op=parseFloat(img.style.opacity);
      fadein();
   }
}

function fadein()
{
   if(op > 1)
   {
   return;
   }
   op += 0.1;
   img.style.opacity = op;
   //alert(img.style.opacity);
   setTimeout("fadein()", 100);//setTimeout(fadein, 100);
}
</script>
</head>
<body>
<img src="img10.bmp" id="fade">
<div id="output"></div>
</body>
</html>


setTimeout("fadein()", 100);若寫成setTimeout(fadein, 100);會有不同的效果,不知道為什麼(倒)

發表人:  yuoo2k [ 2008-10-03, 23:56 ]
文章主題 : 

把 init() 改成下面這樣, 會發現很有趣的現象...
代碼:
function init(){
   img = document.getElementById("fade");
   img.style.opacity = 0.5;

   var x = img.style.opacity;
   alert("x=" + x + ", typeof(x)=" + typeof(x));

   var a = img.style.opacity - 0.1;
   alert("a=" + a);

   var b = img.style.opacity + 0.1;
   alert("b=" + b);
}

IE的輸出結果:
代碼:
x=0.5, typeof(x)=number

a=0.4

b=0.6

Firefox的輸出結果:
代碼:
x=0.5, typeof(x)=string

a=0.4

b=0.50.1

怎麼會這樣??

開 Tools -> Error Console 出來執行看看下列算式:
代碼:
"0.5"-0.1 答案是 0.4
"0.5"+0.1 答案是 "0.50.1"

所以問題是... 為何 Firefox 會把 img.style.opacity 視為 String ??

感覺是個 Bug ...

發表人:  Zorro [ 2008-10-04, 00:27 ]
文章主題 : 

代碼:
   if(img.style.opacity < 1){
      img.style.opacity += 0.1;
      setTimeout('fadein()', 100);
   }


改成

代碼:
   if(img.style.opacity < 1){
      img.style.opacity -= 0 - 0.1;
      setTimeout('fadein()', 100);
   }

發表人:  alex301 [ 2008-10-04, 02:08 ]
文章主題 : 

建議改用非遞迴的寫法...
代碼:
function init(){
   img = document.getElementById("fade");
   if(typeof img.style.opacity != "undefined"){
      browser = "fx";
      img.style.opacity = 1;
   }else if(typeof img.filters.alpha.opacity == "number"){
      browser = "ie";
      img.filters.alpha.opacity = 100;
   }

   setTimeout(fadeout, 0);
   setTimeout(fadein, 1000);
}

function setOpacity(value) {
   if (browser == "fx") img.style.opacity = value/10;
   if (browser == "ie") img.filters.alpha.opacity = value*10;
}

function fadeout(){
   for (var i=0; i<=10; i++)
      setTimeout('setOpacity('+(10-i)+')', 100*i);
}

function fadein(){
   for (var i=0; i<=10; i++)
      setTimeout('setOpacity('+i+')', 100*i);
}

1 頁 (共 1 頁) 所有顯示的時間為 UTC + 8 小時
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/