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
未定義を返します。では、どうすればポジションを獲得できるのでしょうか。