单个onclick函数用于具有类似id模式的按钮 - JavaScript

时间:2017-08-18 09:36:40

标签: javascript onclick addeventlistener

我想减少代码。

function one() {
 console.log("hai");
}

document.getElementById('dealsButton_1').onclick = one;
document.getElementById('dealsButton_2').onclick = one;
//I  want the above 2 lines of code reduced to one.

单击此功能可以点击' dealsButton _ *'图案的id元素。我怎样才能做到这一点。 元素是动态加载的

4 个答案:

答案 0 :(得分:4)

您可以使用querySelectorAll选择器 [id^=dealsButton_]在一行中添加事件监听器 - 请参阅下面的演示:



function one() {
 console.log("hai");
}

Array.prototype.forEach.call(
  document.querySelectorAll('[id^=dealsButton_]'), function(e) {
  e.addEventListener('click', one);
});

<div id="dealsButton_1">one</div>
<div id="dealsButton_2">two</div>
&#13;
&#13;
&#13;

如果标记是动态加载,您可以基础静态元素上 ,如下所示:

&#13;
&#13;
function one() {
  console.log("hai");
}

document.addEventListener('click', function(e) {
  if (e.target && /^dealsButton_/.test(e.target.id))
    one();
})

// dynamically add
document.body.innerHTML = `<div id="dealsButton_1">one</div>
<div id="dealsButton_2">two</div>`;
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你在寻找这样的东西:

function onClick(){
  //single handler
}

$('[id*="dealsbutton_"]').click(onClick)

答案 2 :(得分:0)

这是一个解决方案,您可以根据需要选择ID名称,而无需使用特定的名称模式。

<html>
  <body>
    <div id="abc">one</div>
    <div id="def">two</div>

    <script type="text/javascript">
      function one() {
       console.log("hai");
      }

      function addOnclickFunc (func, idArray){
        idArray.forEach(function(element) {
          document.getElementById(element).onclick = func;
        })
      }

      addOnclickFunc(one,["abc","def"])
    </script>
  </body>
</html>

答案 3 :(得分:-1)

你将jQuery与regex用于此

$.each( $("button[id^='dealsButton_']"), function () {
 $(this).on('click', function(){
  //code here
 })
});

如果想动态调用函数调用名称。将它作为数据属性传递给button元素并使用eval函数调用它

<button id="dealButton_1" data-click="one"></button>

$.each( $("button[id^='dealsButton_']"), function () {
 $(this).on('click', function(){
   var function_call = $(this).attr('data-click')
   eval(function_call)
 })
});