2013-03-31 4 views
6

글쎄, 내 현재의 접근 방식으로이 작업을 수행 할 수 있는지 확실하지 않습니다. 현재 뷰포트의 크기 인 페이지에 HTML 문서의 내용을 맞추려고합니다. 저는 현재 문서의 모든 요소를 ​​반복하고 맨 위 오프셋이 현재 페이지의 경계 내에 있는지 확인합니다. 그렇지 않으면이 오프셋은 새 페이지의 시작이되고 페이지 경계는이 오프셋으로 설정됩니다. 뷰포트의 높이를 더한 값.HTML을 페이지로 나눠서 긴 단락으로 나눕니다.

내가 직면 한 문제는 높이가 뷰포트 자체보다 큰 요소 (예 : 단락)가있을 수 있기 때문에 알고리즘이이 요소를 새 페이지의 시작 부분에 배치하더라도, 그 내용이 오버플로됩니다. 첫 번째 슬라이스가 페이지의 나머지 부분을 차지하는 방식으로 이러한 요소를 분할하는 방법을 찾으려고합니다.

이것은 더 어려움을 나타냅니다. 페이지의 나머지 부분에서 단락의 텍스트가 얼마나 잘 맞는지 결정할 수있는 방법을 찾을 수는 있지만 그 자체로는 상당히 어려움이 입증되었지만 DOM의 문제는 여전히 분할되지 않은 상태에서 업데이트되지 않습니다. 다음 페이지의 계산을 엉망으로 만들거나 최소한 알고리즘을 복잡하게 만드는 재귀를 중단하도록 강요합니다.

첫 번째 조각이 페이지의 나머지 공간을 차지하는 방식으로 단락을 분할하는 방법에 대한 제안을 환영합니다. 이것은 지금까지 내 코드입니다 :

편집 :그것은이 단지 거기가 더 절대 위치하거나 요소를 떴다되는 아주 간단한 HTML에서 작동 것이 주목할 가치가있다. 제 경우에는 문제가되지 않습니다.

var elementIndex = -1; 
var pages = 1; 
var pageBoundary = 0; 
var pageBreaks = []; 

function calculatePages() { 
    //first page boundary is window height 
    pageBoundary = $(window).height(); 
    //do calculations 
    iterateElements($("body")); 
    //print results 
    console.log(pageBreaks); 
} 

function iterateElements(parent) { 

    $.each($(parent).children(), function(i, e) { 
     //increase current element index 
     elementIndex = elementIndex + 1; 
     //get element's top offset 
     var offsetTop = $(e).offset().top; 
     //get the last position that the element occupies 
     var elementSpan = offsetTop + $(e).outerHeight(); 

     if ($(e).children().length == 0) { //only leaf nodes will be set as page breaks 
      //element's start position is outside page boundary 
      if (offsetTop >= pageBoundary) { 
       //mark page start with red in order to visualize 
       $(e).attr("style", "border-top: 1px solid red"); 

       //increase page count 
       pages = pages + 1; 
       //new page starts at element's top, next page boundary 
       //is element's starting position plus the viewport's height 
       pageBoundary = offsetTop + $(window).height(); 
       //store index of page break 
       pageBreaks.push(elementIndex); 
      } 
      //element's start position is inside current page, but contents overflow 
      else if (elementSpan >= pageBoundary) { 
       //NO IDEA WHAT TO DO HERE 
       //NEED A WAY TO SPLIT LARGE ELEMENTS 
      } 
     } 

     iterateElements(e); 
    }); 
} 

$(function() { 
    calculatePages(); 
}); 
+0

하나의 순진한 접근법은 단락에서 1/2 단어의 크기를 계산하고, 큰 단락을 두 개로 분할 한 경우 다른 단어로 다시 분할하십시오. –

+0

네, 저의 초기 접근 방식이었습니다. 문제는 이것이 다음 페이지에 여러 단락 단편을 남겨서 텍스트의 정상적인 흐름을 변경시킬 수 있다는 것입니다. 또한 DOM이 함수가 반환 될 때까지 업데이트되지 않기 때문에 재귀를 깨지 않고 1/2 단어가 페이지에 들어 맞는지 확인할 방법이없는 것 같습니다. – JayPea

+0

한 단락이 전체 페이지보다 큰 경우 분명 단락이 분리됩니다. 재귀에 관해서는, 어떤 경우에는 문제에 대한 정상적인 재귀가 잘못된 대답입니다. –

답변

2

나는 이와 비슷한 것을했습니다. 내가 취한 접근법은 페이지 컨테이너의 높이를 확인하는 것입니다. 최대 값보다 큰 경우 요소를 다음 페이지로 이동해야한다는 것을 알고 있습니다.

여러 요소가있는 경우 마지막 요소를 다음 페이지로 이동할 수 있습니다.

요소가 하나만있는 경우 분할해야합니다. 이 요소를 X라고 부르겠습니다. 다음 페이지에서 새로운 단락/섹션을 만들 수 있습니다.이 요소를 Y라고 부릅니다. 요소 X의 끝에서부터 요소 Y의 시작 부분까지 단어 또는 문자를 요소의 높이까지 이동할 수 있습니다 X가 페이지에 맞습니다.

다음에 다음 페이지를 반복 할 수 있습니다.

+0

글쎄, 나는이 접근법을 접하게 될만큼 가깝다고 생각한다. 요소가 들어 맞을 때까지 단어 복사에 대한 귀하의 충고를 따랐습니다. 그러나 여기에는 몇 가지 어려움이 있습니다. 나는 나의 새로운 문제로 새로운 질문을 시작할 것 같다. – JayPea

+0

사실, 일단 제대로 해 주셔서 감사합니다. – JayPea

+0

이런 식으로 한 단어로 구성된 페이지를 만들 수 있습니다. 맞습니까? – Mark

0

색인 파일을 만들고 프레임을 만들 수 있습니다. 나는 그것이 오래된 학교라는 것을 압니다 -하지만 아마도?

<html> 
    <head> 
    <title>Example for Stackoverflow</title> 
    </head> 
    <frameset rows="28,*,0" frameborder="0" border="0" framespacing="0"> 
     <frame name="topNav" src="top_nav.html" scrolling="no" noresize> 
    <frameset cols="110,*,150" frameborder="0" border="0" framespacing="0"> 
     <frame name="menu" src="menu_1.html" marginheight="0" marginwidth="0" scrolling="auto" noresize> 
     <frame name="content" src="content.html" marginheight="0" marginwidth="0" scrolling="auto" noresize> 
     <frame name="related" src="related.html" marginheight="0" marginwidth="0" scrolling="auto" noresize> 
    </frameset> 
    <noframes> 
    <p>This section (everything between the 'noframes' tags) will only be displayed if the users' browser doesn't support frames. You can provide a link to a non-frames version of the website here. Feel free to use HTML tags within this section.</p> 
    </noframes> 

    </frameset> 
    </html> 
+0

고마워,하지만 이건 내가 원하는게 아니야. 결국, 페이지 나누기를 계산 한 후에 여러 개별 HTML 문서를 생성하는 데 사용합니다. – JayPea

관련 문제