2011-01-30 19 views
0

私のJSでは少し錆びていますが、ここに私のコードです... 基本的に私はマウスオーバーで、 srcを置き換え、フェードインして戻します。これは素晴らしい動作です。一度すべての画像を取得したら、それを元に戻し、mouseoutイベントが停止するまでループを繰り返していきます。JSイベントの終了ループ

私はちょうど関数cycle_images($(current_image));の中から関数をもう一度呼び出すことができたと思っていましたが、それはブラウザが驚くように驚いています。これを達成するための良い方法は何ですか?

$.fn.image_cycler = function(options){ 
    // default configuration properties 
    var defaults = { 
    fade_delay:  150, 
    image_duration: 1500, 
    repeatCycle: true, 
    }; 
    var options = $.extend(defaults, options); 

    this.each(function(){ 
    var product  = $(this); 
    var image  = $('div.image>a.product_link>img', product); 
    var description = $('div.image>div.description', product); 
    var all_images = $('div.all_images', product); 
    var next_image = ($(all_images).find('img[src="' + $(image).attr('src') + '"]').next('img').attr('src')) ? $(all_images).find('img[src="' + $(image).attr('src') + '"]').next('img') : $(all_images).children('img').first();; 

    // mouseover 
    image.fadeOut(options.fade_delay, function(){ 
     image.attr('src', next_image.attr('src')); 
     image.fadeIn(options.fade_delay); 
    }); 
    if (options.repeatCycle){ 
     var loop = function() { 
     product.image_cycler(); 
     } 
     setTimeout(loop,options.image_duration); 
    } 
    }); 
}; 


$(document).ready(function() { 
    $('div.product').hover(function(){ 
    $(this).image_cycler(); 
    }, function(){ 
    $(this).image_cycler({repeatCycle: false}); 
    }); 
}); 
+0

私は.each内のすべての画像を使用しますが、 'VARのIMGを= $( 'div.imageは、IMGをdiv.all_images:最初の' を使用していない助言します) 'と続けて' var img = $(this).next()|| $( 'div.image div.all_images img:first'); '(またはソートの一部)。 –

答えて

0

マウスオーバーで再試行して停止するように思えます。あなたはcycle_images()関数を定義した後、フラグを追加

cycle_images.repeatCycle = true; 

cycle_images機能の終わりにrepeatCycleは、マウスアウトで

if (this.repeatCycle) { 
    var f = function() { 
     return cycle_images.apply(this, [$current_image]); 
    } 
    setTimeout(f,50); 
} 

そして、タイムアウトして再帰呼び出しを追加します、

cycle_images.repeatCycle = false; 
+0

だから私はあなたの両方(bradさんの提案)で私のコードを完全に修正しましたが、今はサイクラーを止めることに問題があります!私のmouseout関数は、そのオプションを設定する代わりにimage_cycler関数の新しいインスタンスを作成しています。私はこのコードははるかにクリーンだと思いますが、どのように私はmouseoutのループを壊すことができますか? – brewster

+0

oops。打ち間違え。私はあなたの(そしてbradの提案)を意味しました。再帰的な呼び出し作業は素晴らしいです。 – brewster

関連する問題