2

IE11でテキストを見つけるための次のコードがあります

var search_position = 0;
function findMyText(find)
{       
    // create range (selects all text)
    var range = document.body.createTextRange();
    range.moveToElementText(document.getElementById("editor"));

    if(search_position == 0)
    {
        range.moveStart("word", 0);                     
        range.findText(find);
    }

    // find the nth word that matches, where n is search_position
    for (var i = 0; i < search_position; i++)
    {
        range.moveStart("word", 1);                     
        range.findText(find);
    }

    search_position++;

    range.select();

    var l = range.text.length
    if(l < find.length)
    {
        search_position = 0;
    }
}

これにより、 の連続する各インスタンスが検索findされ、選択されます。テキストの最初のインスタンスを見つけ、検索インデックスをマークしてから次の単語に移動することで機能します。

私が本当にやりたいことは、すべてのテキストをループすることなく、特定のカーソル位置から開始することです。のように、ユーザーがカーソルをテキストの途中に置いた場合、その時点から検索したいと考えています。また、置換機能を追加したいと考えています。このように特定のキャラクターの位置に移動できます

range.moveStart("character", x);

x は文字位置です。次のコードを使用して、カーソル位置からこの文字位置を取得できます。

function getCaretPosition() {
    var ie = (typeof document.selection != "undefined" && document.selection.type != "Control") && true;
    var w3 = (typeof window.getSelection != "undefined") && true;
    var caretOffset = 0;
    if (w3) {
        var range = window.getSelection().getRangeAt(0);
        var preCaretRange = range.cloneRange();
        preCaretRange.selectNodeContents(editor);
        preCaretRange.setEnd(range.endContainer, range.endOffset);
        caretOffset = preCaretRange.toString().length;
    }
    else if (ie) {
        var textRange = document.selection.createRange();
        var preCaretTextRange = document.body.createTextRange();
        preCaretTextRange.expand(editor);
        preCaretTextRange.setEndPoint("EndToEnd", textRange);
        caretOffset = preCaretTextRange.text.length;
    }
    return caretOffset;
}

ができないこと、そしてする必要があるのは、範囲の現在の開始位置を見つけることです。私の置換メソッドが正しく機能するには、これを知る必要があります。単語を置き換えるときは、文書内のどこにいるのかを知る必要があります。

range.startOffset未定義を返します。では、どうすればポジションを獲得できるのでしょうか。

4

1 に答える 1