好的 - 如果我是 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/