将插入符号位置设置为contentEditable元素内的空节点

Mik*_*ike 17 javascript text cross-browser contenteditable

我的任务是将文本插入符设置为显示在contentEditablediv中的空span节点内.

以下为我在Firefox 3.6上没有任何问题:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script type="text/javascript" src="js/jquery-1.4.3.min.js">
        </script>
        <style>
            #multiple {
                border: 1px solid #ccc;
                width: 800px;
                min-height: 20px;
                padding: 5px;
                outline: none;
            }
        </style>
        <script>
            $(document).ready(function(){

    var contentEditable = document.getElementById('multiple');
    var lastItem = contentEditable.getElementsByTagName('span').item(2);

                var selectElementText = function(el, win){
                    win = win || window;
                    var doc = win.document, sel, range;
                    if (win.getSelection && doc.createRange) {                    
                        range = doc.createRange();
                        range.selectNodeContents(el);
                        range.collapse(false);
                        sel = win.getSelection();
                        sel.removeAllRanges();
                        sel.addRange(range);
                    }
                    else 
                        if (doc.body.createTextRange) {
                            range = doc.body.createTextRange();
                            range.moveToElementText(el);
                            range.select();
                        }
                }

                contentEditable.focus();
                selectElementText(lastItem);
            });
        </script>
        <title>Range Selection Tasks (Make Me Want to Cry)</title>
    </head>
    <body>
        <div id="multiple" contentEditable="true">
            <span style="color:red">First</span><span style="color:green">Second</span><span style="color:blue"></span>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

...但是在Webkit和IE上,重点是倒数第二个跨度.不知道为什么.如果我在最后一个跨度内放置一个空格,那么它可以工作,但我得到一个单字符范围选择.

话虽如此,如果插入符号一开始就在最后一个节点中有空格是可以接受的.

任何有关这方面的帮助将不胜感激.先感谢您.

sha*_*evi 11

将元素设置innerHTML为零宽度字符:

('element').innerHTML = '&#200B';
Run Code Online (Sandbox Code Playgroud)

现在,carret可以去那里.

  • 这个答案混合了html和unicode标识符.使用"&#8203;" 或"\ u200B"表示零长度不间断空格. (4认同)
  • 这很有效; 我在我的标记中使用了`&#8203;`(`&#200B;`没有正确渲染). (2认同)

bob*_*nce 5

IE的选择/范围模型基于文本内容的索引,忽略元素边界.我相信可能无法将输入焦点设置在没有文本的内联元素中.当然,在您的示例中,我无法通过单击或箭头键在最后一个元素内设置焦点.

它几乎可以工作,如果你设置每个跨度display: block,虽然仍然有一些非常奇怪的行为,取决于父级中是否存在空格.黑客将显示内容与浮点,内联块和绝对位置等技巧内联,使IE将每个元素视为一个单独的编辑框.相对定位的块元素彼此相邻,但这可能是不切实际的.

如果它让你感觉更好,IE9终于修复了这种不愉快并采用标准范围模型.(万岁!)

如果插入符号一开始就在最后一个节点中有空格是可以接受的.

那么,我可能会这样做,除非IE选择专家能想到更好的东西.(打电话给蒂姆!)

  • 你好!我很确定将插入符号放在IE中的空内联元素中是不可能的.更一般地说,在IE中,不可能将插入符号放在元素中第一个文本节点的开头.在WebKit中也是如此:https://bugs.webkit.org/show_bug.cgi?id = 15256#c4.我想,添加空白就像它一样好.我已经在文本节点的开头处插入了一个Unicode BOM字符("U + FEFF",在所有主流浏览器中呈现为零宽度),这可以工作,但是当插入符号移动到别处时,会留下删除BOM的后勤噩梦. (5认同)