javascript - HTML Button onclick 调用了错误的函数
问题描述
我制作了一个 html 文档,它基本上是一个将十进制数转换为二进制数的程序。有用。我添加了一个“反向”按钮,它会做相反的事情(将二进制转换为十进制),并且由于某种原因它运行应该由“转换”按钮运行的代码。这是代码:
function decimalToBinary() {
document.getElementsByClassName('inputBox')[0].placeholder = 'Enter decimal number'
alert('Hello')
}
function binaryToDecimal() {
document.getElementsByClassName('inputBox')[0].placeholder = 'Enter binary number'
alert('Hi')
}
function reverse() {
if (document.getElementById('decimalNumber').placeholder === 'Enter decimal number') {
document.getElementById('convertButton').onclick = binaryToDecimal()
} else if (document.getElementById('decimalNumber').placeholder === 'Enter binary number') {
document.getElementById('convertButton').onclick = decimalToBinary()
}
}
<input type="number" class="inputBox" id="decimalNumber" placeholder="Enter decimal number" min="0" step="0.0001">
<button id="convertButton" class="button hoverTurquoise" onclick="decimalToBinary()">Convert</button>
<button class="button hoverTurquoise reverse" onclick="reverse()">Reverse</button>
(我替换了所有将数字转换为警报消息的代码,以便更容易理解)
如果有人对如何解决此问题有任何想法,请告诉我。谢谢
解决方案
在 JavaScript 中,函数就是数据——您可以将它们称为数据。在您的代码中,当您应该以这种方式引用它们时,您将添加()
到函数名称的末尾,从而调用该函数,而不是引用它。
因此,您的函数实际上正在立即执行(在任何人单击任何按钮之前),并且它们的返回值(什么都没有)是被分配为onclick
属性值的值。因此,您的“反向”按钮reverse()
在您单击它时确实会调用该函数,但onclick
您在该函数中所做的分配实际上并未将onclick
属性设置为任何内容。
您的代码应该是:
if (document.getElementById('decimalNumber').placeholder === 'Enter decimal number') {
document.getElementById('convertButton').onclick = binaryToDecimal;
} else if (document.getElementById('decimalNumber').placeholder === 'Enter binary number') {
document.getElementById('convertButton').onclick = decimalToBinary;
}
现在,虽然使用内联 HTML 事件属性onclick
设置事件处理程序(例如将事件处理程序设置为 JavaScript 对象属性)可以工作,但它们都是非常古老的技术,具有很大的缺点。阅读本文以了解为什么您真的不应该使用内联 HTML 事件属性。而且,就事件属性而言,它们的缺点是您不能将多个事件处理程序分配给同一个对象事件。
使用现代的、基于标准的方法,而不是这些传统技术中的任何一种.addEventListener()
。
最后一件事,避免反复扫描文档以寻找相同的元素,这只是浪费资源。
这是您的代码重新设计以使用它,您会看到它有多干净。
// Get references to the elements you'll need to use more than once:
let btnConvert = document.getElementById('convertButton');
let btnReverse = document.querySelector("button.reverse");
let input = document.getElementById("decimalNumber");
// Now, set up event handlers for the buttons the modern way
// (notice there are no () after the function names because we
// don't want to invoke them right now, we only want to refer to them.)
btnConvert.addEventListener("click", decimalToBinary);
btnReverse.addEventListener("click", reverse);
function decimalToBinary() {
input.placeholder = 'Enter decimal number';
}
function binaryToDecimal() {
input.placeholder = 'Enter binary number';
}
function reverse() {
if (input.placeholder === 'Enter decimal number') {
// We can also remove event handlers in much the same way as when we add them:
btnConvert.removeEventListener("click", decimalToBinary);
btnConvert.addEventListener("click", binaryToDecimal);
} else {
btnConvert.removeEventListener("click", binaryToDecimal);
btnConvert.addEventListener("click", decimalToBinary);
}
}
<input type="number" class="inputBox" id="decimalNumber" placeholder="Enter decimal number" min="0" step="0.0001">
<!-- Don't set up event handlers in HTML -->
<button id="convertButton" class="button hoverTurquoise">Convert</button>
<button class="button hoverTurquoise reverse">Reverse</button>
推荐阅读
- r - 计算推文中的关键字和词干
- php - 为什么我应该在 Laravel 中同时使用特征和服务?
- datagridview - VBNet DataGridView 显示 SQL DB - 日期/时间格式不起作用
- python-3.x - fastai ImportError:文件太短
- c# - 在 C# 中将 XML 转换为 JSON 时如何保留布尔值?
- python - 尝试编写一个函数,该函数将列表中的所有值相加,除了最小的数字
- html - HTML/CSS 中的播放按钮对齐问题
- java - 如何清除掩码格式的 Jformattedtextfield
- r - 使用 `assign()` 为列表项赋值
- linux - 使用断点和符号调试时出现 Gdb 问题