多个具有相同类的按钮的Javascript点击事件

4

我正在构建一个网站,有几个按钮,其中某些按钮具有一种类别,而其他按钮则具有另一种类别。我想做的是找到最佳方法来查找被点击的按钮,而不必为每个单独的按钮添加事件侦听器。我已经想出了以下两个for循环,以查找所有带有class button-1和class button-2的按钮。作为一个相对新手的javascript程序员,我不想养成不良习惯,因此希望能得到任何关于实现此目标的最佳建议。

<section>
  <div class="button--1"></div>
  <div class="button--1"></div>
  <div class="button--2"></div>
</section>

<section>
  <div class="button--2"></div>
  <div class="button--1"></div>
  <div class="button--2"></div>
</section>

 var button1 = document.querySelectorAll('.button--1');
    var button2 = document.querySelectorAll('.button--2');

    for (var a = 0; a < button1.length; a++) {    
        button1[a].addEventListener('click',function(){
            //do something
        });
    }

    for (var b = 0; b < button2.length; b++) {
        button1[b].addEventListener('click',function(){
            //do something
        });
    }

我在这里找不到任何按钮。 - Harsh Patel
5个回答

7
如果您计划有多个其他类似于button--3...4 ... ...15的类,
您必须要针对所有以“button”开头(^=)的div元素进行定位:

(请注意,您也可以在CSS中完成这项任务!)

var allButtons = document.querySelectorAll('div[class^=button]');
console.log("Found", allButtons.length, "div which class starts with “button”.");

for (var i = 0; i < allButtons.length; i++) {
  allButtons[i].addEventListener('click', function() {
    console.clear();
    console.log("You clicked:", this.innerHTML);
  });
}
/* Some styling */

section {
  margin: 8px 0;
  border: 1px solid gray;
}

section div {
  border: 1px solid lightgray;
  display: inline-block;
  margin-left: 8px;
  padding: 4px 8px;
  width: 30px;
}

section div[class^=button] {
  background: lightgray;
  cursor: pointer;
}
<span>You can click on the buttons:</span>
<section>
  <div class="button--1">s1-1</div>
  <div class="button--2">s1-2</div>
  <div class="button--3">s1-3</div>
  <div class="button--4">s1-4</div>
</section>
<section>
  <div class="button--1">s2-1</div>
  <div class="button--2">s2-2</div>
  <div class="button--3">s2-3</div>
  <div class="button--4">s2-4</div>
</section>
<section>
  <div class="not-a-button">not1</div>
  <div class="not-a-button">not2</div>
  <div class="not-a-button">not3</div>
  <div class="not-a-button">not4</div>
</section>

希望它有所帮助。

3
尝试使用事件委托技术:event delegation

(function() {
  document.body.addEventListener("click", clickButtons);
  // ^ one handler for all clicks

  function clickButtons(evt) {
    const from = evt.target;
    console.clear();
    if (!from.className || !/button--\d/i.test(from.className)) { return; }
    // ^check if the element clicked is one of the elements you want to handle 
    //  if it's not one of the 'buttons', do nothing
    console.log("you clicked " + from.classList);
  }
}())
.button--1:before,
.button--2:before {
  content: 'BTTN['attr(class)']';
}

.button--1,
.button--2 {
  border: 1px solid #999;
  background: #eee;
  width: 220px;
  padding: 3px;
  text-align: center;
}
<section>
  <div class="b1 button--1 section1"></div>
  <div class="b2 button--1 section1"></div>
  <div class="b3 button--2 section1"></div>
</section>

<section>
  <div class="b4 button--2 section2"></div>
  <div class="b5 button--1 section2"></div>
  <div class="b6 button--2 section2"></div>
</section>


我一定会仔细研究这个。感谢提供链接和代码片段。 - Liam

1

我的建议是使用jQuery,这样你可以像这样做:

$(document).on('click', '.button--1', function() {
   // Do something
});

$(document).on('click', '.button--1', function() {
   // Do something
})

但是对于纯JavaScript来说,一种清晰的方法是创建一个函数来绑定事件的回调。

function bindEvent(callback, eventType, targets) {
   targets.forEach(function(target) {
     target.addEventListener(eventType, callback);
   });
};


var button1 = document.querySelectorAll('.button--1');
var button2 = document.querySelectorAll('.button--2');

bindEvent(function() {
   // do something
}, 'click', button1);

bindEvent(function() {
   // do something
}, 'click', button2);

1

您可以使用多个选择器在querySelectorAll()字符串中,通过使用,进行分隔。

var button1 = document.querySelectorAll('.button--1');
var button2 = document.querySelectorAll('.button--2');
var allButtons = document.querySelectorAll('.button--1, .button--2');

console.log(button1.length);
console.log(button2.length);
console.log(allButtons.length);
<section>
  <div class="button--1"></div>
  <div class="button--1"></div>
  <div class="button--2"></div>
</section>

<section>
  <div class="button--2"></div>
  <div class="button--1"></div>
  <div class="button--2"></div>
</section>


0

click 事件在单个元素上按下并释放指针设备按钮(通常是鼠标的主按钮)时触发。

此文档将帮助您了解它的工作原理 MDN - Click event


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接