2012-10-06 3 views
5

사용자가 마우스 휠을 스크롤하거나 을 누르면 웹 페이지가 창 높이만큼 아래로 스크롤됩니다.scrollTop이 스크롤 이벤트를 호출하지 못하도록합니다.

나는 다음과 같은 코드로 결국했습니다

var newScrollTop, 
    oldScrollTop = $(window).scrollTop(), 
    preventScroll = false; 
$(window).scroll(function() { 
    if (!preventScroll) { 
     preventScroll = true; 
     newScrollTop = $(this).scrollTop(); 
     if (newScrollTop > oldScrollTop) { 
      $(this).scrollTop(oldScrollTop + $(window).height()); 
     } 
     else { 
      $(this).scrollTop(oldScrollTop - $(window).height()); 
     } 
     oldScrollTop = newScrollTop; 
     preventScroll = false; 
    } 
}); 

그러나 내가 예상대로이 작동하지 않습니다 : 스크롤 이벤트 페이지에서 매우 가장자리 (상단이나 하단)에 스크롤됩니다. 내가 뭘 놓치고 있니?

답변

2

기본 브라우저 스크롤 기능을 재정의하는 쉬운 방법은 없습니다. 여기 당신이 원하는 일을 하나의 방법입니다,하지만 브랜든 아론의 jquery-mousewheel plugin 마우스 스크롤 휠을 관리 할 필요

$(function() { 
    // Ugly hack to disable browser scrolling (downside: hides scrollbar!!!) 
    $('html').css('overflow', 'hidden'); 

    // Get viewport height by which to scroll (up or down) 
    var viewportHeight = $(window).height(); 

    // Recache viewport height on browser resize 
    $(window).on('resize', function() { 
     viewportHeight = $(window).height(); 
    }); 

    // Scroll on mousewheel 
    $('html').on('mousewheel', function(event, delta, deltaX, deltaY) { 
     // scroll down 
     if (deltaY < 0) 
      window.scrollBy(0, viewportHeight); 
     // scroll up 
     else 
      window.scrollBy(0, -viewportHeight); 
    }); 

    // Disable document keypress event 
    // which would scroll the content even with "overlow: hidden" 
    $(document).on('keypress', function(){ 
     return false; 
    }); 

    // Scroll on arrow up/down keys 
    $(document).on('keydown', function(event){ 
     // arrow down key 
     if (event.which == 40) 
      window.scrollBy(0, viewportHeight); 
     // arrow up key 
     if (event.which == 38) 
      window.scrollBy(0, -viewportHeight); 
    }); 
}); 

이 여기에 코드를 시연하는 fiddle입니다. 내 솔루션에 하나의 추악한 단점이 있다는 것을 제외하고는 모두 잘 작동합니다. $('html').css('overflow', 'hidden');이 브라우저 스크롤바를 제거합니다.

+0

가 이미 숨겨져'keypress'을 해제하는 것은 불필요한 것으로 보인다 스크롤바를 (I 예상대로 스크롤 단계가 작동 있도록 코드 약간 수정). 다른 부분은 매력처럼 작동합니다. 많은 감사합니다. – Pavlo

+1

다행입니다. 도움이 될 수 있습니다. 내 해결책으로 작은 버그를 발견했습니다. 정확하게 브라우저의 크기를 조정하면 DOMReady에 캐싱 된 viewportHeight가 더 이상 유효하지 않습니다. 이를 관리하기 위해 코드를 업데이트했습니다. – Bogdan

+0

감사합니다. 당신은 저 점을 지나서 투표를 얻었다 :-). – Bogdan

4

scrollTop()은 윈도우 스크롤 이벤트 자체에서 스크롤 이벤트를 트리거하는 문제입니다.

기본적으로 첫 번째 스크롤 이벤트가 트리거되면 다른 하나는 scrollTop()에 의해 트리거되고 preventScroll 변수는 여전히 false로 설정되지 않으므로 무한 루프로 실행됩니다.

var newScrollTop, 
    oldScrollTop = $(window).scrollTop(), 
    preventScroll = false; 

$(window).scroll(function() { 
    if (!preventScroll) { 
     preventScroll = true; 
     newScrollTop = $(this).scrollTop(); 
     if (newScrollTop > oldScrollTop) { 
      $(this).scrollTop(oldScrollTop + $(window).height()); 
     } 
     else { 
      $(this).scrollTop(oldScrollTop - $(window).height()); 
     } 
     oldScrollTop = newScrollTop; 

     setTimeout(function(){ preventScroll = false; }, 0); 
    } 
}); 

우리는 약간의 "지연"를 추가 우리가 falsepreventScroll를 설정하기 전에 :

은 당신이 그렇게처럼의 setTimeout 함수 내에서 falsepreventScroll 변수를 설정해야 할 것입니다 귀하의 코드가 작동을합니다. 이 방법으로 scrollTop() preventScroll 변수를 호출해도 여전히 true로 설정됩니다!

는 다음 작업 바이올린의 : http://jsfiddle.net/J6Fcm/

관련 문제