将变量传递给getElementById会导致NaN错误

时间:2015-12-28 21:57:12

标签: javascript

function upgrade(cost, hps, htmlName, id)
{
    /* calc new cost based on quantity currently has */
    var currUpgradeCost = Math.floor(cost * Math.pow(1.1,upgradeCount[id]));

    /* can they afford it? */
    if(totalHacks >= currUpgradeCost)
    {
        /* tally up THIS UPGRADE */
        upgradeCount[id]++;
        /* total the upgrades as a whole */
        totalUpgrades = totalUpgrades + hps;
        /* subtract this cost fro the total hacks so far */
        totalHacks = totalHacks - currUpgradeCost; 
        /* update the HTML */
        document.getElementById('hpc').innerHTML = totalUpgrades.toFixed(1); 
        document.getElementById('totalHacks').innerHTML = totalHacks.toFixed(0); 
    };

    /* calc/display cost for next upgrade */
    var nextCost = Math.floor(cost * Math.pow(1.1,upgradeCount[id])); 
    document.getElementById(htmlName).innerHTML = nextCost; 

};

 <button onclick="upgrade(15, .1,'upgradePCCost', 0)">Upgrade System</button>
            - Cost <span id="upgradePCCost">15</span><br/>

            <button onclick="upgrade(100, .5,'scriptBotCost', 1)">Script Bot</button>
            - Cost <span id="scriptBotCost">100</span><br/>

编辑:全功能:(是的,可以通过点击游戏来学习JS。)如果能够解决问题,我会采取反对票。这两部分给我提出了问题。 /编辑 好的,希望我把这个变得简单而重要。主要问题 - 它有效,它只为NaN提供targetId错误。

现在我到处读书,我发现了几件事。

  1. 我找不到任何人以我的方式将var传递给elementById
  2. 由于我找不到有效的答案 - 我显然做错了。
  3. 这都是一个大项目,为避免冗余代码,它基于他们点击的按钮,所以我只是将它添加到该功能。唯一不起作用的行是上面的那一行:elementById。我的调试器没有显示任何错误,html只是继续吐出NaN而不是444(在此示例中)

    我查过的很多网站/论坛都说这应该有用。所以我缺少一些东西。

    我尝试过的一些事情:

    - .toString() - elementsByName

    感谢。我很确定我在S.O.上到处检查过。确保这不是一个骗局,因为没有人用同样的结果做同样的事情(即我找到的很多因为拼写错误而被解决了 - 显然,这不是我的问题)

2 个答案:

答案 0 :(得分:0)

这对我很有用:

&#13;
&#13;
<button onclick="upgrade(15, .1,'upgradePCCost', 0)">Upgrade System</button>
- Cost <span id="upgradePCCost">15</span><br/>

<button onclick="upgrade(100, .5,'scriptBotCost', 1)">Script Bot</button>
- Cost <span id="scriptBotCost">100</span><br/>

<script type="text/javascript">
function upgrade(cost, hps, htmlName, id)
{
	upgradeCount = [ 1, 2, 3, 4 ];
	totalHacks = 0;
    /* calc new cost based on quantity currently has */
    var currUpgradeCost = Math.floor(cost * Math.pow(1.1,upgradeCount[id]));

    /* can they afford it? */
    if(totalHacks >= currUpgradeCost)
    {
        /* tally up THIS UPGRADE */
        upgradeCount[id]++;
        /* total the upgrades as a whole */
        totalUpgrades = totalUpgrades + hps;
        /* subtract this cost fro the total hacks so far */
        totalHacks = totalHacks - currUpgradeCost; 
        /* update the HTML */
        document.getElementById('hpc').innerHTML = totalUpgrades.toFixed(1); 
        document.getElementById('totalHacks').innerHTML = totalHacks.toFixed(0); 
    };

    /* calc/display cost for next upgrade */
    var nextCost = Math.floor(cost * Math.pow(1.1,upgradeCount[id])); 
    document.getElementById(htmlName).innerHTML = nextCost; 

};
</script>
&#13;
&#13;
&#13;

我已经运行了您的代码,正如您所看到的那样。如果所有值都正确,则此功能应该起作用。正如您所看到的,我添加了upgradeCount和totalHacks,因此我可以运行代码。但请记住,在你可以对阵列进行数学运算之前,你必须确保其中的所有值都是数字,否则你将得到NaN。

答案 1 :(得分:0)

如果此代码不适合您,则肯定与代码的其他部分相关。 document.getElementById函数需要字符串作为参数,并且你传递一个,所以,我不认为这是问题。类似地,您将字符串赋值给innerHTML属性也需要字符串,但传递数值不会受到影响,因为javascript会将它转换为字符串。所以,你得到NaN(不是数字)的错误与该行没有任何关系:

document.getElementById(htmlName).innerHTML = someVar;

我没有看到你修剪过的代码的其他部分,但我怀疑当你点击按钮时该函数运行,在你的例子中读取值“444”,并传递给你的“myFunction” 。可能你应该在那里寻找错误。

当你陷入困境时,问问自己经典的调试器问题,是什么证明了我的期望是我预期的方式?并找到代码中的行符合您的期望,并检查它是否以它应该的方式运行?

使用你的例子,你将“数字”传递给innerHTML属性,任何你得到NaN错误。所以,问题是,你传递的数字是多少是正确的?如果传递数字,请找到代码的那一部分。

更新:看到代码的其他部分后,看起来你的nextCost变量是NaN,所以你不能将它分配给innerHTML。

nextCost正在使用一些数学计算,这涉及成本,这是数字,考虑到onClick调用,只剩下的是upgradeCount [id]数组/对象,两者都可以,但可能是数组。所以我认为你应该看看你的代码的其他部分,它们形成了upgradeCount数组,并确保index id中的upgradeCount具有数字值。

希望它有所帮助。