只需要允许输入或删除某些字符

时间:2012-12-14 20:08:33

标签: javascript jquery

我有一个文本框。我希望用户能够输入的唯一内容是括号。他们也应该只能删除括号。我这样做有点麻烦。

现在我有这样的功能:

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

        }

我使用了输入,因此可以处理人们的粘贴。

我不知道如何找到从中输入的字符。我特别不知道如何确保只删除了一个括号。有人知道这样做的好方法吗?

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

EDIT2

我让它工作,所以用户只能输入括号。这不考虑粘贴,也不处理删除。仍然不知道该怎么做.....

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

1 个答案:

答案 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>