2017-04-18 5 views
1

アイコン付きのボタンをクリックした後、私のcontenteditable divにアイコンを作成しようとしています。問題は、アイコン/ボタンを選択している間は、テキストのキャレットを失うことです。ボタンを閉じた後、このキャレットを元の場所に戻したいと思います。ボタンをクリックしながらcontenteditable div内の同じ場所にキャレットを保持する方法は?

私はこの問題を説明するためにJS-フィドルを作った:JSFiddle

PS:質問は特にキャレットについてです。アイコンが挿入されているかどうかは私にとっては大したことではありません。その部分は簡単に把握できるはずです:)。

HTML

<div id="write-mail"> 
    <div style="position: relative;"> 
     <div id="new-mail-content" contenteditable="true"> 
      <div>How to return the caret where it was in the sentence after clicking the buttons?</div> 
      <div>Maybe prevent the caret from being removed after clicking the buttons?</div> 
      <div>I know I can store the current selection by using window.getSelection(). If I would be able to reactivate this selection, that would be great!</div> 
     </div> 
     <div id="emotepicker"> 
     <button><span>&#10004;</span></button> 
     <button><span>&#10031;</span></button> 
     <button><span>&#10008;</span></button> 
     </div> 
    </div> 
     <button class="add-icon">Add Icon</button> 
</div> 

CSS

#new-mail-content{ 
    background-color: white; 
    min-height: 5em; 
} 
#write-mail button{ 
    height: 30px; 
} 
#emotepicker{ 
    display: none; 
    position: absolute; 
    left: 0px; 
    right: 0px; 
    bottom: 0px; 
    background-color: rgba(0,0,0,0.1); 
    text-align: center; 
} 
div{ 
    padding: 2px; 
} 

jqueryの/ javascriptの

$(".add-icon").click(function(){ 
    $("#emotepicker").toggle(); 
}); 
+0

@FelixHäberle私のCSSへのご変更がになっている方法助けて? – RMo

+0

http://stackoverflow.com/questions/3972014/get-caret-position-in-contenteditable-divを参照してください。エモーティコンパネルを閉じるときに編集と復元を開始するときに、キャレットの位置を保存します。 – ProgrammerV5

+0

投稿した例はあなたを助けましたか? – ProgrammerV5

答えて

2

使用jqueryのフォーカスメタあなたのクリックイベントメソッドでod。

新しいメールコンテンツのdivをテキスト領域にしたい場合があります。このようなものはうまくいくはずです。ここで

$(".add-icon").click(function(){ 
    $("#emotepicker").toggle(); 
    $("#new-mail-content").focus(); 
}); 

は、ドキュメントへのリンクです:https://api.jquery.com/focus/

+0

これは本当に質問に答えるものではありません。質問に記載されているとおり、私はcontenteditable divで作業しています。私はこれを回避することはできません。テキスト領域では、古い場所にキャレットを戻すのに問題はありません。また、.focus()はキャレットの古い位置を保持しません。 – RMo

+0

ちょうど別のdivがそれの前に開かれた後、エディタがもう存在しないので、コントロールに焦点を当てることは、そのトリックをしません。そのdivが閉じられた後、カーソルの位置を保存して復元する必要があります。 – ProgrammerV5

+0

うん、私はこの回答を却下するには速すぎるかもしれません。なんらかの理由で実際には以前の場所にキャレットを返します:https://jsfiddle.net/bdy2Ltwo/6/。これはjQueryの組み込み機能ですか?公式のjQueryドキュメントでは、キャレットについて何も見つかりません。これはすべてのブラウザで信頼できますか(ChromeとMS-Edgeではうまくいくようです)。 – RMo

0

これはあなたが必要なものを行う必要があります。

var caretpos =0 ; 
$(".add-icon").click(function(){ 
    $("#emotepicker").toggle(); 
}); 

$('#close').click(function(e){ 
    $("#emotepicker").toggle(); 
    $("#new-mail-content").focus(); 
    var node = document.querySelector("new-mail-content"); 
    node.focus(); 
    var textNode = node.firstChild; 
    var caret = caretpos; 
    var range = document.createRange(); 
    range.setStart(textNode, caret); 
    range.setEnd(textNode, caret); 
    var sel = window.getSelection(); 
    sel.removeAllRanges(); 
    sel.addRange(range); 
}) 

function getCaretCharacterOffsetWithin(element) { 
    var caretOffset = 0; 
    var doc = element.ownerDocument || element.document; 
    var win = doc.defaultView || doc.parentWindow; 
    var sel; 
    if (typeof win.getSelection != "undefined") { 
     sel = win.getSelection(); 
     if (sel.rangeCount > 0) { 
      var range = win.getSelection().getRangeAt(0); 
      var preCaretRange = range.cloneRange(); 
      preCaretRange.selectNodeContents(element); 
      preCaretRange.setEnd(range.endContainer, range.endOffset); 
      caretOffset = preCaretRange.toString().length; 
     } 
    } else if ((sel = doc.selection) && sel.type != "Control") { 
     var textRange = sel.createRange(); 
     var preCaretTextRange = doc.body.createTextRange(); 
     preCaretTextRange.moveToElementText(element); 
     preCaretTextRange.setEndPoint("EndToEnd", textRange); 
     caretOffset = preCaretTextRange.text.length; 
    } 
    return caretOffset; 
} 

function showCaretPos() { 
    var el = document.getElementById("new-mail-content"); 
    var caretPosEl = document.getElementById("caretposition"); 
    caretpos = getCaretCharacterOffsetWithin(el); 
    caretPosEl.innerHTML = "Caret position: " + carePosEl; 
} 

document.body.onkeyup = showCaretPos; 
document.body.onmouseup = showCaretPos; 

https://jsfiddle.net/bdy2Ltwo/4/

+0

getCaretCharacterOffsetWithin(要素)は魅力的に機能するようです。あなたは "showCaretPos()"で小さなタイプミスをしました。 carePosElはcaretposElであると考えられていました。 "$( '#close')。click(function(e)" document.querySelector( "new-mail-content")が正しいかどうかはわかりませんが、実際にコードの一部を削除してしまいました。あなたの答えは正しい方向に向いており、ブラウザ間の互換性が向上する可能性があります。 – RMo

+0

助けてくれた回答をアップアップしてください。 ;) –

+0

あなたは絶対に正しいですが、私は試しましたが、できません、それは私が投票するために編集する必要があると言います。私はそれを修正しようとしましたが(私はそれに何の意味も付加することはできません)、しかし、仲間のレビューを取る必要があります。あなたが何かをあなたの投稿に追加するなら、できるだけ早く投票します。 – ProgrammerV5

関連する問題