2017-09-06 1 views
0

선택한 날짜에 따라 다른 내용을 표시하는 타임 라인이 있습니다. 타임 라인을 클릭하거나 마우스 휠로 스크롤하여 날짜를 선택할 수 있습니다. 서로 다른 콘텐츠 요소의 페이드 아웃/페이드 효과를 얻기 위해 각 콘텐츠에 일부 애니메이션이 첨부되어 있습니다.이 경우 중첩 된 애니메이션과 콜백이 사용됩니다.jQuery로만 처음으로 작업하는 이벤트 분리

내가 할 수없는 일은 빨리 움직이는 경우 다음 애니메이션이 시작되기 전에 이전 애니메이션이 끝날 때까지 기다리는 것입니다. 아니면 더 나은 애니메이션 함수 시작 부분에서 스크롤 이벤트를 분리하고 마지막으로 animate 함수 호출의 콜백으로 다시 첨부합니다.이 함수는 처음에만 작동하지만 후속 스크롤에서는 작동하지 않습니다.

아이디어가 있으십니까?

함수 검출 스크롤 : detatching jumpToEvent 함수 호출 애니메이션

function detachScroll(){ 
      console.log('detach'); 
      $('.events-content').first().unbind('mousewheel'); 
      $('.events-content').first().off('DOMMouseScroll'); 
     } 

기능, 스크롤링

 //detect mouse scrolling and determine the direction 
     function detectScroll() { 
      $('.events-content').first().bind('mousewheel', function (e) { 
       var delta = e.originalEvent.wheelDelta; 
       if (delta > 0) { 
        jumpToEvent('prev'); 
       } else { 
        jumpToEvent('next'); 
       } 
      }); 

      //firefox 
      $('.events-content').first().on('DOMMouseScroll', function (e) { 
       var delta = e.originalEvent.detail; 
       if (delta < 0) { 
        jumpToEvent('prev'); 
       } else if (delta > 0) { 
        jumpToEvent('next'); 
       } 
      }); 
     } 

기능, 즉 표시하는 정확한 콘텐츠를 선택

//display correct content depending on the selected date 
function updateVisibleContent(event, eventsContent) { 

    var visibleContent = ...., selectedContent =....; 

    detachScroll(); 

    visibleContent.find('....').each(function() { 
     $(this).animate({ 
      opacity: 0 //hide current content 
     }, 600, function() { 

      visibleContent.removeClass('selected'); 
      selectedContent.attr('class', 'selected'); 

      //now show the next content, with 3 subsequent steps (Showing only one for the sake of readability) 
      selectedContent.find('...').first().animate({ 
       opacity: 1 
      }, 500, function() { 
        detectScroll(); 
      });    
     }); 
    });  
} 
+0

'.stop()'을 사용하여 오래된 애니메이션을 중단하는 것은 어떨까요? – Deckerz

+0

애니메이션 기능을 문서 준비 기능과 함께 등록하여 애니메이션 완성을 허용하고 페이지가 원하는 모든 이벤트를 위임 할 때 새 기능을 시작하려고 시도 했습니까? –

+0

@Deckerz 나는 detach() 대신에 애니메이션 함수의 시작 부분에 .stop()을 사용하려고 시도했으나 비슷한 동작을한다. 처음 작동하는데, 그 다음엔 빠르게 스크롤하면 다음 콘텐츠가 모두 함께 표시됩니다. 그런데 그것은 내가 원하는 행동이 아니기 때문에 내용이 완전히 보일 때까지 "기다리기"를 원합니다. 어떤 단서? – sissy

답변

1

모든 애니메이션 호출 전에 .stop()을 추가해야합니다. 그러면 다음 애니메이션을 호출 할 때 보류중인/진행중인 애니메이션이 없습니다.

0

jQuery deferred-object을 사용해 보셨습니까? 비동기 함수가 끝나기를 기다리는 방법입니다.

function doAnimations(domElement, i) { 
    var dfd = jQuery.Deferred(); 

    $(domElement[i]).animate({ 
    //do somthing 
    }, 600, function() { 
    dfd.resolve 
    }) 

    return dfd.promise(); 
} 

//And this is how you can itterate tru items 
(function rec(i){ 
    if(i >= numbers of itterations) { 
    console.log('End') 
    return false 
    } 

    doAnimations(domElement, i).done(function(){ 
    rec(++i) 
    }) 
})(0) 
+0

나는 비슷한 해결책을 보았습니다, https://stackoverflow.com/questions/18360963/ 반복 - 중첩 - 애니메이션 jquery 여기지만, 내 문제를 해결하지 않을 줄 알았는데.나는 예제를 얻지 못한다면 시도해 보지만, 지금은 괜찮아 보인다. – sissy

관련 문제