2014-06-06 2 views
0

저는 모듈 패턴이라고 생각하는 자바 스크립트를 쓰고 있습니다. (틀린 용어를 사용하면 여전히 프로그래밍에 익숙하지 않아 용서해줍니다.) 모듈 패턴을 사용하여 문서 데이터를 검색하는 방법은 무엇입니까?

아래 스크립트

는 세 가지를 측정하고자 할 때 문서로드 :

  1. 페이지를 스크롤 한 거리입니다.
  2. y- 오프셋은 문서 상단에 상대적으로 #eventSideBar입니다.
  3. 문서의 전체 높이입니다.
    (function (exocet, $, undefined) { 
    
        var scrollDistance = function() { 
         return $('body').scrollTop() 
        } 
        var sideBarOffset = function() { 
         return $('#eventSideBar').offset().top; 
        } 
        var allHeight = function() { 
         return $('body').height(); 
        } 
    
        exocet.init = function() { 
         console.log('Scroll distance: ' + scrollDistance() + 
            ' Sidebar offset: ' + sideBarOffset() + 
            ' Total height: ' + allHeight() 
         ); 
        }; 
    
    }(window.exocet = window.exocet || {}, jQuery)); 
    
    $(document).ready(function() { 
        exocet.init(); 
    }); 
    

    콘솔이 로깅

는 (크롬에서 테스트) 지속적으로 올바르게 반환되는 유일한 값은 sideBarOffset입니다. scrollDistance은 항상 0을 반환하고 allHeight은 +/- 약 1000px입니다.

나는 다음과 exocet.init을 변경하는 경우 :

exocet.init = function() { 
    console.log('Scroll distance: ' + scrollDistance() + 
       ' Sidebar offset: ' + sideBarOffset() + 
       ' Total height: ' + allHeight() 
    ); 
    $(document).scroll(function(){ 
     console.log('Scroll is now: ' + scrollDistance()); 
    }); 
}; 

그때 항상 정확한 스크롤 위치 값을 얻을. 이것은 옳은 결과를 얻지 만, 약간 hackish 보인다.

내 접근 방식에서 발생하는 것처럼 보이는 document 메서드를 연결하지 않고 데이터를 가져 오는 "적절한"방법이 있습니까? 당신이 필요로하는 것은 같은

+0

'$ (window) .load()'에서'exocet.init()'를 호출하면 어떻게됩니까? – Malk

+0

@Malk 비슷한 결과 - 첫 번째 경우와 동일합니다. 두 번째에서 scrollDistance는 약 1/4의 시간입니다. – verism

+0

그것이 내 마지막 [jsbin] (http://jsbin.com/jeqag/1/)에서 작동하는 것처럼 보입니다. 문서 설정 및 결과는 어떻게됩니까? –

답변

1

는 소리 :

$(document).scroll(function() { exocet.init(); }); 

은 준비 콜백 내부에 있음을 넣습니다. 결과는 사용자가 스크롤 할 때 기록되어야합니다. 새로 고침을하는 것은별로 의미가 없습니다.

+0

이것은 확실히 작동합니다. 고마워요. 새로 고침을 실제로 누르면 아무런 의미가 없습니다. 이제는 세션 당 두 번 이상 실행되는 init 함수를 예상하지 않았으므로 코드 논리를 다시 고려해야합니다. – verism

0

@ beautifulcoder의 예는 문서가 스크롤 될 때마다 작동합니다. 페이지로드시 스크롤 위치를 원할 경우 (즉, 이전에 페이지에 스크롤 위치가 저장된 경우) 함수를 load 이벤트 핸들러에 넣고 짧은 시간 제한을 사용하여 해당 초기 스크롤 위치를 캡처 할 수 있습니다.

$(window).on('load', function() { 
     setTimeout(function() { 
      exocet.init(); 
     }, 200); 
    }); 

둘 다 원할 경우 scroll 이벤트 처리기도 사용하십시오.

수정 JSBin 예.

+0

왜'setTimeout()'인가? – jfriend00

+0

'load' 이벤트는 스크롤되도록 저장된 초기 스크롤 위치를 기다리지 않습니다. 그래서 타임 아웃은 정확한 스크롤을 얻을 수 있도록 스크롤이 생길 때까지 기다리는 데 약간의 여유를줍니다. –

+0

그래서 OP가 묻는 것은 "그게"무엇입니까? 매우 불투명 한 질문입니다. 나는 새로 고침 후 스크롤에 관한 질문에서 아무것도 볼 수 없다. – jfriend00

관련 문제