一种可能的解决方案是在 keyup 事件中以编程方式进行。我只显示插入时的情况(通过按键或粘贴)。
无论是按下字符键还是 Ctrl-V,通常都会有一个子字符串被插入到字符串中。插入符号位置将位于该子字符串的末尾。
我的算法发现该子字符串是两个位置之间的字符串:
- 最长公共前缀的结尾(不同的第一个字符是插入的子字符串的开头)
- 插入符号位置
然后它使用函数 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>