javascript - Switch case 未按预期运行 - 无法评估 case

标签 javascript switch-statement

好的 - 如果我是 JS 的新手,请举手 - 是的,我举手了。所以如果有人能告诉我我在这里做错了什么,我将不胜感激。它让我痉挛。

有一个网页 - 它有一个文本框 - 我想强制它只接受数字。我知道那里有很多选择,但我想非常具体地说明什么是数字,什么不是 - 取决于区域设置。所以我在 JS 中写了一些我在其他语言中使用过的代码。它是少数以相同方式失败的检查器功能之一。

1 function IsNumber( keyCode ){
2 //Allow numbers 0 to 9 and nothing else 
3   
4   // Ugly but adding zero forces the keyCode to be a number 
5   switch (keyCode + 0){  
6       case ( (keyCode >= ASC_ZERO) && ( keyCode <= ASC_NINE) ):
7           return true;
8       
9       default:
10          return false;
11  }
12}

键码 = 49,ASC_ZERO = 48,ASC_NINE = 57

代码计算第 6 行,并在应该执行第 7 行时跳转到第 10 行

Google 控制台检测到我的所有鸭子都排成一排,所以它应该可以工作。

Google 控制台输出。

>keyCode <= ASC_NINE
>true    
>keyCode >= ASC_ZERO
>true    
>true && true
>true    
>( (keyCode >= ASC_ZERO) && ( keyCode <= ASC_NINE) )
>true    
>(keyCode + 0)
>49    
>( (keyCode >= ASC_ZERO) && ( keyCode <= ASC_NINE) )
>true

我仔细检查了括号,我认为我的分号都是正确的。

我是否可以将此作为一系列 if else 语句来完成 - 是的,但为了保持我所有代码的一致性,并且因为其他检查器函数有许多情况,我觉得 Switch Case 会更易于维护。

现在我只想知道为什么它不起作用。有什么想法吗?

要重现我的问题,请在事件后的第一个文本字段中输入一个数字。

这里有完整的 Testong 代码:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>

<title>increment field</title>
</head>
<body>

<script type="text/javascript">
// START OF DECLARATIONS

const ASC_UPPER_A = 65
const ASC_UPPER_Z = 90 
const ASC_LOWER_A = 97 
const ASC_LOWER_Z = 122
const ASC_ZERO = 48 
const ASC_NINE = 57 
const ASC_FULLSTOP = 46 
const ASC_NEGATIVE = 45 

const KEY_LEFT = 37 
const KEY_RIGHT = 39 
const KEY_UP = 38 
const KEY_DOWN = 40 
const KEY_DELETE = 46
const KEY_BACKSPACE= 8
const KEY_RETURN=13 
const KEY_TAB = 9 

const TYPE_IS_NUMERIC = 1
const TYPE_IS_NUMBER = 2
const TYPE_IS_ALPHA = 4
const TYPE_IS_DECIMAL = 8 
const TYPE_IS_INTEGER = 16
const TYPE_IS_WHITESPACE = 32 


// DECLARE HELPER FUNTIONS

function IsNumber( keyCode ){
//Allow numbers 0 to 9 and nothing else 

    // Ugly but adding zero forces the keyCode to be a number 
    switch (keyCode + 0){  
        case ( (keyCode >= ASC_ZERO) && ( keyCode <= ASC_NINE) ):
            return true;

        default:
            return false;
    }
}

function IsNumeric( keyCode ){
// We aren't using is_Numeric as it will 
// allow through e, ^, % and a couple of other chars    
//Check for NEGATIVE (-) & ASC_FULLSTOP (.) We don't allow comma (,) as it is not in the NZ locale  

    // Ugly but adding zero forces the keyCode to be a number 
    switch (keyCode + 0){  
        case IsNumber( keyCode ):
        case ASC_FULLSTOP:
        case ASC_NEGATIVE:
            return true;

        default:
            return false;
    }
}

 function IsInteger( keyCode ){

    switch ( keyCode + 0){
        case IsNumber(keyCode): 
            return true;

        case ASC_NEGATIVE: 
            return true; // Negative integer 

        default: 
            return false;
    }
}

function IsAlpha( keyCode ){
// We aren't using ctype_alpha as it will allow through
// chars not in the NZ_Locale also numbers from -128 to 255
// are considered alpha of a single char 
// THIS TEST WILL ONLY WORK FOR SINGLE CHARS
    switch ( keyCode + 0){
        case (( keyCode >= ASC_LOWER_A ) && ( keyCode <= ASC_LOWER_Z ) ):
        case (( keyCode >= ASC_UPPER_A ) && ( keyCode <= ASC_UPPER_Z ) ):
            return true;

        default:
            return false;
    }
}

function IsWhiteSpace( keyCode ){

    switch ( keyCode + 0){
        case ( ASC_SPACE ):
            return true;

        default:
            return false;
    }
}


// Main function to test a if key stroke is valid
function AllowKey(e, keyType ) {
    var unicode=e.charCode? e.charCode : e.keyCode

        // If movement key then return without further tests
        switch( unicode){
            case  unicode >=KEY_LEFT && unicode <=KEY_DOWN:
            case KEY_DELETE:
            case KEY_BACKSPACE:
            case KEY_RETURN:
            case KEY_TAB:
                return true;
            default:
                break;
        }

        // Test if unicode / keyCode  passes one of the tests 
        if ( keyType & TYPE_IS_NUMERIC ) {
            if (IsNumeric( unicode )){
                return true;
            }
        }

        if ( keyType & TYPE_IS_NUMBER ) {
            if (IsNumber( unicode )){
                return true;
            }
        }       

        if ( keyType & TYPE_IS_ALPHA ) {
            if (IsAlpha( unicode )){
                return true;
            }
        }       

        if ( keyType & TYPE_IS_DECIMAL ) {
            if (IsNumber( unicode )){
                return true;
            }
        }       

        if ( keyType & TYPE_IS_INTEGER ) {
            if (IsInteger( unicode )){
                return true;
            }
        }       

        if ( keyType & TYPE_IS_WHITESPACE ) {
            if (IsWhiteSpace( unicode )){
                return true;
            }
        }       

        // If we have made it this far the unicode keystoke has failed the test 
        return false;
}



</script>

<form>
<p>
<label> TYPE_IS_NUMBER - 0 to 9 only </label>
<input type="text" size=18 onkeypress="return AllowKey(event, TYPE_IS_NUMBER )">
</p>
<p>
<label> TYPE_IS_NUMERIC - 0 to 9, - and . only </label>
<input type="text" size=18 onkeypress="return AllowKey(event, TYPE_IS_NUMERIC )">
</p>
<p>
<label> TYPE_IS_ALPHA ONLY a to z an A to Z only  </label>
<input type="text" size=18 onkeypress="return AllowKey(event, TYPE_IS_ALPHA )">
</p>
<p>
<label> TYPE_IS_ALPHA (a to z an A to Z ) and TYPE_IS_WHITESPACE ' " only  </label>
<input type="text" size=18 onkeypress="return AllowKey(event, TYPE_IS_ALPHA + TYPE_IS_WHITESPACE )">
</p>
<p>
<label> TYPE_IS_ALPHA (a to z an A to Z ) and TYPE_IS_WHITESPACE ' " & TYPE_IS_NUMERIC only  </label>
<input type="text" size=18 onkeypress="return AllowKey(event, TYPE_IS_ALPHA + TYPE_IS_WHITESPACE + TYPE_IS_NUMERIC)">
</p>


</form>
</body>
</html>

最佳答案

您正在根据 (keyCode >= ASC_ZERO) && ( keyCode <= ASC_NINE) 检查 (keyCode + 0) 的值

喜欢

if( (keyCode + 0) == (keyCode >= ASC_ZERO) && ( keyCode <= ASC_NINE) )

这就是错误。

关于javascript - Switch case 未按预期运行 - 无法评估 case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29670925/

相关文章:

javascript - Import.meta.env 在生产构建 vitejs 上未定义

javascript - ESlint 对匿名函数关键字发出警告,并且不允许对函数内的参数进行赋值

javascript - 根据对象的关键结构生成元素

swift - 检查 NSIndexPath 的行和部分的开关

Python字典: Running Custom Functions

java - 单击组合框选项时不显示切换大小写字符串

c# - 为什么这个 switch on 类型的案例被认为是令人困惑的?

javascript - JavaScript 函数中返回变量

javascript - 键入 svg 元素在对象中使用react

c - 是案例内的三重点(案例 '0' ... '9' :) valid C language switch syntax?