如何确保用户输入的数据是JavaScript中的特定数据类型?

gupuwyp2  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(116)

我一直在用JavaScript进行一些基本的表单验证。目前,我有一个简单的HTML表单,它有三个输入字段-两个需要输入数字,一个需要输入字符串。然而,我正在努力实现这一点。

const displayMessage = function (message) {
  document.querySelector(".message").textContent = message;
};

const displayOtherMessage = function (message) {
  document.querySelector(".message1").textContent = message;
};

document.querySelector(".check").addEventListener("click", function () {
  const height = Number(document.querySelector(".height").value);
  const weight = Number(document.querySelector(".weight").value);
  const name = String(document.querySelector(".name").value);
  if (!height && !weight && !name) {
    displayMessage("Please enter a height, a weight and a name.");
  } else if (!height || !weight || !name) {
    displayMessage("Please enter a height, a weight and a name.");
  } else if (height && weight && name) {
    if (
      typeof weight !== "number" ||
      typeof height !== "number" ||
      typeof name !== "string"
    ) {
      displayOtherMessage(
        "Height must be a number, weight must be a number and name must be a string."
      );
    }
    displayMessage("");
    alert(
      `Thank you, ${name}! You said you weigh ${weight} kilograms and are ${height} metres tall.`
    );
  }
});

以下是我正在纠结的问题:

if (
      typeof weight !== "number" ||
      typeof height !== "number" ||
      typeof name !== "string"
    ) {
      displayOtherMessage(
        "Height must be a number, weight must be a number and name must be a string."
      );
    }

当我尝试提交时,比如在第二个输入字段中输入“John”,显示的是displayMessage,我如何使它显示的是displayOtherMessage呢?
此处为HTML:
https://pastebin.com/E5Pm6Dku

xzlaal3s

xzlaal3s1#

Number()总是返回一个number,而String()总是返回一个字符串,所以那些typeof检查并不像您所希望的那样。
如果传递给Number()的字符串是一个 invalid 数字,它将返回NaN。因此,您可以尝试isNaN(weight)而不是typeof
顺便说一句,在Node.js或浏览器控制台中,您可以直接试验这类事情,如do:

> var height = Number("john")
> height
NaN
> typeof height
"number"
> isNaN(height)
true

也可以尝试使用一个您希望有效的值(如"10"或其他值)。

j13ufse2

j13ufse22#

你的代码在检查方面有点多余。比如,<input>值总是字符串,所以不需要检查它的类型,只需要检查它不是空的。另外,你应该更具体地说明你需要你的用户做什么(哪个输入是不正确的)。你可以把它简化成这样:

const displayMessage = function (message) {
  document.querySelector(".message").textContent = message;
};

document.querySelector(".check").addEventListener("click", function () {
  let height = document.querySelector(".height").value,
      name = document.querySelector(".name").value,
      weight = document.querySelector(".weight").value;
  
  if (!name) {
    displayMessage("Please enter a name.");
  } else if (!height || isNaN(Number(height))) {
    displayMessage("Height must be a number.");
  } else if (!weight || isNaN(Number(weight))) {
    displayMessage("Weight must be a number.");
  } else {
    displayMessage(`Thank you, ${name}! You said you weigh ${weight} kilograms and are ${height} metres tall.`
    );
  }
});

https://jsfiddle.net/1L5qjg2o/3/
另外,考虑使用keyup事件对输入进行检查。在我看来,如果在用户输入时进行验证和更正,而不是等到最后提交所有内容时再返回,用户体验会更好。

相关问题