2016-06-13 4 views
0

바이올린 : https://jsfiddle.net/8na2n5L2/자바 스크립트/jQuery를 이미지 슬라이더 문제

내가 이미지 슬라이더를 만들려고 해요,하지만 몇 가지 이유로 그냥이 작동하지 않는 이유는 주위에 내 머리를 정리하고 수 없습니다. 나는 기본적으로 이미지가 오른쪽 (화면에서 벗어남)에서 들어오는 슬라이더를 만들고, 중심 이미지는 왼쪽 (화면에서 벗어남)으로 푸시하려고합니다. 그런 다음 왼쪽 이미지가 다시 센터로 갈 때가되면 중앙으로 가기 전에 다시 오른쪽으로 빠르게 돌아갑니다.

jQuery를 (문서) .ready (함수() {

var images = []; 

//store the images in an array 
jQuery('.main-image-slider').each(function() { 
    images.push(jQuery(this)); 
}); 

var i = 0; 
var max = images.length - 1; 

setInterval(function() { 
    if (i > max) { 
     i = 0; 
    } 

    images[i].removeClass('main-image-slider-left').addClass('main-image-slider-right').delay(100).queue(function() { 
     images[i].removeClass('main-image-slider-right').addClass('main-image-slider-center').dequeue(); 
     i++; 
    }); 


    if (images[i - 1]) { 
     images[i - 1].removeClass('main-image-slider-center').addClass('main-image-slider-left'); 
    } 


}, 3000); 

}); 코드가 images[i].removeClass('main-image-slider-right')...를 실행 한 후, i++이 먼저 실행 때문에

+0

으로 변경했습니다. 다음 요일에 스 니펫이나 데모를 추가 할 수 있다면 좋을 것입니다. 어쨌든 짧은 예제이므로 증분 직전 상태에서 오류가 발생한다고 가정합니다. 'if (images [i-1])'- 첫 번째 반복에서 -1 번째 요소에 대한 참조 일 수 있습니다. 배열은 인덱스가 0이고 -1이 아니기 때문에 결코 존재하지 않을 것입니다. 대신 이전 이미지를 i> 0으로, i === 0 일 때 이전 이미지를 인덱스 이미지에 표시 할 수 있습니다. [max] – lmenus

+0

희망이 있습니다. 'var previous = i> 0을 만들겠습니까? images [i-1] : images [max];'그런 다음 오류 조건이 전혀 필요 없으며'previous.removeClass()'등을 할 수 있습니다. – lmenus

+0

다음에 디버깅을위한주의 사항 : 어떤 라인에서 에러가 발생했는지, 이것이 시작입니다. 그 상태가 잘못되었음을 알 수 있습니다. 당신이 배열 항목에 접근하고 있고 콘솔이'undefined'타입에 대해 불평하고 있었기 때문에, 당신은 유효하지 않은 인덱스에 접근하고 있음을 의미합니다. 그건 그다지 문제가 아니지만, 그때 당신은'removeClass()'메소드를 호출하려고했기 때문에 콘솔이 불평하는 이유가 있습니다. undefined는 그런 속성을 가지고 있지 않습니다. 그로부터, 존재하지 않는 요소에 액세스하고 있음을 공제 할 수 있습니다. 희망이 도움이 – lmenus

답변

1

I get this console error "Uncaught TypeError: Cannot read property 'removeClass' of undefined".

이 오류입니다.

images[i].removeClass('main-image-slider-left').addClass('main-image-slider-right').delay(100).queue(function() { 
    // the 'i' is already added 1, so it may equal images[max], so you got that error 
    images[i].removeClass('main-image-slider-right').addClass('main-image-slider-center').dequeue(); 
}); 

당신은 queue으로 i++를 이동할 수 있습니다 : 당신이 시도 할 수

images[i].removeClass('main-image-slider-left').addClass('main-image-slider-right').delay(100).queue(function() { 
    images[i].removeClass('main-image-slider-right').addClass('main-image-slider-center').dequeue(); 
    // after all the animation is done, at the end of queue update 'i'. 
    i++; 
}); 

.

참고 : 코드 끝에 i++을 제거하는 것을 잊지 마십시오.

업데이트

업데이트가 if (images[i - 1])으로 클래스를 업데이트하지 않습니다 슬라이드의 가장자리에 jsfiddle 코드

이, 꼬마 필요가 항상 이전 슬라이드의 클래스를 업데이트합니다. 그래서 코드를

images[i == 0 ? images.length - 1 : i - 1].removeClass('main-image-slider-center').addClass('main-image-slider-left'); 
+0

안녕하세요 Haizhou, jQuery와 작동하지 않지만 왜 함수가 마지막 작업으로 정의 될 때 ++가 먼저 실행됩니까? – lmenus

+0

@Haizhou 나는 여기에 바이올린을 추가했다. 이것은 작동하지 않지만 https://jsfiddle.net/8na2n5L2/ –

+0

@ Lubos는 100ms 동안 '지연'하기 때문에 한 걸음 더 가깝습니다. jsFiddle [link] (https://jsfiddle.net/b96zoph6/)을 확인하십시오. –