2017-08-17 86 views
1

私は2つの非常に基本的なことを行う方法を探しています。テキスト内のキャレットの位置を取得したいだけです。次に、テキスト内の特定の位置にキャレットを配置します。目的は、プログラムでテキストを変更できるようにすることです。CKEditor 4:カーソル/キャレットの位置を取得および設定する方法は?

私は、さまざまな似たようなことをしようとしていたが、私が望んでいないものをたくさん見つけました。実際、ほとんどのソリューションは、範囲とDOM要素を見つけるHTMLを探しています。たぶんそれが行く方法ですが、私は実際の解決策を見つけていません。

カーソル位置の確認。私は、さまざまなソース(例えばthis one)から、次の解決策が見つかりました:

var selection = e.editor.getSelection(); 
var range = selection.getRanges()[0]; 
var cursor_position = range.startOffset; 

をしかし、これは私の問題に応答しません。以下のテキストでは:

アップル

射手

アクセント

カーソルが直接、各単語のAの後に連続して置かれている場合、それは1が毎回返されます。私が望むのは、1番目のAの後に1を、2番目のAの後に6を、3番目の後に13を配置することです。

つまり、テキスト内のどの文字位置がカーソルであるのかが重要です。たとえば、テキストのX番目の文字の後にテキストを挿入することができます。

あなたはCKEditorバージョンでブックマークのようなものを実装してみたいが、より耐久性のあるかもしれません、あなたの最後のコメントを見てみると

+0

カーソル位置を取得するには、選択範囲と範囲で再生する必要があります。ただし、** CKEditorはHTMLを背景**で使用し、プレーンテキストではないため、1,6,13の結果が得られないことに注意してください。あなたの仕事が、HTMLを無視して痛みのテキストにカーソル位置を戻すことであるならば、多くの苦境に陥ることがあるので、多くの不満と苦痛のために準備をしてください。 –

+0

こんにちは@ j.swiderski、あなたの答えに感謝します。実際には、私は予想される結果に達するほど長い範囲と選択肢で遊んでも構いません。しかし、これまでのところ、私はどのように見えません。私はその結果を文字数で説明しましたが、 "Row1/Range3/Offset4"と記述された位置を持つのと同じです。単語の中の手紙 ")。与えられたコード例のような範囲だけでは十分ではないようです。 – Xosted

+0

https://dom.spec.whatwg.org/#interface-rangeと古いものはhttps://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Levelをご覧ください。それはIMHOの良い例とより良い定義を持っているので、-2 - 範囲 - 導入。一般に、各範囲は、開始ノード(startContainer)と、その開始ノード内のオフセットとを有する。 **オフセットはstartContainer **に関連しており、ドキュメント全体の位置は示されません。 AppleまたはArchersのいずれかで折りたたみ選択があった場合など。 '

A^pple

A^rchers

' 'オフセットは段落(範囲startContainer)に関連しています。体。 –

答えて

0

を支援していただきありがとうございます。私が説明したように、元のブックマークは、サーバーにデータを投稿するか、単にソースモードに戻って戻ったときに削除されます。さらに、私が使用を提案する空スパンは、ビジュアル表現を持たず、ゴミとみなされるためエディタによって削除されます。あなたはあなたがそれを必要なときに、エディタのHTMLに<span class="my-break-point"/>を挿入し、を追跡なるカスタムコードを考え出す必要があるだろう

var editor = CKEDITOR.replace('editor1', { 
    language: 'en', 
    protectedSource : /<span.*class="my-break-point".*\/>/g 
}); 

次へ:

何ができることは、カスタムブックマークにまたがる保護するためにprotectedSourceを使用しています次回の挿入時に前のブックマークを削除するようにします。

もちろん、これは単なる基本的な例です。選択が折りたたまれていない場合、折りたたまれた選択のブックマークまたは選択の開始/終了のための2つのブックマークを持つことができます。

最初に挿入するブックマークを試してみて、崩壊し、非崩壊の選択のためのHTMLに挿入されているかを確認してください: - https://docs.ckeditor.com/ckeditor4/docs/#!/api/CKEDITOR.dom.range-method-createBookmark - https://docs.ckeditor.com/ckeditor4/docs/#!/api/CKEDITOR.dom.range-method-createBookmark2

サンプルコード:

var range = editor.getSelection().getRanges()[0]; 
var bm = range.createBookmark(); 

何かが不明である場合は、してくださいお知らせ下さい。

+0

ありがとうございました。私は何が起こっていたかを見るためにブックマークを使い始めました。最初は完全に見えましたが、確かに耐久性はありません。ブックマークオブジェクトをシリアライズしてdbに保存することはできますが、文書をリロードすると(たとえ保存されていても)このブックマークに戻ることはできません。 自分のブックマークを作成することは次のステップです。私はあなたが提案したものを試してみる。しかし、ドキュメント(またはノードツリー)内のキャレットの「アドレス」を取得することがなぜ難しいのか、まだ理解していないような気がします。 – Xosted

+0

ブックマークを適切な場所に置くには、ドキュメント内のキャレットの位置(その「アドレス」)を、今までの形や形にする必要があります。私はなぜこの「アドレス」情報をdbに保存して後でこの点に戻ることができないのか理解できません。 – Xosted

関連する問題