2011-02-14 5 views
0

이것은 이전에 아마도 답변을 받았을 것입니다. 그리고 나는 이것이 어떻게 작동해야하는지 이미 알고 있지만, 어떤 이유로 그것이 아닙니다. 나는 그것이 어떻게 요소들을 반복 하는지를 생각할 수 있습니다.갤러리의 목록 항목을 회전하는 jQuery

$(document).ready(function() { 
    var element = '#gallery ul#gallery-container'; 
var idx=0; 
var timeout = 3000; 
var number = $(element + ' li').length; 

function changeSlide() { 

    $(element + ' li:eq(' + idx + ')').fadeOut(); 

    idx = idx + 1; 

    if (idx == number) { 
     idx=0; 
    } 

    $(element + ' li:eq(' + idx + ')').fadeIn().delay(timeout).delay(0, function() { 
     changeSlide(); 
    });; 

} 

$(element + ' li').hide(); 

$(element + ' li:first').fadeIn().delay(timeout).delay(0, function() { 
    changeSlide(); 
}); 
}); 

그런 다음 목록은 다음과 같이이다 :

<div id="gallery"> 
    <ul id="gallery-container"> 
     <li><img src="media/images/screen-shot-02.jpg" width="173" height="258" alt=" "></li> 
     <li><img src="media/images/screen-shot-01.jpg" width="173" height="258" alt=" "></li> 
    </ul> 
</div> 

목록 항목이 함수를 호출하고 자신을 숨 깁니다 그래서 나는 지연 후, 하나의 요소의 하나를 통해 루프를 얻으려고 노력했다, 카운터가 증가되고 현재 색인이 표시됩니다. 는 나는 그것을 호출되는 함수에 경고를 넣어 마치 범인이로 의심 :

$(element + ' li:eq(' + idx + ')').fadeOut(); 
+1

이 http://api.jquery.com/delay/에 따르면'delay()'함수에는 콜백 함수가 없으므로'changeSlide()'가 실행되지 않습니다. 나는 생각하고 있습니다. –

+0

어떤 이유로 인해 changeSlide()가 처음 호출되었지만 $ (element + 'li : eq ('+ idx + ')') 함수에 도달하면 fadeOut(); 호출되지 않습니다. 나는 setTimeout에 의지해야하고 그것으로 작업해야 할 수도 있습니다! – Designer023

+0

예,'changeSlide()'의 마지막 줄에 두 개의';;'를 적어두면 스크립트를 멈추게됩니다. –

답변

5

가장 큰 문제는 주석 상태로, delay은 당신이하지 생각하지 않는다 - 당신이해야 대신 네이티브 setTimeout 함수를 살펴보십시오. 여기에 더 효율적으로 만들 수있는 여러 곳이 있습니다.

var element = $('#gallery-container li'), 
    length = element.length, 
    current = 0, 
    timeout = 3000; 

function changeSlide() { 
    element.eq(current++).fadeOut(300, function(){ 
     if(current === length){ 
      current = 0; 
     } 

     element.eq(current).fadeIn(300); 
    }); 

    setTimeout(changeSlide, timeout); 
} 

element.slice(1).hide(); 
setTimeout(changeSlide, timeout); 

우리는 동적으로 생성 된 선택과 jQuery를 기능을 보여주고, 대신 시작시 캐시 된 모든 슬라이드가 포함 된 jQuery를 개체의 단일 인스턴스를 조작하지 않으려 고 : 이것 좀 보라. fade 함수가 제공하는 콜백 함수를 사용하여 현재 슬라이드가 페이드 아웃 한 후 다음 슬라이드를 페이드 인합니다. 플러그인에 포장, 여전히 더 나은

$(document).ready(function() { 
    var element = '#gallery ul#gallery-container'; 
    var idx = 0; 
    var timeout = 3000; 
    var number = $(element + ' li').length; 

    setInterval(function() { 
     idx = (idx + 1) % number; 
     $(element + ' li:visible').fadeOut(); 
     $(element + ' li:eq(' + idx + ')').fadeIn(); 
    },timeout); 
    $(element + ' li:not(:first)').hide(); 
}); 

또는 :

+0

빙고! 그게 치료를 한, 그리고 그게 더 효율적인 방법입니다. 당신은 전설입니다. 감사합니다 – Designer023

2

나는 이런 식으로 뭔가를 할 것이다 간단한 데모 http://www.jsfiddle.net/b3Lf5/1/를 참조

(function ($) { 
    $.fn.customGallery = function (options) { 
     defaults = { 
      timeout : 3000 
     }; 
     options = $.extend(defaults, options); 
     return this.each(function() { 
      var idx = 0, number = $(this).children('li').size(), element = this; 
      setInterval(function() { 
       idx = (idx + 1) % number; 
       $(element).children('li:visible').fadeOut(); 
       $(element).children('li:eq(' + idx + ')').fadeIn(); 
      },options.timeout); 
      $(element).children('li:not(:first)').hide(); 
     }); 
    }; 
}(jQuery)); 

jQuery(document).ready(function($) { 
    $('#gallery-container').customGallery() 
}); 

편집 : 플러그인 코드를 편집하여 우수 사례를 제시합니다.

+0

플러그인 아이디어가 우수합니다. 나중에 코드를 다시 작성하자마자 구현할 것입니다. – Designer023

+0

나는 나중에 플러그인에서 재사용하고 싶은 모든 jQuery 코드를 래핑하는 경향이있다. 단지 다른 곳으로 확장하고 사용하기가 쉽습니다. 나는 시간이 지남에 따라 구축 한 거대한 부를 가지고있다. –

+0

Oh와 BTW JavaScript의'setInterval'은 매 x 밀리 초마다 동작을 반복 할 것이므로, 재귀 적으로 자신을 호출 할 필요가 없습니다. –

관련 문제