当用户输入contenteditable div时替换最后一个字符

时间:2013-11-15 07:18:28

标签: javascript range contenteditable

我在SE的某个地方发现了一个代码,用于插入Tim Down的文本。代码如下所示,并且工作正常。但我想添加一个基于我的要求的条件,并希望以某种方式修改代码,但在经过这么多试验后却没能做到。

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后跟a),后退返回1。如何修改代码才能达到这个条件?花了好几天才弄清楚这一点但无济于事。

感谢。

1 个答案:

答案 0 :(得分:4)

代替以下内容:

//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中对此进行了测试。