3 回答
TA贡献1811条经验 获得超5个赞
您这样做的方式绝对不是 DRY,但要解决您的问题,您只需确保将数值(以数字表示)与字符串值(以字符数为单位)进行比较。
所以statsRemaining[0].value应该是Number(statsRemaining[0].value)
编辑
我附上了一个更好的方法来做你正在寻找的无限扩展(你不必为更多属性添加更多统计状态等)
这是小提琴:https ://jsfiddle.net/jrhager84/5xvzmnc6/42/
// stats
const str = document.getElementsByName('str');
const dex = document.getElementsByName("dex");
const vit = document.getElementsByName("vit");
const ene = document.getElementsByName("ene");
const statsRemaining = document.getElementsByName("statsRemaining");
function statDist(elem, shouldAdd)
{
var selected = elem.parentNode.getElementsByClassName("stat")[0];
if (shouldAdd && Number(statsRemaining[0].value) > 0)
{
selected.value++
statsRemaining[0].value--;
} else if (!shouldAdd && Number(selected.value) > 0)
{
statsRemaining[0].value++;
selected.value--;
} else
{
alert("No more skill points!");
}
}
function resetStats() {
str[0].value = str[0].defaultValue;
dex[0].value = dex[0].defaultValue;
vit[0].value = vit[0].defaultValue;
ene[0].value = ene[0].defaultValue;
statsRemaining[0].value = statsRemaining[0].defaultValue;
}
<div class="stat-card">
<p>Strength</p>
<input class="stat" type="number" value="85" name="str" id="str" readonly /><span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,true)">+</span> <span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,false)">-</span>
</div>
<div class="stat-card">
<p>Dexterity</p>
<input class="stat" type="number" value="25" name="dex" id="dex" readonly /><span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,true)">+</span> <span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,false)">-</span>
</div>
<div class="stat-card">
<p>Vitality</p>
<input class="stat" type="number" value="15" name="vit" id="vit" readonly /><span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,true)">+</span> <span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,false)">-</span>
</div>
<div class="stat-card">
<p>Energy</p>
<input class="stat" type="number" value="10" name="ene" id="ene" readonly /><span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,true)">+</span> <span style="font-size: 26px;cursor:pointer;" onclick="statDist(this,false)">-</span>
</div>
<br><br>
<p>Stat points remaining: <input style="width: 42px;" type="number" name="statsRemaining" value="10" readonly /></p><br>
<input type="button" name="reset" value="Reset Stats" onclick="resetStats()" />
这是在 vanilla JS 中完成的,如果您使用 jQuery,则不必向<div>统计信息添加类和 s 以使定位方式更容易。
这是香草JS方式:
<div>为每个统计数据创建一个元素。添加类名'stat',以便您可以使用js定位父<div>级,然后找到它的子级名'stat'。onclick 发送到相同的函数,而不是单独的函数。您使用
this这样函数就知道哪个this在说话,并且您使用布尔值来判断它是否应该加法或减法。所以如果你添加onclick="statDist(this,true)",那就是告诉函数'这个按钮调用了函数,所以找到它的父div。抓住输入类并使用它。然后,下一个参数是布尔值,它告诉函数您是要加点还是减点。在函数内部,您必须主要状态:
shouldAdd和!shouldAdd. 所以它基本上是两个功能合二为一。如果任何一个用完点,else 语句就会触发。如果您愿意,您显然可以在此基础上进行构建。
TA贡献2012条经验 获得超12个赞
这不起作用的原因是因为每个函数内部的大于/小于比较是将字符串值与另一个字符串值进行比较。来自 DOM 的文本输入元素的值是字符串。当您在 JavaScript 中比较两个字符串时,它使用“字典式”比较(如果您好奇,请参阅此处了解其工作原理)。简而言之,字符串“100”不大于 JavaScript 中的字符串“85”。这个问题很容易解决 - 只需通过调用 Number() 将输入字符串值转换为数字。例如:
function removeStr() {
const strInput = str[0];
const remainingDisplay = statsRemaining[0];
let str = Number(strInput .value);
let initialStr = Number(strInput.defaultValue);
let statsRemaining = Number(remainingDisplay.value)
if (str > initialStr) {
strInput.value = str - 1;
remainingDisplay .value = statsRemaining - 1;
}
}
另一个提示:您可以通过为每个输入元素分配一个 id 然后使用 document.getElementById('inputId') 而不是使用 getElementsByName 来避免所有这些数组 [0] 位置。
TA贡献1890条经验 获得超9个赞
注意:仅对第一个“str”命名元素执行此操作。
好吧,我在小提琴的代码上尝试了这个简单的东西,它奏效了。
function removeStr() {
console.log("Def:"+str[0].defaultValue);
console.log("val:"+str[0].value);
if (parseInt(str[0].value) > parseInt(str[0].defaultValue)) { **-> HERE**
str[0].value--;
statsRemaining[0].value++;
}
}
在这里查看。

如上所示,我将值增加到 100,而不是减去到 100 以下。
添加回答
举报
