1

スライドショーを実行するためのこのコードがあります (これは私のコードで実際に行われていることの一部にすぎません)

var slideshow = {
        delay: 5000,
        actions:[],
        run: function() {
                if (slideshow.actions.length) {
                        slideshow.actions.shift()();
                        setTimeout(slideshow.run, slideshow.delay);
                }
        }
};
 var tn;
$(".sideimg").each(function(){
        var that = this;

        slideshow.actions.push(function(){
 if (tn != "") {
  out(tn);
 }
 over($(that).attr("id"));
 var $paneTarget = $('#lyr1');

 var $target = $paneTarget.find('#'+$(that).attr("id"));
 $paneTarget.stop().scrollTo( $target , 800 );

 $("#rimg").fadeOut("slow",function () {
 $("#rimg").attr("src",$(that).attr("bsrc")); 
 $("#rimg").attr("alt",$(that).attr("alt")); 
   $("#rimg").fadeIn("normal");
  });
 tn = $(that).attr("id");

        });

});

各sideimgクラスの実行が終了すると停止します...最初からやり直す必要があります...思い出そうとしましたが、何も起こりませんでした

みんなありがとう

4

2 に答える 2

1

あなたの Run メソッドでは、配列要素をシフトします..これにより、配列からそれらが削除されます..それをシフトしてから、最後に押し戻す必要があります...

var slideshow = {
        delay: 5000,
        actions: [],
        timer: null,
        pause: function(){ clearTimeout( slideshow.timer ); },
        resume: function(){ slideshow.timer = setTimeout(slideshow.run, slideshow.delay); },
        run: function() {
                    if (slideshow.actions.length) {
                            var current = slideshow.actions.shift();
                            current();
                            slideshow.actions.push( current );
                            slideshow.timer = setTimeout(slideshow.run, slideshow.delay);
                    }
            }
};

タイムアウト オブジェクトを保持するタイマー変数を追加したので、必要に応じてクリアできます。また、スライドショーを開始/停止するためのメソッドもいくつか追加しました。

スライドショーを開始/停止する要素にホバーイベントを追加する か、slideshow.pause()またはslideshow.resume()

于 2010-03-05T12:59:31.097 に答える
1

この状況では、 each メソッドはまったく使用しません。画像/href 情報を持つオブジェクトの配列である setTimeout と、画像の配列のどこにいるかを示す値を使用します。配列の最後に到達したら、値をリセットします (次のコードはわかりやすくするために簡略化されており、テストされていません)。

var index = 0;
var images = // array of image containing objects here. 

function RunSlideShow()
{
     // modify the following line to perform any effects, etc, and other attribute settings you need. 
     $("#rimg").attr("src", images[index].image);

     index = index + 1;
     if (index = images.length)
         index = 0;
     window.setTimeout('RunSlideShow();', 5000);
}

RunSlideShow();

スライドショー オブジェクトの関数が呼び出されるたびに、その関数が終了する前に次のスライドをロードする必要があります。完了時に各再ループを行うことの問題は、「いつ停止するか」という質問です。すべての画像を事前にロードして永遠に続けると、無限ループが発生し、ブラウザがクラッシュする可能性が高くなります。画像を設定し、次に表示する画像を準備するには同じ関数が必要ですが、次の画像よりも先の画像を探す必要はありません。それを超えようとするときはいつでも、決して止まることのない、増え続けるアイテムのコレクションを作成するリスクがあります。

于 2010-03-05T12:24:45.430 に答える