开发者问题收集

无法使用 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>

参见: event.stopPropagation() 不起作用 - 捕获仍然传递函数

Mister Jojo
2020-08-31