2010-12-03 5 views
1

jScrollPane은 기본 브라우저 스크롤 막대를 수정하는 멋진 jQuery 플러그인입니다. jScrollPane을 사용할 채팅 응용 프로그램을 개발 중입니다. 지금까지 최대 스크롤 높이를 결정할 수 없다는 점을 제외하고는 훌륭하게 작동합니다. 여기 내가 뭘하려고하는지 :jScrollPane에서 최대 스크롤 높이를 얻는 방법?

$(function() 
{ 
    $('#chatPane').jScrollPane(); 
    var api = $('#chatPane').data('jsp'); 
    setInterval(function() 
    { 
     $.ajax(
     { 
      url: "Home/GetMessage", 
      type: "POST", 
      success: function (response) 
      { 
       // This next line is where the issue occurs. I need to check if the current scroll position is equal to the max scroll position. This is to implement the auto scroll if the user has scrolled to the bottom of the chat. 
       var atBottom = (api.getContentPane().getContentPositionY() == api.getContentPane().getMaxScrollHeight()??????); 
       api.getContentPane().append(response); 
       api.reinitialise(); 
       if (atBottom) 
        api.scrollToBottom(); 
      }, 
      error: function (xhr, textStatus, errorThrown) 
      { 
       alert(textStatus); 
      } 
     }); 
    }, 1000); 
}); 

getMaxScrollHeight가 존재하지 않습니다. 최대 스크롤 높이를 결정하는 방법이 필요합니다.

편집 : 다음과 같이 ajax success 함수가 변경되었습니다. 그러나 누군가가 아래쪽으로 스크롤하고, 현재 위치를 얻은 다음 이전 위치로 스크롤하는 것보다 더 나은 방법을 알고 있다면 크게 감사 할 것입니다. 당신이 시도 할 수

  success: function (response) 
      { 
       var currentPosition = api.getContentPositionY(); 
       api.scrollToBottom(); 
       var maxPosition = api.getContentPositionY(); 
       api.scrollToY(currentPosition); 
       var atBottom = (currentPosition == maxPosition); 
       api.getContentPane().append(response); 
       api.reinitialise(); 
       if (atBottom) 
        api.scrollToBottom(); 
      } 

답변

1

하나 개의 솔루션은 scrollToBottom()을 시뮬레이션하고 시뮬레이션을 이전 값으로 결과 getContentPositionY()를 비교하는 것입니다. 변경되지 않았다면 사용자는 이미 하단에 있으므로 응답 내용을 추가 한 후 scrollToBottom()을 "진짜"로 호출하십시오.

시뮬레이션을 실행하려면 원본 개체를 복제 한 다음 메모리에서 수정 해보십시오. 자세한 내용은 http://api.jquery.com/clone/을 참조하십시오. 예를 들면 :는

var simulatedPane = $('#chatPane').clone(); 
simulatedPane.jScrollPane(); 
var simulatedApi = simulatedPane.data('jsp'); 

그리고, 성공() 함수에서 시뮬레이션 simulatedApi를 사용한다.

+0

흥미로운 아이디어입니다. 어떻게 scrollToBottom(), 어떤 아이디어를 시뮬레이션 할 것이라고? – Chev

+0

두 가지 방법을 생각해 볼 수 있습니다. 첫 번째는 페이지의 실제 개체와 동일한 속성을 가진 메모리 내 Javascript 복사본을 만들고이 개체에서 명령을 실행하는 것입니다. 두 번째 방법은 현재 스크롤 위치를 저장하고 라이브 개체에 대해 명령을 실행 한 다음 이전 스크롤 위치를 복원하는 것입니다. 이로 인해 UI가 점프 할 수 있으므로 사용 가능한지 테스트하기 위해 UI를 테스트해야합니다. – ChessWhiz

+0

두 번째로 할 수있는 일이지만, UI 점프가 발생할 가능성이 높습니다. 인 메모리 개체를 생성하기위한 코드 샘플로 답변을 업데이트 할 수 있습니까? – Chev

1

이미 해결책이있는 것을 확인했습니다. 또 다른 방법은 jsp-scroll-y 이벤트에 대한 리스너를 추가 할 수 있습니다 :

http://jscrollpane.kelvinluck.com/events.html

이 청취자는 isAtTop 및 isAtBottom에 대한 부울 값을 전달됩니다. 이것을 변수에 저장하고 스크롤 판을 다시 초기화하기 전에 변수의 상태를 점검 할 수 있습니다. 당신은 내가 도착하면 github issues list에 나는 그것을 추가 할 것이라는 점을 추가하는 경우 - isAtTop, isAtBottom, isAtLeftisAtRight : 당신이 API에 몇 가지 추가 메소드를 추가하는 기능 요청을 추가 할 수 있다면

장기적으로는, 그것은 좋은 것입니다 기회.

+0

이것은 훨씬 더 의미가 있으며 "해킹"이 아닙니다. 이 이벤트에 리스너를 추가하겠습니다. 또한 이러한 속성을 플러그인에 추가하면 좋을지 묻는 것처럼 github에 문제를 추가 할 것입니다. – Chev

+0

나는 이걸 총에 댔다. 이것은 완벽하게 들리지만 그렇지 않습니다. 그것은 매우 버그입니다. 이벤트가 발생하는 컨테이너를 추가 할 때마다. 모든 종류의 것들을 시도했지만 isAtBottom 속성은 매우 신뢰할만한 것으로 보이지 않습니다. 내가 해킹을 계속해야 할 것 같아. 어쨌든 코드가 훨씬 적습니다. 그래도 고마워! – Chev

+0

죄송합니다 - 매개 변수가 문서의 잘못된 주문 인 것처럼 보입니다! isAtBottom은 네 번째 매개 변수입니다. 이 작업 예제를 보아라. 아래쪽으로 스크롤하면 바닥에 붙어있다. http://www.jsfiddle.net/vitch/NDFy6/ – vitch