0

我在 contenteditable div 中有一个跨度,我需要确定光标是否位于跨度标记的最后一个位置。我查看了选择和范围解决方案,但无法找到实现该目标的直接方法。

<html>
    <script>
        var selection =  window.getSelection();
        var range = selection.getRangeAt(0);
        //this is what I am trying to achive
        var selection_target = range.selectNodeContents(document.getElementById('target')); 
        var length = selection_target.toString().length;

     </script>
     <body>  
          <div id='target' contenteditable='true'>
             <span>some text(figure cursor position here)</span>
          </div>
      </body>
</html>
4

1 回答 1

0

对于跨度只有一个子节点是文本节点的问题的情况,您可以检查插入符号是否在其末尾,如下所示:

演示:http: //jsfiddle.net/Wm5Hz/

代码:

var span = document.getElementById("target").getElementsByTagName("span")[0];
var spanTextNode = span.lastChild;
var sel = window.getSelection();
var isCaretAtEndOfSpan = (sel.isCollapsed
    && sel.focusNode == spanTextNode
    && sel.focusOffset == spanTextNode.data.length);

在一般情况下事情稍微复杂一些:相同的视觉位置可以用不同的方式表示(例如,在文本节点中的最后一个字符之后,在文本节点本身之后,在跨度结束之后),加上如果跨度可以包含元素,那么您需要找到跨度内的最后一个文本节点并将选择与其进行比较。此外,这些都不适用于 IE < 9,它具有完全不同的 API。

于 2012-09-25T09:10:32.197 回答