整数输入的JavaScript提示验证

时间:2018-08-29 13:42:02

标签: javascript validation prompt

我发现自己需要创建一个函数来验证JS提示符作为整数的输入。事实证明,按cancel返回null.

会涉及一些微妙之处。

我最初尝试(从Python程序移植)是:

function getInteger() {
    let number = null
    while ( number == null ) {
        let value = prompt( "Guess number: " )
        if ( isNaN( value ) ) {
            alert( "Invalid input." )
        } else {
            number = parseInt( value )
        }
    }
    return number;
}

但是,如果我取消了提示,则返回NaN,这对于返回值没有意义(似乎isNaN(null)返回了false)。 (按没有意义,我的意思是“该程序的其余部分无法有意义地使用它,因为它不能描述所发生的事情”)。

所以经过一番思考,我想到了:

function getInteger(){
    while(true){
        let input = prompt("Input number: ");
        if (input && isNaN( input ) ) {
            // user pressed OK, but input invalid
            alert("Invalid input.");
        } else if (input) {
            // user typed something valid and hit OK
            return parseInt(input);
        } else {
            // User pressed cancel
            alert("I'm out of here.")
            return;
        }
    }
}

getInteger()

我很好奇我是否涵盖了所有可能的输入?另外,我的代码是否“编写得很好”-有更好的方法吗?使用while(true)被认为是一个坏主意吗?

我知道一般而言,提示可能不是一个好主意,但这不是重点。

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

无法对此prompt函数行为进行解答,但是您的最后一个代码等效于:

let input;
while (input = prompt("Input number: ")) {
  if (isNaN(input)) {
    alert("Invalid input.");
  } else {
    return parseInt(input);
  }
}

仍然在prompt行为之外,如果您期望input字符串中有一个整数(即 only 数字),则我倾向于使用正则表达式进行测试类似于/^\d+$/,而不是isNaN(如果我输入"1.25",结果将不是NaN,而是return 1,但不会)似乎就是您要实现的目标。

编辑,该代码与完全不相同,所以让我们做到:

let input;
while (input = prompt("Input number: ")) {
  if (isNaN(input)) {
    alert("Invalid input.");
  } else {
    return parseInt(input);
  }
}
alert("I'm out of here.");
return;

答案 1 :(得分:1)

我在上面运行了您的代码,我尝试不输入任何内容,然后按OK(确定)及其显示警报,就像我取消提示一样。我认为您还应该检查用户输入的内容还是不输入的内容。您的代码可能看起来像这样:

function getInteger(){
    while(true){   	  
        let input = prompt("Input number: ");
        
        if (input == null) {
            // user hit cancel
        		alert("I'm out of here.")
            return true;
        } else{
        	  if (input.length<=0 || isNaN( input ) ) {
                // user pressed OK, but input invalid or does not input anything
                alert("Invalid input.");
            } else {
                // user typed something valid and hit OK
                return parseInt(input);
            }
         }                    
        }                     
}

getInteger()