2

我有一个文本框。我希望用户能够输入的唯一内容是括号。他们也应该只能删除括号。不过,我在这样做时遇到了很多麻烦。

现在我有这样的功能:

        '#myTextArea input': function (el, ev) {

        }

我使用了输入,所以它可以处理人们粘贴。

不过,我不确定如何找到从中键入的字符。我尤其不知道如何确保只删除了一个括号。有人知道这样做的好方法吗?

编辑 为了澄清,文本框已经填充了文本。用户应该能够在已经存在的文本中添加和删除括号。

编辑2

我让它工作了,所以用户只能输入括号。这不考虑粘贴,也不处理删除。仍然不知道如何做到这一点......

        '#myTextArea keydown': function (el, ev) {
            if ((ev.keyCode != 48 && ev.keyCode != 57) || ev.shiftKey == false){
                return false;
            }
        }
4

1 回答 1

1

一种可能的解决方案是在 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>
于 2012-12-14T23:36:23.837 回答