无法使用 DOM 获取值
2020-08-31
428
我是 Javascript 新手,正在学习构建计算器作为我的第一个项目。我不明白为什么我无法从显示中获取值以通过 DOM 传递到函数。我看过其他具有类似实现的示例,但不明白为什么我的不起作用。有人能帮我解释一下吗?
HTML:
<form class="output-wrapper" name="output-wrapper">
<input type="text" name="display" disabled>
<div class="calc-btn-wrapper">
<div class="nmb-btn container">
<button type="button" value="1" onclick="calcfunc(1)">1</button>
<button type="button" value="2" onclick="calcfunc(2)">2</button>
<!-- ... -->
<!-- ... -->
</form>
JavaScript:
function calcfunc (num){
var display = document.form['output-wrapper']['display'].value;
if (display ==="" || display===0){
let newvalu = display+num;
document.form['output-wrapper']['display'].value=newvalu;
};
3个回答
-
应为
document.forms
(复数!) -
输入值始终为字符串!使用
parseFloat()
和parseInt()
将字符串转换为所需值。
function calcfunc(num) {
var display = parseFloat(document.forms['output-wrapper']['display'].value) || 0;
let newvalu = display + num;
document.forms['output-wrapper']['display'].value = newvalu;
}
<form class="output-wrapper" name="output-wrapper">
<input type="text" name="display" disabled>
<div class="calc-btn-wrapper">
<div class="nmb-btn container">
<button type="button" value="1" onclick="calcfunc(1)">1</button>
<button type="button" value="2" onclick="calcfunc(2)">2</button>
</div>
</div>
</form>
无论如何,您应该使用 class、ID 和 data-* 属性,并尽量不要使用内联 JavaScript 处理程序,就像您(希望)不使用内联 CSS 一样。JS 应该只放在一个地方,易于调试 - 那就是您的标签脚本文件。
const EL = document.querySelector("#calculator");
const EL_display = EL.querySelector("#display");
const ELS_int = EL.querySelectorAll("[data-int]");
function calcfunc() {
const int = parseInt(this.dataset.int);
const display = parseFloat(EL_display.value) || 0;
const newValue = int + display; // ...only adding? :)
EL_display.value = newValue;
}
ELS_int.forEach(btn => btn.addEventListener("click", calcfunc));
<form id="calculator">
<input type="text" id="display" disabled>
<div class="calc-btn-wrapper">
<div class="nmb-btn container">
<button type="button" data-int="1">1</button>
<button type="button" data-int="2">2</button>
</div>
</div>
</form>
Roko C. Buljan
2020-08-31
您的实现存在一些问题。
您的输入字段已禁用。因此用户无法修改它。
<input type="text" name="display" disabled>
此外,请考虑改用数字类型。请记住,文本类型将返回一个字符串,因此您需要将其转换为整数或浮点数。
<input type="text" type="text" name="display" disabled>
另一个问题是 output-wrapper 不是表单。它是一个 div。因此,当表单是 div 时,您无法使用 javascript 来索引表单。
这里有一个想法,向您展示如何添加 2 个数字。还向您展示了如何获取和设置值,而不是尝试在 click 方法参数中传递它们。
-
function add() {
let inputA = document.getElementById("inputA");
let inputB = document.getElementById("inputB");
let inputC = document.getElementById("result");
inputC.value = parseInt(inputA.value) + parseInt(inputB.value);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form class="output-wrapper" name="output-wrapper">
<input type="text" id="inputA" name="inputA">
<input type="text" id="inputB" name="inputB">
<input type="text" id="result" name="result">
<div class="calc-btn-wrapper">
<div class="nmb-btn container">
<button type="button" value="1" onclick="add()">Add</button>
</div>
</div>
</form>
AHT Cloud
2020-08-31
更简单的是使用事件委托:
const zDisplay = document.getElementById('display')
, zButtons = document.querySelector('div.nmb-btn')
;
zButtons.onclick =e=>
{
if (!e.target.matches('button[data-int]')) return
zDisplay.value += e.target.dataset.int
}
<input type="text" id="display" disabled>
<div class="calc-btn-wrapper">
<div class="nmb-btn container">
<button data-int="1">1</button>
<button data-int="2">2</button>
</div>
</div>
Mister Jojo
2020-08-31