You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:BMI计算器JavaScript结果无法渲染问题排查

BMI计算器点击按钮无结果显示问题排查

我是前端开发新手,正在学习使用HTML、CSS和JavaScript制作小型项目。我制作了一个简易BMI计算器,该计算器本应在用户输入所有必要信息后,点击按钮显示计算结果,但点击后无任何结果显示。

代码文件

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <title>BMI Calculator</title>
  </head>
  <body>
    <div class="container">
      <h2>BMI Calculator</h2>
      <form id="BMIForm">
        <label for="gender">Gender: </label>
        <select id="gender" required>
          <option value="Male">Male</option>
          <option value="Female">Female</option>
          <option value="Third Gender">Third Gender</option>
        </select>

        <label for="age">Age:</label>
        <input type="number" id="age" placeholder="Enter Age" required />

        <label for="height-feet">Height:</label>
        <input type="number" id="heigt-feet" placeholder="Feet" required />
        <input type="number" id="height-inches" placeholder="inches" />

        <label for="weight">Weight: </label>
        <input type="number" id="weight" placeholder="Enter Weight in Kgs" />

        <input type="submit" value="Calculate BMI" />
      </form>

      <div id="result"></div>
    </div>

    <script src="script.js"></script>
  </body>
</html>

style.css

body{
    background-color: rgba(104, 3, 163, 0.801);
}

.container {
    max-width: 400px;
    margin: 200px auto;
    padding: 20px;
    background-color: #da6161;
    border: 2px solid rgb(255, 255, 255);
    border-radius: 20px;
    box-shadow: 10px 10px 10px rgba(1, 1, 1, 0.6);
    
}

h2 {
    margin-top: 0;
    color: #3a3838;
    text-align: center;
    text-decoration:underline ;

}

form {
    margin-bottom: 50px;
    display:flex;
    flex-direction:column;
}

label {
    font-size:larger;
    font-weight: 1000px;
    margin-bottom: 5px;
    color: #ffffff;
}

input[type="number"],
select {

    width: 95%;
    padding: 10px;
    border: none;
    background-color: #caadad;
    border-radius: 10px;
    box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
    margin-bottom: 10px;
}

input[type="number"] :focus,
select :focus {
    outline: none;
    box-shadow: 0px 0px 0px 5px rgb(0, 0, 0);

}

select {
    width: 100%;
}

input[type="submit"]{
    padding: 10px;
    margin-top: 10px;
    background-color: rgb(2, 4, 92);
    border: none;
    border-radius: 50px;
    color: #fdfdfd;
    cursor: pointer;
    transition: background-color 0.1s ease;

}

input[type="submit"]:hover {
    background-color: blueviolet;
}

#result {
    font-weight: bold;
    margin-top: 10px;
    color: black;
}

script.js

document.getElementById('BMIForm').addEventListener('submit',function(e){
    e.preventDefault(); //阻止页面自动刷新

    const gender = document.getElementById('gender').value;
    const age = parseInt(document.getElementById('age').value); 
    const heightFeet = parseInt(document.getElementById('height-feet').value);
    const heightInches = parseInt(document.getElementById('heigh-inches').value);
    const weight = parseFloat(document.getElementById('weight').value);

    if(gender && age && heightFeet && heightInches && weight){
        const heightInMeters = (heightFeet * 12 + heightInches) * 0.0254; //转换为米
        const bmi = weight / (heightInMeters*heightInMeters);
        const resultElement = document.getElementById('result');

        let category = '';
        if(bmi < 18.5){
            category = 'Under Weight';
        }else if(bmi >= 18.5 && bmi < 25){
            category = 'Normal Weight';
        }else if(bmi >= 25 && bmi < 30){
            category = 'Over Weight';
        }else{
            category += 'Obese';
        }

        let resultMessage = 'Your BMI: ' + bmi.toFixed(2) + '<br>';
        resultMessage += 'Category: ' + category;

        resultElement.innerHTML = resultMessage;
    }
});

问题现象

点击计算按钮后,resultElement.innerHTML = resultMessage;这行代码本应渲染计算结果,但实际无任何内容显示。

操作截图

  • 输入前状态:
    输入前状态
  • 输入后点击按钮状态:
    输入后点击按钮无结果

问题原因及修复方案

1. ID拼写错误(核心问题)

  • HTML中身高英尺输入框的ID是heigt-feet(少了字母h),但JS中获取的是height-feet,导致heightFeet值为NaN
  • HTML中身高英寸输入框的ID是height-inches,但JS中获取的是heigh-inches(少了字母t),导致heightInches值为NaN

修复:

  • 修改HTML中英尺输入框的ID:
<input type="number" id="height-feet" placeholder="Feet" required />
  • 修改JS中获取英寸输入框的代码:
const heightInches = parseInt(document.getElementById('height-inches').value);

2. 缺少必填校验

体重输入框没有添加required属性,用户未输入时weight值为NaN,导致条件判断不通过。

修复:给体重输入框添加required:

<input type="number" id="weight" placeholder="Enter Weight in Kgs" required />

3. 条件判断优化(可选)

原条件判断依赖变量的真值性,但parseInt/parseFloat在输入空值时会返回NaN,可以显式检查是否为有效数字,避免意外情况:

if(gender && !isNaN(age) && !isNaN(heightFeet) && !isNaN(heightInches) && !isNaN(weight)){
    // 计算逻辑
}

修正后的完整JS代码

document.getElementById('BMIForm').addEventListener('submit',function(e){
    e.preventDefault();

    const gender = document.getElementById('gender').value;
    const age = parseInt(document.getElementById('age').value);
    const heightFeet = parseInt(document.getElementById('height-feet').value);
    const heightInches = parseInt(document.getElementById('height-inches').value);
    const weight = parseFloat(document.getElementById('weight').value);

    if(gender && !isNaN(age) && !isNaN(heightFeet) && !isNaN(heightInches) && !isNaN(weight)){
        const heightInMeters = (heightFeet * 12 + heightInches) * 0.0254;
        const bmi = weight / (heightInMeters*heightInMeters);
        const resultElement = document.getElementById('result');

        let category = '';
        if(bmi < 18.5){
            category = 'Under Weight';
        }else if(bmi >= 18.5 && bmi < 25){
            category = 'Normal Weight';
        }else if(bmi >= 25 && bmi < 30){
            category = 'Over Weight';
        }else{
            category = 'Obese';
        }

        let resultMessage = `Your BMI: ${bmi.toFixed(2)}<br>`;
        resultMessage += `Category: ${category}`;

        resultElement.innerHTML = resultMessage;
    }
});

内容的提问来源于stack exchange,提问作者Quamrulssss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:57:32