2

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

ここでは、0 または 1 のstepbackパラメータの値をチェックしています。0 の場合は押された文字が挿入されますが、1 の場合は最後の文字を新しい文字に置き換えたいと考えています。私の場合、キーが押された直後に母音が続くと (たとえば、m を押してから a を押すと)、ステップバックは 1 を返します。この条件を達成するためにコードを変更するにはどうすればよいですか? これを理解するために何日も費やしましたが、役に立ちませんでした。

ありがとう。

4

1 に答える 1

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 でのみテストしました。

于 2013-11-15T09:03:57.233 に答える