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

图书订单系统自动计算异常:只读输入框未显示计算结果

问题:JavaScript嵌入HTML实现自动计算功能失效

我正在完成一项将JavaScript嵌入HTML的作业,需要实现自动计算功能,让计算结果显示在灰色只读输入框中,但结果始终无法显示。附上我的JavaScript代码与HTML代码,请求排查代码问题。

JavaScript代码

function calculate_Total() {
    document.querySelector('#total_1').value = parseFloat(price_1.value) * parseFloat(qty1.value);
}

const price_1 = document.querySelector('#price_1');
const qty_1 = document.querySelector('#qty_1');

price_1.addEventListener("keyup", (e) => calculate_Total());
qty_1.addEventListener("keyup", (e) => calculate_Total());

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Order a book!</title>
    <link rel="stylesheet" href="CSS/book-order.css">
    <script src="JS/book-order.js"></script>
</head>
<body>
    <form>
        <h1>Book Ordering System</h1>
        <table>
            <thead>
                <tr>
                    <th>No.</th>
                    <th>Book Title</th>
                    <th>Author</th>
                    <th>Category</label></th>
                    <th>Unit Price</th>
                    <th>Quantity</th>
                    <th>Total</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td><input type="text" name="book-title" id="book-title"></td>
                    <td><input type="text" name="author" id="author"></td>
                    <td>
                        <select id="category">
                            <option disabled selected>Please choose a category...</option>
                                <option value="bsn">Business</option>
                                <option value="fic">Fiction</option>
                                <option value="math">Mathematics</option>
                                <option value="tech">Technology</option>
                        </select>
                    </td>
                    <td><input type="number" name="price" id="price_1" min="0.00" value="0.00" step="0.01"/></td>
                    <td><input type="number" name="qty" id="qty_1" min="0" value="0" /></td>
                    <td><input type="number" name="total" id="total_1" min="0" value="0.00" step="0.01" onchange="calculate_Total()" readonly /></td>
                </tr>
                <tr>
                    <td>2</td>
                    <td><input type="text" name="book-title" id="book-title"></td>
                    <td><input type="text" name="author" id="author"></td>
                    <td>
                        <select id="category">
                            <option disabled selected>Please choose a category...</option>
                                <option value="bsn">Business</option>
                                <option value="fic">Fiction</option>
                                <option value="math">Mathematics</option>
                                <option value="tech">Technology</option>
                        </select>
                    </td>
                    <td><input type="number" name="price" id="price_1" min="0.00" value="0.00" step="0.01" onchange="calculate_Total()" /></td>
                    <td><input type="number" name="qty" id="qty_1" min="0" value="0" onchange="calculate_Total()" /></td>
                    <td><input type="number" name="total" id="total_1" min="0" value="0.00" step="0.01" readonly onchange="calculate_Total()"/></td>
                </tr>
                <tr>
                    <td>3</td>
                    <td><input type="text" name="book-title" id="book-title"></td>
                    <td><input type="text" name="author" id="author"></td>
                    <td>
                        <select id="category">
                            <option disabled selected>Please choose a category...</option>
                                <option value="bsn">Business</option>
                                <option value="fic">Fiction</option>
                                <option value="math">Mathematics</option>
                                <option value="tech">Technology</option>
                        </select>
                    </td>
                    <td><input type="number" name="price" id="price_1" min="0.00" value="0.00" step="0.01" onchange="calc()" /></td>
                    <td><input type="number" name="qty" id="qty_1" min="0" value="0" onchange="calc()" /></td>
                    <td><input type="number" name="total" id="total_1" min="0" value="0.00" step="0.01" readonly /></td>
                </tr>
                <tr>
                    <td>4</td>
                    <td><input type="text" name="book-title" id="book-title"></td>
                    <td><input type="text" name="author" id="author"></td>
                    <td>
                        <select id="category">
                            <option disabled selected>Please choose a category...</option>
                                <option value="bsn">Business</option>
                                <option value="fic">Fiction</option>
                                <option value="math">Mathematics</option>
                                <option value="tech">Technology</option>
                        </select>
                    </td>
                    <td><input type="number" name="price" id="price_1" min="0.00" value="0.00" step="0.01" onchange="calc()" /></td>
                    <td><input type="number" name="qty" id="qty_1" min="0" value="0" onchange="calc()" /></td>
                    <td><input type="number" name="total" id="total_1" min="0" value="0.00" step="0.01" readonly /></td>
                </tr>
                <tr>
                    <td>5</td>
                    <td><input type="text" name="book-title" id="book-title"></td>
                    <td><input type="text" name="author" id="author"></td>
                    <td>
                        <select id="category">
                            <option disabled selected>Please choose a category...</option>
                                <option value="bsn">Business</option>
                                <option value="fic">Fiction</option>
                                <option value="math">Mathematics</option>
                                <option value="tech">Technology</option>
                        </select>
                    </td>
                    <td><input type="number" name="price" id="price_1" min="0.00" value="0.00" step="0.01" onchange="calc()" /></td>
                    <td><input type="number" name="qty" id="qty_1" min="0" value="0" onchange="calc()" /></td>
                    <td><input type="number" name="total" id="total_1" min="0" value="0.00" step="0.01" readonly /></td>
                </tr>
            </tbody>
            <tfoot>
                <td colspan="5">
                    <div style="text-align: right">
                        <button onclick="calculate();">Calculate Grand Total Price</button>
                    </div>
                </td>
                <td colspan="2">
                    <div style="text-align: right;">
                        <input type="number" name="grand_total" id="grand_total" value="0.00" readonly>
                    </div>
                </td>
            </tfoot>
        </table>
    </form>
<script src="book-order.js"></script>
</body>
</html>

编辑说明

我已修改过部分ID,但目前输入内容时,灰色输入框仍未显示结果。


问题排查与修复方案

1. 变量名拼写错误

calculate_Total函数中使用了qty1.value,但定义的变量是qty_1,缺少下划线导致无法获取输入值,计算结果为NaN无法显示。修正后代码:

document.querySelector('#total_1').value = parseFloat(price_1.value) * parseFloat(qty_1.value);

2. ID重复问题

HTML中所有行的价格、数量、总计输入框ID重复使用price_1、qty_1、total_1,而document.querySelector仅返回第一个匹配元素,导致只有第一行能触发计算,结果也只更新第一行。需给每行元素设置唯一ID:

  • 第1行:price_1、qty_1、total_1
  • 第2行:price_2、qty_2、total_2
  • 第3行:price_3、qty_3、total_3
    以此类推。

3. 函数绑定错误与冗余

  • 部分行绑定了未定义的calc()函数,需统一替换为calculate_Total(或为每行编写单独计算函数)。
  • 页面同时在<head>和<body>末尾引入book-order.js,脚本重复加载,建议只保留<body>末尾的引入,确保DOM加载完成后执行脚本。

4. 脚本执行时机问题

原脚本在<head>引入时,DOM元素未加载完成,document.querySelector返回null导致事件绑定失败。可将脚本放在<body>末尾,或添加DOMContentLoaded监听:

document.addEventListener('DOMContentLoaded', function() {
    const price_1 = document.querySelector('#price_1');
    const qty_1 = document.querySelector('#qty_1');

    function calculate_Total() {
        document.querySelector('#total_1').value = parseFloat(price_1.value) * parseFloat(qty_1.value);
    }

    price_1.addEventListener("keyup", calculate_Total);
    qty_1.addEventListener("keyup", calculate_Total);
});

5. 冗余事件绑定移除

总计框为只读状态,不会触发onchange事件,可移除所有总计框的onchange="calculate_Total()"绑定。


内容的提问来源于stack exchange,提问作者A.K. Enoch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:26:08