2016-10-22 10 views
1

私の最大の問題は、置き換えられた後、カーソルがテキストエリアの最後にデフォルト設定されることです。入力しても問題ありませんが、もし私が戻って編集しているのであれば、本当に面倒です。ここで私が試したことがあります(テキストエリアのIDは「エリア」です).replace()の後ろにカーソル位置を戻します。

var el = e.area; 

    position = el.selectionStart; // Capture initial position 

     el.value = el.value.replace('\u0418\u0410', '\u042F'); 
    el.selectionEnd = position; // Set the cursor back to the initial position. 
+0

ので、置換テキストの長さは右、入力したテキストの長さは異なることができますか? – ConnorsFan

+0

こんにちは、そうかもしれません。 .replace()の最も一般的な使い方の1つは、単に文字列から単語/句を削除することです。たとえば、.replace( 'word'、 '')は 'word'を ''で置き換えて、それを削除します。これはカーソルと実際には違いはありません。長さにかかわらず最後に移動します。 – Zackh105

+0

しかし、それは解決策に違いがあります。元の位置を単純に復元しても、長さが変更されていればカーソルが正しく戻されません。 – ConnorsFan

答えて

1

次のコードスニペットを試すことができます。現在の形式では、==+に置き換えますが、任意の文字列を別の文字列に置き換えることができます。

カーソル位置を維持するには、selectionStartselectionEndを保存して復元する必要があります。オフセットは、2つの文字列間の長さの差と、カーソルの前のオカレンスの数を考慮して計算されます。

setTimeoutを使用すると、処理の前に新しく入力された文字が確実に挿入されます。

var area = document.getElementById("area"); 
 

 
var getCount = function (str, search) { 
 
    return str.split(search).length - 1; 
 
}; 
 

 
var replaceText = function (search, replaceWith) { 
 
    if (area.value.indexOf(search) >= 0) { 
 
     var start = area.selectionStart; 
 
     var end = area.selectionEnd; 
 
     var textBefore = area.value.substr(0, end); 
 
     var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore, search); 
 
     area.value = area.value.replace(search, replaceWith); 
 
     area.selectionStart = start + lengthDiff; 
 
     area.selectionEnd = end + lengthDiff; 
 
    } 
 
}; 
 

 
area.addEventListener("keypress", function (e) { 
 
    setTimeout(function() { 
 
     replaceText("==", "+"); 
 
    }, 0) 
 
});
<textarea id="area" cols="40" rows="8"></textarea>

+0

こんにちは、なぜこのスクリプトはうまくいきませんか。私は "Run code snippet"を試してみるとJSFiddle上で動作しますが、どこにもありません。私は複数のHTMLエディタを試してみました。スクリプトを.html形式でダウンロードしてみました。私のサイトにもアップロードしました。なぜそれが動作しないのか? – Zackh105

+0

スクリプトブロックは、DOM要素の後に本文の末尾にある必要があります。 – ConnorsFan

+0

私はそれを試しました - 私はスクリプトの前にテキストエリアを入れました、運はありません – Zackh105

関連する問題