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

JS中获取data-addval属性时返回undefined/NaN问题求助

解决JavaScript中访问data-addval属性返回undefined/NaN的问题

问题出在你使用dataset访问属性时的命名错误:HTML中的data-addval属性,在dataset对象对应的属性名是**addval(全小写)**,而不是你代码里写的addVal。

原因解释

dataset的命名规则是将data-前缀后的kebab-case属性名转换为camelCase,但只有当属性名包含连字符时,连字符后的首字母才会大写。比如:

  • data-add-val → dataset.addVal
  • data-addval(无连字符)→ dataset.addval

你代码里用了upgradeButtonData.addVal,自然获取不到对应的值,返回undefined,再转成数字就变成了NaN。

修改后的代码示例

修正属性名

const upgradeButtonsContainer = document.querySelectorAll(".btnU");

upgradeButtonsContainer.forEach((upgradeButton) => {
    upgradeButton.addEventListener("click", (e) => {
        const upgradeButtonData = e.target.dataset;
        // 把addVal改为addval
        console.log("Before calling upgrade: addVal =", upgradeButtonData.addval);
        upgrade(parseInt(upgradeButtonData.cost), Number(upgradeButtonData.addval), parseFloat(upgradeButtonData.progress));
    });
});

额外优化:确保获取绑定事件的元素

如果按钮内部嵌套了其他元素,e.target可能指向内部元素而非按钮本身,导致依然获取不到dataset。这种情况下改用e.currentTarget(始终指向绑定事件的元素)更可靠:

const upgradeButtonsContainer = document.querySelectorAll(".btnU");

upgradeButtonsContainer.forEach((upgradeButton) => {
    upgradeButton.addEventListener("click", (e) => {
        const upgradeButtonData = e.currentTarget.dataset;
        console.log("Before calling upgrade: addVal =", upgradeButtonData.addval);
        upgrade(parseInt(upgradeButtonData.cost), Number(upgradeButtonData.addval), parseFloat(upgradeButtonData.progress));
    });
});

修改后,addval就能正确获取到HTML中data-addval的数值,后续的Number()转换也能得到有效数字,不会再出现NaN的情况。

内容的提问来源于stack exchange,提问作者Alex-GR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:08:12