0

カスタム JS サムネイル チェンジャーに取り組んでいますが、動作します。サムネイルを無期限にループさせたい。現時点では、それまで進みi==thumbs、その後停止します。ここにコードが切り取られています:

for (var i = 1; i <= thumbs; i++) {
    timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i * 100 * 10);
}

私が望むのは、 (最後のサムネイル) にi到達した場合、1thumbsにリセットしてループを再度i再生することです。forしかし、私はそれを機能させることができません。

以下を含む多くのことを試しましたが、タイムアウトが原因でブラウザがクラッシュします:どうにかしてそのタイムアウトの問題を完全に回避できますか?

for (var i = 1; i <= thumbs; i++) {
    timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i * 100 * 10);

    if (i == thumbs) {
        i = 1; 
        clearTimeout(timer[i]); 
        continue;
    }
}
4

4 に答える 4

0
while (i<=thumbs) {

    // do stuff before i increments

    if(i===thumbs) {
       i = 0;
    } else {
       i++;
    }

    // do stuff after i was
    // incremented

}

ただし、このように記述されたループは永久に実行されるため、パフォーマンスに大きな影響を与えることに注意してください。

于 2013-05-04T10:37:11.253 に答える
0

これはループの終了条件であるため、iの値に決して到達しないことに注意してください。>thumb

あなたの問題はこの状態にあります:

if (i>thumbs)

次のように変更します。

if(i == thumbs)

コードは次のようになります。

for (var i=1; i<=thumbs; i++) {
    timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i*100*10);
    if (i==thumbs) {
       i=1; 
       clearTimeout(timer[i]); 
       continue;
       }
  }
于 2013-05-04T10:38:37.703 に答える
0

無限ループで aを使用することsetTimeoutは、悪い習慣です。短時間で何千ものタイムアウトを作成することになるからです。そのため、ブラウザがクラッシュします。(たとえば) 5 秒で (たとえば) 10000 のタイムアウトを作成することになり、ブラウザはそれに追いつかなくなり、メモリを消費しすぎてクラッシュします。

最後のタイムアウトが発生した後に新しいタイムアウトを作成することをお勧めします。

var i = 1;
var changeAfterTimeout = function () {
    i++;
    // check if we have finished the thumbnails. If so, start over
    if (i == thumbs) {
        i = 1;
    }
    Thumbchange(image_id + url + i + ".jpg");
    // call again after 5 seconds
    setTimeout(changeAfterTimeout, 5000);
}
changeAfterTimeout();

このようにして、常に1 つのタイムアウトだけが実行されます。

于 2013-05-04T10:48:43.810 に答える