2016-08-15 71 views
1

我有下面的代码,我试图检查用户的输入是否在我设置的接受字符之间。'返回false'不会阻止字符出现在输入检查字符串时

代码:

element.onkeypress = function (e) { 
    var 
     key = String.fromCharCode(e.which), 
     isAccepted = (typeof self.acceptedChars === "object") ? 
      self.acceptedChars.test(key) : /* Check for RegEx */ 
      ~self.acceptedChars.indexOf(key), /* Check for String */ 
     isMaxOrLess = self.maxLength > this.value.length; 
    if (isAccepted && isMaxOrLess) element.dispatchEvent(success); 
    else if (!isAccepted && isMaxOrLess) element.dispatchEvent(error); 
    return isAccepted && isMaxOrLess; 
}; 

实施例:

[工作]:如果self.acceptedChars = /[a-z]/,然后一切都会按预期运行产生以下:

  • 输入:ad12s
  • 输出:ads

[不灵]:如果self.acceptedChars = "abc",那么即使只是'a''b''c'所有字符将被认定为不被接受,出于某种原因,他们可以仍然可以进入。

  • 输入:aabb12
  • 输出:aabb12
  • 本来应该是:aabb

注:自定义事件successerror用于显示基于isMaxOrLessisAccepted条件不同的消息,并没有发生关系的问题。

基本上我的问题是,return false没有出现在acceptedChars是一个字符串停止字符。我该如何解决这个问题?

+0

代字号在键之前做了什么? '〜key.indexOf' –

+0

在这种情况下,它将**'!= -1 **转换为**'> = 0 ** ** @TamasRev –

+0

@TamasRev它将-1转换为falsy(0),其他值truthy。 –

回答

1

应该是。 Demo

!!~self.acceptedChars.indexOf(key), /* Check for String */ 

~key.indexOf(self.acceptedChars), /* Check for String */ 

UPD您需要的值转换为布尔。不只是让falsy

所以不如少用criptic

self.acceptedChars.indexOf(key) >= 0, /* Check for String */ 
+0

它不工作Yury。 –

+0

@AngelPolitis我已经更新了答案..您需要将返回值转换为布尔值。 –

+0

不,越神秘越好。我会坚持**'!!〜'**。谢谢@Yury –

0

这应该工作:

element.onkeypress = function (e) { 
    var 
     key = String.fromCharCode(e.which), 
     isAccepted = (typeof self.acceptedChars === "object") ? 
      self.acceptedChars.test(key) : /* Check for RegEx */ 
      self.acceptedChars.indexOf(key) === -1 ? false : true, /* Check for String */ 
     isMaxOrLess = self.maxLength > this.value.length; 
    if (isAccepted && isMaxOrLess) element.dispatchEvent(success); 
    else if (!isAccepted && isMaxOrLess) element.dispatchEvent(error); 
    return isAccepted && isMaxOrLess; 
}; 

的情况下self.acceptedChars是你应该返回真/假值的字符串。

+0

我相信你的解决方案也可以工作,但为什么使用第二个三元组来实现这么简单的事情呢? –