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

标签 javascript contenteditable

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

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

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

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

谢谢!

最佳答案

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

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();
        }
    }
}

关于javascript - 在内容可编辑的 div 中的光标处插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920150/

相关文章:

javascript - React setState 没有在第一次触发

javascript - Contenteditable - 在 Chrome 中编辑 <code> 元素不一致

ios - 如何让编辑菜单出现在具有 contentEditable 的 UIWebView 中?

html - 如何在contenteditable区域编辑文本前后添加空格

javascript - 如何通过构造函数异步调用注入(inject)服务,Angular 2

javascript - 使用 jQuery 设置值时 ng-model 不起作用

javascript - 将 contenteditable 和覆盖换行符设置为 <br/> 而不是 <div> 在元素末尾不起作用

javascript - 允许 SVG 文本在 Angular 中可编辑吗?

javascript - jQuery Datatables sDom 将 columnFilterWidget 推到左侧 (Firefox)

javascript - 如何在 React 中修改具有子级多个级别的父 DOM 上的状态