考虑以下内容可编辑的 div。
<div contenteditable="true">
<div>bold text</div><div>bold text</div>
</div>
如果我将光标定位在两个 div 之间并开始输入,文本会以粗体显示,而不是在两个 div 之间插入新的文本节点。如果您回到家并尝试在第一个 div 前面键入一些内容,也会发生同样的情况。它成为第一个 div 的一部分。
如果我检查从选择返回的范围的 startContainer,我会得到其中一个 div 的内容,而不是我期望的空文本节点。
$( '#EDITABLE' ).focus();
var selection = window.getSelection();
var range = document.createRange();
var div = $('#div2').get(0);
range.setStartBefore(div);
range.collapse(true);
selection.removeAllRanges();
selection.addRange(range);
// cursor should now be between div1 and div2
range = window.getSelection().getRangeAt(0);
console.log("range object returned is: ", range);
// type something into the content editable div. why is it coming
// up bold since the cursor should be between the divs? it's
// positioning the cursor at the end of the previous div. I want to
// target the spot between the divs. how?
div.content {
display: inline-block;
font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div contenteditable="true" id="EDITABLE">
<div class="content" id="div1">Content for div1</div>
<div class="content" id="div2">content for div 2</div>
</div>
原jsfiddle:http: //jsfiddle.net/9ZZpX/3/
问题是为什么会发生这种情况?如何选择 div 之间的位置,以便当我输入内容时它不会加粗?(显然我可以添加一个空格来解决这个问题,但这很丑陋。)
如果您在状态更新框中输入@mention 并按 HOME,您可以在 Facebook 上看到此功能正常工作。如果您键入文本将不会突出显示。
我唯一能想到的就是拦截按键并以编程方式插入文本节点,但这看起来很难看。
我疯狂地搜索,找不到任何说明这应该如何工作的参考资料。显然有些东西我不明白,而且这方面的文档确实很缺乏。
(我也想做的是检测光标何时要进入这些 div 之一并跳过它。如果两个 div 彼此相邻,则光标会跳入其中一个 div 并且它搞砸了作品。)
有关我正在尝试做的事情的更多信息:http: //a-software-guy.com/2012/12/the-horrors-of-cursor-positioning-in-contenteditable-divs/