【问题标题】:Replace last character while user typing in contenteditable div用户输入 contenteditable div 时替换最后一个字符
【发布时间】:2013-11-28 12:30:15
【问题描述】:

我在 SE 中的某处发现了 Tim Down 在 contenteditable 中插入文本的代码。代码如下所示,并且运行良好。但是我想添加一个基于我的要求的条件,并且想以某种方式修改代码,但经过这么多试验后未能做到。

function insertTextAtCursor(value, stepback) {
    var sel, range, textNode;
    if (window.getSelection) {
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);         
            textNode = document.createTextNode(value);


           //Check value of stepback: 0 or 1
            if(!stepback)//if 0
                 range.insertNode(textNode);
            if(stepback){ //if 1
               // replace the previously inserted character with the new one here

            }

            // Move caret to the end of the newly inserted text node   
            range.setStart(textNode, textNode.length);
            range.setEnd(textNode, textNode.length);

            sel.removeAllRanges();
            sel.addRange(range);          

        }
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        range.pasteHTML(text);
    }
}

这里我正在检查 stepback 参数的值,它是 0 还是 1。如果为 0,则将插入按下的字符,但如果为 1,我想用新字符替换最后一个字符。在我的例子中,当一个键被按下后紧跟一个元音(例如,按下 m 后跟一个)时,后退返回 1。如何修改代码以实现此条件?花了几天时间弄清楚这一点,但无济于事。

谢谢。

【问题讨论】:

  • 您能创建一个fiddle 吗?很难从代码及其描述中弄清楚您想要什么。
  • @Chandranshu 我还有其他三个或更多与此功能相关的功能。我的要求与lexilogos.com/keyboard/amharic.htm 中给出的完全一样。我有一组在数组中给出的映射,并且基于后退,将返回不同的值。我希望我可以创建一个小提琴程序,但是放在那里太多了。当您键入任何辅音后跟元音(a、e、i、u、o)时,您可以按下并查看埃塞俄比亚字符是如何被替换的。
  • 你有SE上原始代码的链接吗?我了解 lexlogos.com 网站上的功能,但我仍然不明白您在阻止什么。具体来说,为什么他们的代码对你来说不够好?
  • @Chandranshu。如何替换从 jsfiddle.net/MH5xX 中给出的字符返回的字符?我认为这可能会解决我的问题。它返回插入符号位置之前的字符,我想用按键上的另一个字符替换它

标签: javascript range contenteditable


【解决方案1】:

代替以下内容:

//Check value of stepback: 0 or 1
if(!stepback)//if 0
     range.insertNode(textNode);
if(stepback){ //if 1
   // replace the previously inserted character with the new one here

}

使用以下代码:

// This clones the selected range and then selects 1
// 1 character in the backward direction and deletes it.
if(stepback){
    clone = range.cloneRange();
    clone.setStart(range.startContainer, range.startOffset - 1);
    clone.setEnd(range.startContainer, range.startOffset);
    clone.deleteContents();
}
range.insertNode(textNode);

这确保新翻译的字符总是添加到末尾,同时可选地删除 1 个字符,以防需要后退。

更新:我仅在 Chromium 中对此进行了测试。

【讨论】:

  • 它就像一个魅力。非常感谢钱德兰舒。你知道我几乎花了几天的时间来弄清楚这一点。 SE万岁。
  • @semytech - 很高兴这对你有用。您应该接受答案,以便未来的用户可以按原样使用它,而无需发布自己的问题。如果你认为它值得,你可以投票。即使问题变得清晰,也很难破解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多