javascript - 删除插入符号位置前的最后 x 个字符

标签 javascript jquery contenteditable

简短版:

我有一个 contenteditable div。我想删除插入位置之前的最后 x 个字符。

长版:

如果有人在 contenteditable div 中键入 [,应该会出现一个自动建议列表,由 ajax 调用填充。这已经可以工作了。我还可以在插入位置插入选定的建议并添加 ]。但是用户已经输入的字符应该在附加建议之前删除。 括号 [ 不仅是“触发字符”,还是类似 markdown 的格式元素。

示例:

div 中的文本(“|”代表carret):Lorem ipsum|坐 lorem ipsum dolor

用户现在键入 [do 以启动自动建议:Lorem ipsum [do|坐 lorem ipsum dolor

dolor 建议插入到 carret 之后:Lorem ipsum [do|dolor sit lorem ipsum dolor]

问题:在插入建议之前应该删除所有已经输入的字符 do

期望的行为:Lorem ipsum [dolor] sit lorem ipsum dolor

尝试的解决方案:

Insert text at cursor in a content editable div - 工作,但我无法删除最后一个字符 https://developer.mozilla.org/en-US/docs/Web/API/Selection - 试图从 MDN 获得一些想法,但不知道如何更改选择的文本节点的内容

代码:

提取最后一个“[”和carret之间的字符串以在数据库中搜索建议:

var sel = window.getSelection();
var cords = getCaretCoords();
var searchQuery = extractSearchQuery(sel.anchorNode.data, sel.anchorOffset, "[");

function extractSearchQuery(searchString, caretPos, triggerString) {
    //cut everything after carret
    searchString = searchString.slice(searchString.lastIndexOf(triggerString) + 1, caretPos);
    return searchString;
}

在carret之后插入建议:

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

最佳答案

具有以下假设和定义:

  • 您知道“[”的位置,因为这最终会触发自动建议开始工作。我们称它为 indexbracket
  • 您知道括号后键入的是什么文本,因为您将其用于自动建议。我们称它为 lookupstring

然后您应该将您的 div 的内容替换为:

divtext = divtext.substring(0, indexbracket) + divtext.substring(indexbracket + lookupstring.length + 1);

示例:(我在其中使用了与您可能使用的不同的方法来查找 indexbracket 等)

var divtext = "Lorum ipsum [doAUTOSUGGESTEDTEXT sit";
var indexbracket = divtext.indexOf('[');
var lookupstring = "do";
divtext = divtext.substring(0, indexbracket) + divtext.substring(indexbracket+lookupstring.length+1);
console.log(divtext);

编辑帖子后更新 鉴于您需要插入符号的位置,您可以选择在替换文本后“手动”重置插入符号的位置,请在此处查看这个出色的答案:https://stackoverflow.com/a/512542/3000771

关于javascript - 删除插入符号位置前的最后 x 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47887027/

相关文章:

javascript - $http.post 到 php 文件,500 内部服务器错误

javascript - 搜索与本地存储项相关的数据

javascript - 如何在 Dygraps x 轴上跳过周末。

javascript - 如何防止指针在 HTML 中通过?

c# - 帮助 jQuery 投票系统。无法更新 html 投票计数

javascript - 如何使用 javascript/jquery 将数字格式化为印度货币(在数据表中)

javascript - 如何使用 Protractor 测试 contenteditable 字段?

javascript - 如何在 javaScript 中使用特定键对对象进行分组

javascript - 尝试以编程方式粘贴

javascript - 长内容可编辑的 div 被鼠标水平滚动屏蔽为输入