考えられる解決策の 1 つは、keyup イベントでプログラムによって実行することです。挿入時 (キーを押すか貼り付ける) の場合のみを示します。
文字キーが押された場合でも、Ctrl-V が押された場合でも、一般に、文字列に部分文字列が挿入されます。キャレット位置は、その部分文字列の最後になります。
私のアルゴリズムは、その部分文字列を 2 つの位置の間の文字列として見つけます。
- 最長の共通接頭辞の終わり (異なる最初の文字は、挿入された部分文字列の始まりです)
- キャレット位置
次に、関数 filterString を使用して文字列をフィルタリングし、括弧以外のすべての記号を "" に置き換えます。
最後に、入力値を最長の共通プレフィックス + フィルタリングされた文字列 + キャレットの後のテキストに更新します
キャレット操作には、この jquery プラグインが必要です: http://jcaret.googlecode.com/
<input id="myTextArea" value="a*(b*(c+d))">
</input>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://jcaret.googlecode.com/files/jquery.caret.1.02.min.js"></script>
<script type="text/javascript">
var old_value = $('#myTextArea').val();
function filterString(a) {
return a.replace(/[^\(\)]/g,"");
}
$('#myTextArea').keyup(function(){
var end_of_insertion = $(this).caret().start;
var new_value = $(this).val();
var i=0;
while(i<old_value.length && i<new_value.length && old_value[i]==new_value[i]) {
i++;
}
if(i>=end_of_insertion)return;
// i now points to first different character in strings old_value and new_value
new_value = new_value.substr(0,i)
+ filterString(new_value.substr(i,end_of_insertion-i))
+ new_value.substr(end_of_insertion);
$('#myTextArea').val(new_value).caret({start: end_of_insertion, end: end_of_insertion});
old_value = new_value;
});
</script>