我有一个文本框。我希望用户能够输入的唯一内容是括号。他们也应该只能删除括号。我这样做有点麻烦。
现在我有这样的功能:
'#myTextArea input': function (el, ev) {
}
我使用了输入,因此可以处理人们的粘贴。
我不知道如何找到从中输入的字符。我特别不知道如何确保只删除了一个括号。有人知道这样做的好方法吗?
修改 为了澄清,文本框已经填充了文本。用户应该只能在已经存在的文本中添加和删除括号。
EDIT2
我让它工作,所以用户只能输入括号。这不考虑粘贴,也不处理删除。仍然不知道该怎么做.....
'#myTextArea keydown': function (el, ev) {
if ((ev.keyCode != 48 && ev.keyCode != 57) || ev.shiftKey == false){
return false;
}
}
答案 0 :(得分:1)
一种可能的解决方案是在keyup事件中以编程方式执行。我只显示插入时的情况(通过按键或粘贴)。
无论是按下字符键还是按Ctrl-V,通常都会在字符串中插入子字符串。插入符号位置将位于该子字符串的末尾。
我的算法发现substring为两个位置之间的字符串:
然后它使用函数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>