点击带有图标的按钮后,我试图在我的contenteditable div中创建一个图标。问题是,在选择图标/按钮时,我在文本中丢失了插入符号。关闭按钮后,我希望这个插入符号在旧位置。
我做了一个JS-Fiddle来说明这个问题:JSFiddle
PS:问题特别是关于插入符号。如果插入图标,对我来说并不重要。那部分应该很容易理解:)。HTML
B
CSS
<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>✔</span></button>
<button><span>✯</span></button>
<button><span>✘</span></button>
</div>
</div>
<button class="add-icon">Add Icon</button>
</div>
的jquery / JavaScript的
#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;
}
答案 0 :(得分:2)
在click事件方法中使用jquery focus方法。
您可能希望将新邮件内容div设置为文本区域。这样的事情应该有效。
$(".add-icon").click(function(){
$("#emotepicker").toggle();
$("#new-mail-content").focus();
});
以下是文档的链接:https://api.jquery.com/focus/
答案 1 :(得分: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;