2011-06-27 30 views
0

私は、マウスオーバー時にイメージがサイクルを開始し、マウスアウト時にサイクリングが止まるようにするための簡単なイメージサイクル(遷移なし)を取得しようとしています。これは、マウスアウト時に停止することを除いて機能します。私は、間隔をクリアする方法を考え出すのに苦労しています:マウスオーバー時のクリア間隔

var itemInterval = 750; 
var numberOfItems = $('.portrait img').length;   
//set current item 
var currentItem = 0;    
//show first item 
$('.pimg').eq(currentItem).show();   

$('.portrait').hover(function() {      
    //loop through the items 
    var infiniteLoop = setInterval(function(){ 
     $('.pimg').eq(currentItem).hide(); 
     if(currentItem == numberOfItems -1){ 
      currentItem = 0; 
     }else{ 
      currentItem++; 
     } 
     $('.pimg').eq(currentItem).show(); 
    }, itemInterval); 
}, 
function() { 
    clearInterval(infiniteLoop); 
}); 

2番目の最後のラインはどうすれば動作させることができますか?

編集:

+0

とにかくベストプラクティスでは、一貫性がなく、コードを同期させないで実行する可能性のあるsetIntervalに頼らないことをお勧めします。代わりに、setTimeout()で終了したときに自身を呼び出す関数を使用する必要があります。これにより、機能のタイミングをより適切に制御することができます。 –

+0

ホセありがとう。私はそれを認識していませんでしたが、それは完璧な意味があります。 – Jeff

答えて

3

関数のvar infiniteLoop外側を規定する非コードタイプミスのカップルを固定し、関数内(varなし)infiniteLoop = setInterval...としてタイムアウトを設定します。全コード:

​​3210
+0

これは素晴らしいです、ありがとうございました。代わりに、$( '.pimg')を$(this 'img')のようなものを使用するように変更して、ページごとに複数の画像サイクルを持つことができますか? $( '.pimg')の代わりに$(this).find()と$(this).children()を使ったテストは失敗しています。 – Jeff

2

あなたはそれを呼び出している他のanonimous関数内盛ない関数、内部のinfiniteLoopを宣言しました。その変数を両方の関数の外に宣言するだけです。

1

範囲の問題があると思います。試してみてください。

var itemInterval = 750; 
var numberOfItems = $('.portrait img').length; 
var infiniteLoop = null;  
//set current item 
var currentItem = 0;    
//show first item 
$('.pimg').eq(currentItem).show();   

$('.portrait').hover(function() {      
    //loop through the items 
    infiniteLoop = setInterval(function(){ 
     $('.pimg').eq(currentItem).hide(); 
     if(currentItem == numberOfItems -1){ 
      currentItem = 0; 
     }else{ 
      currentItem++; 
     } 
     $('.pimg').eq(currentItem).show(); 
    }, itemInterval); 
}, 
function() { 
    clearInterval(infiniteLoop); 
}); 
関連する問題