I have three button elements and depending on which button is hovered over I want the text box to have a diffrent text. When not hovering over the buttons text element should have “See details here”. I would like to have 20 buttons is there a better solution than the one below?
var button1 = document.querySelector(".button1");
var button2 = document.querySelector(".button2");
var button3 = document.querySelector(".button3");
var textBox = document.querySelector(".text-box")
button1.addEventListener("mouseover", button1function, false);
button2.addEventListener("mouseover", button2function, false);
button3.addEventListener("mouseover", button3function, false);
button1.addEventListener("mouseout", func1, false);
button2.addEventListener("mouseout", func1, false);
button3.addEventListener("mouseout", func1, false);
function button1function()
{
textBox.innerHTML = "Hovering over button 1"
}
function func1()
{
textBox.innerHTML = "See details here"
}
function button2function()
{
textBox.innerHTML = "Hovering over button 2"
}
function button3function()
{
textBox.innerHTML = "Hovering over button 3"
}.text-box {
width: 400px;
height: 100px;
border: 1px solid blue;
} <div class="button-box">
<button class="button1">Button 1</button>
<button class="button2">Button 2</button>
<button class="button3">Button 3</button>
</div>
<p class="text-box">See details here</p>Advertisement
Answer
Use an object to hold all the messages, and give the elements a data attribute containing the key in the object.
Give all the elements a common class so you can select them and loop over them.
const textBox = document.querySelector(".text-box")
const messages = {
b1: "Hovering over button 1",
b2: "Hovering over button 2",
b3: "Hovering over button 3"
};
document.querySelectorAll('button.msg').forEach(button => {
button.addEventListener("mouseover", e => textBox.innerHTML = messages[e.currentTarget.dataset.msg], false);
button.addEventListener("mouseout", func1, false);
});
function func1() {
textBox.innerHTML = "See details here"
}.text-box {
width: 400px;
height: 100px;
border: 1px solid blue;
}<div class="button-box"> <button class="button1 msg" data-msg="b1">Button 1</button> <button class="button2 msg" data-msg="b2">Button 2</button> <button class="button3 msg" data-msg="b3">Button 3</button> </div> <p class="text-box">See details here</p>