【问题标题】:How can I set a global click listener to grab the value from many buttons?如何设置全局单击侦听器以从许多按钮中获取值?
【发布时间】:2019-01-17 08:48:08
【问题描述】:

我有一组按钮,每个按钮都有不同的值。 我需要添加一个事件监听器来监听它何时被点击。 单击的按钮的值将被推送到不同的数组中。

我觉得我需要forEach,但不太适合。

function placeBet() {
  var betBtn_nodelist = document.querySelectorAll('.bet_amount > button');
  var betButtonsArr = Array.prototype.slice.call(betBtn_nodelist);

  for (var i = 0; i < betButtonsArr.length; i++) {
    betButtonsArr[i];
  }
}
<div class="bet_amount">
  <button class="five" value="5">5</button>
  <button class="ten" value="10">10</button>
  <button class="fifty" value="50">50</button>
  <button class="hundred" value="100">100</button>
</div>

【问题讨论】:

    标签: javascript html css arrays button


    【解决方案1】:

    您必须为array 中的每个项目附加一个click 事件处理程序。

    result = [];
    function placeBet(){
        var betBtn_nodelist = document.querySelectorAll('.bet_amount > button');
        var betButtonsArr = Array.prototype.slice.call(betBtn_nodelist);
        for (let i = 0; i < betButtonsArr.length; i++) {
           betButtonsArr[i].onclick = function(){
             result.push(this.value);
             console.log(result);
           }
        }
    }
    placeBet();
    <div class="bet_amount">
        <button class="five" value="5">5</button>
        <button class="ten" value="10">10</button>
        <button class="fifty" value="50">50</button>
        <button class="hundred" value="100">100</button>
    </div>

    【讨论】:

    • 啊,我明白了,我可能需要阅读更多关于“这个”的信息。不知道它的范围如何。现在将使用它,因为它是香草 JS。谢谢!
    【解决方案2】:

    您可以使用 jquery 做到这一点:

    var values = []
    $(document).on('click', 'button', function() {
      values.push(this.value)
      console.log(values)
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
    <div class="bet_amount">
      <button class="five" value="5">5</button>
      <button class="ten" value="10">10</button>
      <button class="fifty" value="50">50</button>
      <button class="hundred" value="100">100</button>
    </div>

    【讨论】:

    • 我不是那么反对吗?无论哪种方式,我都在寻找一个普通的 JS 解决方案。
    • @Daniel 你没有在你的问题中指定你正在寻找一个普通的 js 解决方案,无论如何都认为它是一个可能的 jquery 解决方案:-)
    【解决方案3】:

    如何设置全局点击监听器来获取值?

    是的,您必须为一个对象中的所有按钮设置一个全局点击监听器 - &lt;div class="bet_amount"&gt;。如果您为每个按钮设置一个单击侦听器,则对浏览器性能不利。

    使用e.target.nodeName == 'BUTTON',您可以识别"bet_amount" 类元素内的按钮点击。

    var result = [];
    
    function placeBet()
    {
        var betAmount = document.querySelector('.bet_amount');
        betAmount.onclick = function(e)
        {
            if(e.target.nodeName == 'BUTTON')
            {
                result.push(+e.target.value); //"+" is converting to integer
                console.log(result.join(','))
            }
        };
    }
    placeBet();
    <div class="bet_amount">
        <button class="five" value="5">5</button>
        <button class="ten" value="10">10</button>
        <button class="fifty" value="50">50</button>
        <button class="hundred" value="100">100</button>
    </div>

    【讨论】:

    • @Daniel,如果您的网站上有多个 bet_amount 元素并且您不知道如何为所有这些元素编写它,请询问我。
    • 我改变了方法并使用了一个 for 循环来监听每个按钮上的点击事件。之后我使用了“betAmount += +this.value;”返回一个整数以便于计算。这样点击的下注金额也会加在一起!非常感谢!
    • @Daniel,我想你不明白我写了什么。最初使用我的代码时,您不需要循环,并且您的侦听器仅在一个对象上。这意味着您的代码更快。如果您的页面上有更多的听众,这一点非常重要,因为每个听众都需要计算机内存,这是一个额外的过程。阅读this article 了解此内容。而this.value 不是整数!它是一个字符串。您可以使用每个数学运算将其转换为整数。例如。 this.value * 1。或者使用两个字符串:"15" + "15" = 30
    • @Daniel,在我的情况下,我将值转换为整数,如+e.target.value(数学运算)。在你的情况下,它是+this.value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2011-12-02
    • 2019-06-28
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多