我会写一个快速的解决方案,然后解释我为什么这样做。
建议的解决方案
第 1 部分,HTML
<div id="tip-wrapper">
<label for="bill">Total bill:</label>
<input name="bill" id="bill" type="text">
<br/>
<label for="tipratio">Tip ratio:</label>
<button name="tipratio" value="15" type="button">15%</button>
<button name="tipratio" value="18" type="button">18%</button>
<button name="tipratio" value="20" type="button">20%</button>
<div id="final-value">You owe...</div>
</div>
第 2 部分,JavaScript
var parent = document.getElementById('tip-wrapper'),
buttons = parent.getElementsByTagName('button'),
max = buttons.length,
i;
// function that handles stuff
function calculate (e) {
var bill = document.getElementById('bill'),
tipRatio = e.target.value;
document.getElementById('final-value').textContent = bill.value * (1+tipRatio/100);
}
// append event listeners to each button
for(i = 0; i < max; i++) {
buttons[i].addEventListener('click', calculate, true);
}
解释
关于 HTML,没有“太多”变化。唯一的事情是我使用的是更符合标准的东西。
我添加了一个 wrapper 元素,这只是为了隔离一些 DOM 遍历,而不是通过整个文档对象来进行查找(这将加快您的脚本速度)。
您的按钮使用“值”属性,这是最好的。由于您可以以一种方式显示按钮文本,但使用适当的值(请参阅我添加了 % 个字符)。
除此之外,我主要添加了适当的标识符和标签。
JavaScript,这里我会更详细一点,我会一步一步来:
- 您想要在脚本中做的第一件事是设置您需要的变量(并获取您将使用的 DOM 元素。这就是我在前 4 行代码中所做的。李>
- 创建一个通用函数来处理您的计算并更新您的元素,无论它们的数值如何。我在这里使用的功能是为您的函数添加一个参数 (e),因为 javascript 中的 EVENTS 将一个 EVENT OBJECT 附加到您的回调函数(在本例中为
calculate();)。 EVENT OBJECT 实际上有很多有用的属性,我使用了这些属性:
target:这是触发事件的元素(即您的一个按钮)
我们所要做的就是获取目标的值 (e.target.value) 并在返回最终账单的数学中使用它。
- 使用 addEventListener。人们普遍认为您应该将 JavaScript 保留在 HTML 之外,因此不鼓励使用旧的事件方法 (onclick="")。
addEventListener() 方法并不太复杂,不细说它的工作原理如下:
- htmlObject.addEventListener('事件类型', '回调函数', '气泡真/假');
我所做的只是遍历所有按钮并附加事件 lsitener。
结语
使用此脚本,您现在可以添加任何您想要的“按钮”,该脚本会将它们全部考虑在内并进行相应调整。只需确保设置它们的“值”即可。
在我写这篇文章的时候,有几个人给出了一些快速的答案。我还不能发表评论(声誉低),所以我会把我的 cmets 留在这里。
一些建议的答案告诉您使用 innerHTML 来获取小费值。这是错误的,您正在使用表单字段并且应该使用 element.value 这就是它的用途。
有些人甚至敢说使用 HTML5 data-* 属性。当然,你可以。但你为什么要? HTML 和 DOM 已经提供了所有必要的工具来完成您的任务,而无需使用不必要的属性来污染您的 HTML。 value="" 属性用于表单,它应该用于字段值的 data-* 属性。
作为一般说明,innerHTML 旨在获取 HTML,不一定是文本或值。还有其他方法可以获取您正在寻找的值。对于表单元素,它是 element.value,对于大多数其他 HTML 元素,它是 element.textContent。
希望这些解释有所帮助