JavaScript - 有没有办法(不使用html事件属性)获得3个不同的输入值来贡献一笔金额?

问题描述 投票:0回答:2

我正在完成Brian P. Hogan编写的57本编程练习册。

在大多数这些练习中,我尝试开发GUI。

在下面的练习中,我想计算一段时间内Principal值的简单利息。简单的说:

var yearlyInterest = Principal * (Percentage(whole number) /= 100)

(yearlyInterest * numberOfYears) + Principal

// outputs total amount at the end of investment over a period of however many years

正如您在上面的示例中所看到的,有三个核心输入 - Principal,Percentage和Time。

在创建图形用户界面时,我很难获得所有这些核心输入来同时计算结果。

以下代码仅在输入Time输入的数字后才设计计算结果。 (原谅我糟糕的编码技巧,即全局变量,我只能锻炼12个!)

HTML

<!DOCTYPE html>
<html lang="en">
<body>
    <label for="principal">Principal</label>
    <input type="number" class="principal" style="border-color: black;">

    <label for="percentage">Percentage</label>
    <input type="number" class="percentage" style="border-color: black;">

    <label for="time">Time</label>
    <input type="number" class="time" style="border-color: black;">

    <div id="result"></div>
</body>
<script src="simpleInterest.js"></script>
</html>

JS

var principal = document.getElementsByClassName("principal");
var percentage = document.getElementsByClassName("percentage");
var time = document.getElementsByClassName("time");
var output = document.querySelector("#result");
var result;
var newResult;
var finalOutput;

document.addEventListener('input', function (event) {

    if ( event.target.classList.contains( 'principal' ) ) {
        var newPrincipal = principal[0].value;
        result = newPrincipal;
    }

    if ( event.target.classList.contains( 'percentage' ) ) {
        var newPercentage = percentage[0].value;
        newResult = result * (newPercentage / 100);
    }

    if ( event.target.classList.contains( 'time' ) ) {
        var newTime = time[0].value;
        finalOutput = (newResult * newTime) + Number(result);
    }

    output.innerHTML = `${finalOutput ? finalOutput : ""}`
}, false);

有人可以告诉我一个基于每个输入事件同时计算某事的有效方法,并使用.innerHTML方法输出它吗?

谢谢!

javascript html arrays user-interface
2个回答
1
投票

您需要获取所有输入的值,而不仅仅是用户当前正在输入的值。定义执行此操作的单个函数,并将其添加为所有3个输入的事件侦听器。

var principal = document.querySelector(".principal");
var percentage = document.querySelector(".percentage");
var time = document.querySelector(".time");
var output = document.querySelector("#result");

function calcInterest() {
  var newPrincipal = parseFloat(principal.value);
  var newPercentage = parseFloat(percentage.value);
  var newTime = parseFloat(time.value);
  if (!isNaN(newPrincipal) && !isNaN(newPercentage) && !isNaN(newTime)) {
    var result = newPrincipal + newTime * newPrincipal * newPercentage / 100;
    output.textContent = result;
  }
}

principal.addEventListener("input", calcInterest);
percentage.addEventListener("input", calcInterest);
time.addEventListener("input", calcInterest);
<label for="principal">Principal</label>
<input type="number" class="principal" style="border-color: black;"><br>

<label for="percentage">Percentage</label>
<input type="number" class="percentage" style="border-color: black;"><br>

<label for="time">Time</label>
<input type="number" class="time" style="border-color: black;"><br> Result:
<div id="result"></div>

0
投票

创建要计算的函数,并调用此函数而不是仅执行一些代码。像这样的东西:

var principal = document.getElementsByClassName("principal")
var percentage = document.getElementsByClassName("percentage")
var time = document.getElementsByClassName("time")
var output = document.querySelector("#result")
var result
var newResult
var finalOutput

var calculate = () => {
  var newPrincipal = principal[0].value;
  result = newPrincipal
  var newPercentage = percentage[0].value
  newResult = result * (newPercentage / 100)
  var newTime = time[0].value
  finalOutput = (newResult * newTime) + Number(result)
}

document.addEventListener('input', function (event) {

    if ( event.target.classList.contains( 'principal' ) ) {
        calculate();
    }

    if ( event.target.classList.contains( 'percentage' ) ) {
        calculate();
    }

    if ( event.target.classList.contains( 'time' ) ) {
        calculate();
    }

    output.innerHTML = `${finalOutput ? finalOutput : ""}`
}, false);
© www.soinside.com 2019 - 2024. All rights reserved.