在内容可编辑的 div 中的光标处插入文本

新手上路,请多包涵

我有一个 contenteditable div,我需要在插入符号位置插入文本,

这可以在 IE 中通过 document.selection.createRange().text = "banana" 轻松完成

在 Firefox/Chrome 中是否有类似的实现方式?

(我知道 这里 有一个解决方案,但它不能用于 contenteditable div,而且看起来很笨拙)

谢谢!

原文由 user314362 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 822
2 个回答

以下函数将在插入符号位置插入文本并删除现有选择。它适用于所有主流桌面浏览器:

 function insertTextAtCaret(text) {
    var sel, range;
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            range.deleteContents();
            range.insertNode( document.createTextNode(text) );
        }
    } else if (document.selection && document.selection.createRange) {
        document.selection.createRange().text = text;
    }
}

更新

根据评论,这里有一些用于保存和恢复选择的代码。在显示上下文菜单之前,您应该将 saveSelection 的返回值存储在一个变量中,然后将该变量传递给 restoreSelection 以在隐藏上下文菜单之后和插入文本之前恢复选择。

 function saveSelection() {
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            return sel.getRangeAt(0);
        }
    } else if (document.selection && document.selection.createRange) {
        return document.selection.createRange();
    }
    return null;
}

function restoreSelection(range) {
    if (range) {
        if (window.getSelection) {
            sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (document.selection && range.select) {
            range.select();
        }
    }
}

原文由 Tim Down 发布,翻译遵循 CC BY-SA 4.0 许可协议

  1. 使用 window.getSelection() 获取选择对象。
  2. 使用 Selection.getRangeAt(0).insertNode() 添加文本节点。
  3. 如有必要,使用 Selection.modify() 将光标位置移到添加的文本后面。 (未标准化,但 Firefox、Chrome 和 Safari 支持此功能)
    function insertTextAtCursor(text)
   {
       let selection = window.getSelection();
       let range = selection.getRangeAt(0);
       range.deleteContents();
       let node = document.createTextNode(text);
       range.insertNode(node);

       for(let position = 0; position != text.length; position++)
       {
           selection.modify("move", "right", "character");
       };
   }

原文由 Martin Wantke 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题