2016-08-24 8 views
5

私は、ブラウザで動作する特殊なテキストエディタの作成に取り組んでいます。私は私を馬鹿にしている質問があります。 Google docsで行われているように、長いテキストを検出し、別々のページに分割する方法は? 私はGoogleドキュメントがのcon​​tentEditableを介して動作しませんが、いくつかの解決策が存在しなければならないことを知っている...テキストを別々のページ(Googleドキュメントなど)にcontenteditableでどのように分割するのですか?

EDIT1:我々はによってドキュメントを読み込む

  1. :は、我々はいくつかのシナリオを検討する必要がありますjsonオブジェクトを作成し、ページをレンダリングします。
  2. テキストを入力していて、ページの最後に達しました。
  3. テキストを削除します。
  4. テキストを挿入または削除します。

Google docs pagination https://googleblog.blogspot.ru/2011/04/pagination-comes-to-google-docs.html

page.html

<div class="box-base"> 
    <div id="page-1" class="page"> 
     <div id="editable-1" class="document" contenteditable="true"></div> 
    </div> 
    <div id="page-2" class="page"> 
     <div id="editable-2" class="document" contenteditable="true"></div> 
    </div> 
</div> 

Styles.cssを

.box-base { 
    margin-left: 50px; 
    flex: 1 0 430px; 
    border-style: solid; 
    display: -webkit-flex; 
    display: flex; 
    flex-wrap: wrap; 
    justify-content: center; 
    height: 900px; 
    overflow: auto; 
} 
.page { 
    width: @page-width; 
    height: @page-width * 1.414; 
    /*overflow-y: auto;*/ 
    background: white; 
    margin: 25px 0 25px 0; 
} 
.document { 
    /*max-height: 1000px;*/ 
    overflow: hidden; 
} 
+0

は多分これは助けることができる:http://stackoverflow.com/questions/143815/determine-if-an-html-elements-content-overflows – huachengzan

+0

@huachengzan感謝を!私はこれが助けることができると思うが、今私はこのようなオーバーフローをテストするために隠し要素を使用しようとするhttp://stackoverflow.com/questions/7738117/html-text-overflow-ellipsis-detection –

+0

Google docsはcontenteditableを使用しません。代わりに、すべてのキー押下をキャプチャし、DOMを手動で更新します。すべての配置は、独自のコードによって実行され、単語をHTMLとして表示するのではなく、絶対的に配置します。 – rjmunro

答えて

0

私はscrollHeightがあるまで、あなたが別の場所でテキストを分割しようとすると見ていると思います単にclientHeight以下になります。ような何か:

var divs = document.querySelectorAll('div'); 
 
var div = divs[0] 
 
// Get text from content of first div - this wouldn't be what real code used 
 
var text = div.textContent; 
 

 
// Guess the split point as a percentage of the hidden characters 
 
var splitPoint = text.length * div.clientHeight/div.scrollHeight; 
 

 
// Find first space after splitpoint 
 
splitPoint = text.indexOf(' ', splitPoint); 
 

 
// Used to make sure we don't get into an infinite loop. Not needed if this code is proven to work on all browsers. 
 
var count = 0; 
 

 
div.textContent = text.substr(0, splitPoint); 
 

 
// Add words until we are bigger 
 
while ((div.clientHeight == div.scrollHeight) && (count++ < 1000)) { 
 
    splitPoint = text.indexOf(' ', splitPoint + 1); 
 
    div.textContent = text.substr(0,splitPoint); 
 
} 
 

 
// Subtract words until we are smaller 
 
while ((div.clientHeight < div.scrollHeight) && (count++ < 1000)) { 
 
    splitPoint = text.lastIndexOf(' ', splitPoint - 1); 
 
    div.textContent = text.substr(0, splitPoint); 
 
} 
 

 
divs[1].textContent = text.substr(splitPoint); 
 

 
// Create new divs starting at splitpoint (left as an exercise)
div.box { 
 
    width: 150px; 
 
    height: 150px; 
 
    border: 1px solid black; 
 
} 
 

 
div.moretext { 
 
    background: #ccc; 
 
}
<div class="box">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent viverra malesuada nibh, sed luctus eros egestas in. Donec imperdiet, purus a consequat ultricies, mauris magna laoreet neque, quis tincidunt risus augue in lorem. Donec mauris odio, vehicula eget sollicitudin sed, aliquet et metus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec condimentum sed lacus at porttitor. Suspendisse tincidunt vehicula mauris, a ultricies mi fringilla et. Aliquam eget imperdiet magna. Quisque justo libero, commodo vitae dolor quis, volutpat consectetur tellus. Nullam consectetur commodo sem vel posuere. Praesent nec suscipit sem, quis porta diam. Duis gravida lectus fringilla, efficitur quam ut, luctus sem. Ut elit tortor, bibendum a molestie vel, tincidunt vitae lacus. In dapibus commodo mi, id blandit velit mollis placerat. Praesent quis posuere ligula. Praesent ac rhoncus est. In blandit non justo ut egestas. Praesent nec mi sagittis, eleifend nisl ac, egestas enim. Aliquam in tortor ac tellus rutrum feugiat. Etiam bibendum eget metus eget facilisis. Sed mollis eget tellus at viverra. Fusce at leo vel magna convallis dictum. Sed convallis ipsum non feugiat sagittis. Donec a lacus nisl. Donec elementum metus nec arcu interdum interdum. Praesent malesuada eu purus nec tempus. Aliquam in velit nulla. Ut vel turpis et sapien consectetur facilisis. Fusce a pulvinar lorem. Vestibulum vel neque vitae arcu placerat sodales quis ut risus. Cras aliquet, nibh quis sodales venenatis, felis est tempus enim, at condimentum felis nulla sollicitudin tortor. Morbi viverra dolor tempus, lacinia ante ac, dapibus diam. Suspendisse nec ligula viverra, pellentesque lacus nec, maximus turpis.</div> 
 
<div class="moretext"></div>

関連する問題