2011-11-08 155 views
0

我有一个人为我创建了一个jQuery插件。基本上,这是slideshow内5个不同的幻灯片。它工作正常,除了一件事。一旦最后一张幻灯片完成,它就停止。我需要它回到第一张幻灯片。有人可以看看他的代码,看看他们是否可以帮忙弄清楚吗?谢谢。jQuery幻灯片插件中的动画幻灯片。最后一张幻灯片不会回到第一个

<div id="slides"> 
        <div class="slider" id="category0"> 
         <a class="button prev" href="#" rel="nofollow"><img src="images/slidePrev.png"/></a> 
         <a class="button next" href="#" rel="nofollow"><img src="images/slideNext.png"/></a> 
         <div class="holder_cont"> 
          <ul class="holder"> 
           <li class="slide first"> 
           </li> 
           <li class="slide"> 
           </li> 
           <li class="slide"> 
           </li> 
           <li class="slide"> 
           </li>       
          </ul> 
         </div> 
         <div class="clear"></div>        
        </div> 

<script> 
;(function($) { 
$.preloadImages = function(images, func) {   
    var i = 0; 
    var cache = []; 
    var loaded = 0; 
    var num = images.length; 

    for (; i < num; i++) (function(i) { 
     var new_image = $('<img/>').attr('src', images[i]).load(function(){ 
      loaded++; 

      if(loaded == num) 
      {             
       func();     
      } 
     });      
     cache.push(new_image); 
    })(i); 

    return true; 
}; 

$.fn.imgSlider = function(images) {   
    if (!$(this).length || $(this).length>1) {    
     return this; 
    } 

    var direction = 'right'; 
    var e = this; 
    var timeout_id = 0; 
    var in_progress = false 
    var i = 0; 
    var num_slides = $(e).find('.holder > li').length; 
    var slide_widths = $(e).find('.holder > li:first').width(); 
    var speed = 900; 
    var current=0; 

    for (; i < num_slides; i++) (function(i) {    
     $(e).find('.holder > li').eq(i).css('background', 'url('+images[i]+') no-repeat'); 
    })(i); 

    function slider_animate(to) 
    { 
     clearTimeout(timeout_id); 
     timeout_id = setTimeout(auto_animate, 5000); 
     in_progress = true;    

     var toMove = $(e).find('.holder'); 
     current = to; 

     $(toMove).animate({'margin-left':'-'+(slide_widths*to)+'px'}, speed, null, function(){     
      in_progress = false; 
     });   
    } 

    $(e).find('.holder > li').hover(function(){ 
     clearTimeout(timeout_id);    
     $(this).find('.caption').stop().fadeTo(500, 0.8);    
    },function(){ 
     $(this).find('.caption').stop().fadeTo(500, 0);    
     timeout_id = setTimeout(auto_animate, 3500);    
    }); 

    function auto_animate() 
    { 

     if (current === num_slides-1) { 
      var foo = $('.slider:not(.hidden)').attr('id'); 
      if ($(e).attr('id') === foo) { 
       if ($('#category'+(parseInt(foo.slice(8))+1)).length) { 
        window.startSlider(parseInt(foo.slice(8))+1); 
       } 
      } 
     } 

     if(direction == 'right') 
     { 
      var to = current+1; 
      if(to<num_slides) 
      { 

       slider_animate(to); 
      } 
     } 
     else 
     { 
      var to = current-1; 
      if(to>=0) 
      { 
       slider_animate(to); 
      } 
      else 
      { 
       var foo = $('.slider:not(.hidden)').attr('id'); 
       if ($(e).attr('id') === foo) { 
        if ($('#category'+parseInt(foo.slice(8))+1).length) { 
         window.startSlider(parseInt(foo.slice(8))+1); 
        } 
       } 
      } 
     } 
    } 

    $(e).find('.next').live('click', function(){ 
     if(!in_progress) 
     { 
      var to = current+1; 

      if (current === num_slides-1) { 

       var foo = $('.slider:not(.hidden)').attr('id'); 
       if ($(e).attr('id') === foo) { 
        var bar = '#category' + (parseInt(foo.slice(8))+1); 
        if ($(bar).length) { 
         window.startSlider(parseInt(foo.slice(8))+1); 
        } 
       } 
      } 
      if(to<num_slides) 
      { 
       slider_animate(to); 
      } 
      else 
      { 
       slider_animate(0); 
      } 
     } 

     return false; 
    }); 

    $(e).find('.prev').live('click', function(){ 
     if(!in_progress) 
     { 
      var to = current-1; 

      if (current === num_slides-1) { 
       var foo = $('.slider:not(.hidden)').attr('id'); 
       if ($(e).attr('id') === foo) { 
        if ($('#category'+parseInt(foo.slice(8))+1).length) { 
         window.startSlider(parseInt(foo.slice(8))+1); 
        } 
       } 
      } 

      if(to>=0) 
      { 
       slider_animate(to); 
      } 
      else 
      { 
       slider_animate(num_slides-1); 

      } 
     } 

     return false; 
    }); 

    timeout_id = setTimeout(auto_animate, 3000); 

    return true; 
}; 
})(jQuery); 
</script> 

回答

1

未经测试,但您似乎需要在if(...) { window.startSlider }零件中进行更改。例如:

if (...) { 
    window.startSlider(...); 
} else { 
    window.startSlider(0); 
} 

看来,如果不执行if声明,你的幻灯片将停止;如果是,它会移动到下一个幻灯片。所以else应该在没有更多的幻灯片可以通过时执行,并从头开始。

我可能读错了;没有一个可行的例子很难说(jsfiddle对此很有用)。希望这有助于= ^。^ =

0

我认为改变代码:$.fn.imgSlider > function auto_animate() > if(direction == 'right'){}以下内容可能会有所帮助:

var to = current+1; 
if(to<num_slides){ 
    slider_animate(to); 
} 
else{ 
    slider_animate(0); 
} 

如果我解释我自己好了,你现在只补充说else{}子句的代码。

+0

这没有帮助。 –

+0

这只会导致它回到上次幻灯片的第一张幻灯片。它需要回到第一个幻灯片。 –