2012-12-14 70 views
2

我有一个文本框。我希望用户能够输入的唯一东西是括号。他们也应该只能删除括号。尽管如此,我还是遇到了很多麻烦。只需要允许输入或删除某些字符

现在我有这样的功能:

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

     } 

我用输入,所以它会处理人际关系粘贴。

我不知道如何找到从此键入的字符。我尤其不知道如何确保只有一个括号被删除。任何人都知道这样做的好方法?

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

EDIT2

我得到它的工作,使用户可以只输入括号。这不考虑粘贴,并且不涉及删除。仍然不知道该怎么做.....

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

您使用的骨干或任何其他框架? – David

+0

只有被使用的东西是JQuery和JavascriptMVC。 – user1652427

+1

如果他们只能输入括号,他们如何删除括号以外的任何内容? – thatidiotguy

回答

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>