<div contenteditable="true">
<div>bold text</div><div>bold text</div>
</div>
如果我把光标放在两个div之间并开始输入文本,则文本将变粗,而不是在两个div之间插入新的文本节点。如果你按下home键并在第一个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之间的位置,以便在输入时不会出现加粗的问题?(显然我可以添加一个空格来解决问题,但那很丑陋。)
如果您在Facebook的状态更新框中输入@提及并按HOME,则可以看到此功能正常工作。如果您键入文本,则不会突出显示。
我所能想到的唯一方法是拦截keypress并通过编程方式插入文本节点,但这似乎很丑陋。
我搜索了很多,但找不到任何文件记录这个应该如何真正工作。显然,有些事情我不理解,而且文档在这个领域确实缺乏。
(我也想能够检测光标即将进入其中一个这些div并跳过它。如果两个div紧挨着,光标会跳入其中一个div,并且会弄乱工作。)
更多关于我正在尝试做的内容的信息:http://a-software-guy.com/2012/12/the-horrors-of-cursor-positioning-in-contenteditable-divs/