2012-04-06 15 views
1

何らかの理由で、関数が自分自身をsetTimeout()を使用して呼び出しても、GalleryScroll()私は、問題がスコープに関連している可能性が考えていたが、私はよく分からない:単純なネストされたsetTimeout()は1回だけ実行されます(JavaScript)

http://jsfiddle.net/CYEBC/2/

$(document).ready(function() { 
    var x = $('#box').offset().left; 
    var y = $('#box').offset().top; 
    galleryScroll(); 

    function galleryScroll() { 
     x = x + 1; 
     y = y + 1; 
     $('#box').offset({ 
      left: x, 
      top: y 
     }); 
     setTimeout('galleryScroll()', 100); 
    } 
});​ 

HTML:

<html> 
<head> 
</head> 
<body> 
    <div id="box"> 
    </div> 
</body> 
</html>​ 
+0

-1質問にはコードはありません。 –

+0

どちらの質問もコードにありません – Ibu

+0

JSFiddleリンクで十分だと思いましたが、コードを追加しました。あなたのdownvoteを削除してください... –

答えて

1

あなたの問題は、あなたがあなたのsetTimeoutでgalleryScroll()関数を呼び出している方法です。これは望ましい動作である場合、私はわからないんだけど、それはあなたのコードが正しく呼び出されたときに何が起こるかです:

setTimeout(galleryScroll, 100); 

結果:http://jsfiddle.net/CYEBC/12/

注意をこれにその行を変更します。

+0

ああ。私はあなたが最初のパラメータの文字列を使用する必要があると思った。だから今私はどちらの答えを受け入れるか分からない - 両方がトリックをするようだ! –

+0

両方の答えは正しい - 私はこれを受け入れている。なぜなら、それは2人の方が簡単だから(やっと)。ありがとう! –

2

機能galleryScroll()がで定義されていませんsetTimeout()で評価される正しい範囲。ループで実行したい場合は、関数の後にsetInterval()で呼び出します。

$(document).ready(function() { 
    var x = $('#box').offset().left; 
    var y = $('#box').offset().top; 
    galleryScroll(); 

    function galleryScroll() { 
     x = x + 1; 
     y = y + 1; 
     $('#box').offset({ 
      left: x, 
      top: y 
     }); 
    } 
    // Call in setInterval() outside the function definition. 
    // Note also, I've changed the eval string 'gallerySroll()' to the function reference galleryScroll 
    setInterval(galleryScroll, 100); 
});​ 

Here is the updated fiddle.

+0

天才!ありがとう! –

+1

'galleryScroll'は、' setTimeout'によって呼び出されたときに定義されているのではなく、グローバルスコープで評価される文字列の適切なスコープで定義されているわけではありません。 –

+1

@amnotiam上記の編集ありがとう。 –

関連する問題