JavaScript 如何在一个函数中显示每个按钮
How to display each buttons in one function in JavaScript
所以,我正在尝试构建一个计算器,我要做的第一件事就是在我的输出中显示所有按钮。我创建了一个名为 displayButtons 的函数,在内部,我通过 id 获得了前 2 个按钮,但是,当我尝试显示它们时,只显示数字 2。解决此问题的一种方法是为每个数字创建一个函数,然后它就会起作用,但这不是我想要的。我也试过将每个数字的函数嵌套在一个函数中,但我无法正确地调用它 onclick。有任何想法吗?提前致谢!
HTML代码:
<div id="output"></div>
<div class="numbers">
<button value="1" id="one" onclick="displayButtons()">1</button>
<button value="2" id="two" onclick="displayButtons()">2</button>
JS代码:
function displayButtons() {
var one = document.getElementById("one").value;
document.getElementById("output").innerHTML = one;
var two = document.getElementById("two").value;
document.getElementById("output").innerHTML = two
}
你试过for循环吗?您可以使用闭包或 'let' 关键字或单独的函数来添加点击功能。运行 代码笔中的以下内容,看看它是如何工作的,以及这是否有用。
function createButtons() {
//let is block scoped, not function scoped
for (let i = 1; i <= 5; i++) {
var body = document.getElementsByTagName("BODY")[0];
var button = document.createElement("BUTTON");
button.innerHTML = 'Button ' + i;
button.onclick = function() {
alert('This is button ' + i);
}
body.appendChild(button);
}
}
createButtons();
您必须在 onclick 参数中获取每个按钮的 ID,例如:
onclick=显示按钮(id)
它将为每个按钮创建不同的点击事件然后
function displayButton(id){
let oldValue = document.getElementById("output").innerHtml
document.getElementById("output").innerHTML = oldValue + id;}
对此有多种解决方案,但这里有一个简单的解决方案:
你可以使用事件数据来获取点击按钮的信息,然后你可以用这些值做你想做的事。
HTML
<div id="output"></div>
<div class="numbers">
<button value="1" id="one">1</button>
<button value="2" id="two">2</button>
</div>
JS
document.querySelectorAll('.numbers button').forEach(button => {
button.addEventListener('click', (e) => {
console.log(e.target.id, e.target.value)
})
})
要在点击数字时显示输出,您可以像这样在函数中传入一个 this
对象
<button value="1" id="one" onclick="displayButtons(this)">1</button>
当你点击它时,你会在函数中收到按钮节点
完整代码为
<div class="numbers">
<button value="1" id="one" onclick="displayButtons(this)">1</button>
<button value="2" id="two" onclick="displayButtons(this)">2</button>
</div>
<script>
function displayButtons(button) {
document.getElementById("output").innerHTML += button.value
}
</script>
你一直在覆盖 innerHTML
,这就是你只看到 2 的原因。
我建议你改变你的方法。您所有的按钮都在 div.numbers
中。向数字 div 添加单击事件侦听器。如果按下任何按钮,此事件侦听器将触发,因为单击事件会冒泡。这称为事件委托。
在点击事件处理程序中,您可以看到哪个按钮被点击,并将被点击按钮的value
添加到div#output
。
const output = document.querySelector('#output');
const numbers = document.querySelector('.numbers');
numbers.addEventListener('click', ({ target }) => {
if (!target.hasAttribute('value')) {
return;
}
output.textContent += target.value;
});
<div id="output"></div>
<div class="numbers">
<button value="1">1</button>
<button value="2">2</button>
<button value="3">3</button>
<button value="4">4</button>
<button value="5">5</button>
</div>
每次按下按钮时,都会覆盖整个 innerHTML,因此会用新内容替换整个内容。
您应该改为附加值,使用 += 运算符
另外你可以考虑用innerText代替innerHTML,用addEventListener代替onclick=
<div id="output"></div>
<div class="numbers">
<button value="1" id="one">1</button>
<button value="2" id="two">2</button>
</div>
...以及之后...
<script>
document.querySelector(".numbers").addEventListener('click', e => {
if( e.target.nodeName === "BUTTON" )
document.getElementById("output").innerText += e.target.value;
});
</script>
所以,我正在尝试构建一个计算器,我要做的第一件事就是在我的输出中显示所有按钮。我创建了一个名为 displayButtons 的函数,在内部,我通过 id 获得了前 2 个按钮,但是,当我尝试显示它们时,只显示数字 2。解决此问题的一种方法是为每个数字创建一个函数,然后它就会起作用,但这不是我想要的。我也试过将每个数字的函数嵌套在一个函数中,但我无法正确地调用它 onclick。有任何想法吗?提前致谢!
HTML代码:
<div id="output"></div>
<div class="numbers">
<button value="1" id="one" onclick="displayButtons()">1</button>
<button value="2" id="two" onclick="displayButtons()">2</button>
JS代码:
function displayButtons() {
var one = document.getElementById("one").value;
document.getElementById("output").innerHTML = one;
var two = document.getElementById("two").value;
document.getElementById("output").innerHTML = two
}
你试过for循环吗?您可以使用闭包或 'let' 关键字或单独的函数来添加点击功能。运行 代码笔中的以下内容,看看它是如何工作的,以及这是否有用。
function createButtons() {
//let is block scoped, not function scoped
for (let i = 1; i <= 5; i++) {
var body = document.getElementsByTagName("BODY")[0];
var button = document.createElement("BUTTON");
button.innerHTML = 'Button ' + i;
button.onclick = function() {
alert('This is button ' + i);
}
body.appendChild(button);
}
}
createButtons();
您必须在 onclick 参数中获取每个按钮的 ID,例如: onclick=显示按钮(id) 它将为每个按钮创建不同的点击事件然后
function displayButton(id){
let oldValue = document.getElementById("output").innerHtml
document.getElementById("output").innerHTML = oldValue + id;}
对此有多种解决方案,但这里有一个简单的解决方案: 你可以使用事件数据来获取点击按钮的信息,然后你可以用这些值做你想做的事。
HTML
<div id="output"></div>
<div class="numbers">
<button value="1" id="one">1</button>
<button value="2" id="two">2</button>
</div>
JS
document.querySelectorAll('.numbers button').forEach(button => {
button.addEventListener('click', (e) => {
console.log(e.target.id, e.target.value)
})
})
要在点击数字时显示输出,您可以像这样在函数中传入一个 this
对象
<button value="1" id="one" onclick="displayButtons(this)">1</button>
当你点击它时,你会在函数中收到按钮节点 完整代码为
<div class="numbers">
<button value="1" id="one" onclick="displayButtons(this)">1</button>
<button value="2" id="two" onclick="displayButtons(this)">2</button>
</div>
<script>
function displayButtons(button) {
document.getElementById("output").innerHTML += button.value
}
</script>
你一直在覆盖 innerHTML
,这就是你只看到 2 的原因。
我建议你改变你的方法。您所有的按钮都在 div.numbers
中。向数字 div 添加单击事件侦听器。如果按下任何按钮,此事件侦听器将触发,因为单击事件会冒泡。这称为事件委托。
在点击事件处理程序中,您可以看到哪个按钮被点击,并将被点击按钮的value
添加到div#output
。
const output = document.querySelector('#output');
const numbers = document.querySelector('.numbers');
numbers.addEventListener('click', ({ target }) => {
if (!target.hasAttribute('value')) {
return;
}
output.textContent += target.value;
});
<div id="output"></div>
<div class="numbers">
<button value="1">1</button>
<button value="2">2</button>
<button value="3">3</button>
<button value="4">4</button>
<button value="5">5</button>
</div>
每次按下按钮时,都会覆盖整个 innerHTML,因此会用新内容替换整个内容。
您应该改为附加值,使用 += 运算符
另外你可以考虑用innerText代替innerHTML,用addEventListener代替onclick=
<div id="output"></div>
<div class="numbers">
<button value="1" id="one">1</button>
<button value="2" id="two">2</button>
</div>
...以及之后...
<script>
document.querySelector(".numbers").addEventListener('click', e => {
if( e.target.nodeName === "BUTTON" )
document.getElementById("output").innerText += e.target.value;
});
</script>