【问题标题】:How can I add an event listener to each button for a table row result?如何为表格行结果的每个按钮添加事件侦听器?
【发布时间】:2016-04-15 16:25:44
【问题描述】:

在我的 rails 应用程序中,我从一个 @results 变量加载一个表,这样每个表行都是一个 @result。对于每个@result 表行,我希望有与@result 相关联的按钮。我正在尝试为每个按钮使用 Javascript 事件监听器,然后在 js.erb 文件中监听事件

在运行应用时,似乎只有第一行按钮有事件监听器,我该如何解决这个问题?

另外,我如何能够将我的 @result 传递给我的 Javascript,以便我可以利用该对象的某些部分?

我正在尝试通过 Javascript 执行此操作,因为我想将某些内容复制到剪贴板并将文件保存到计算机上。

js.erb

var copyTextareaBtn = document.querySelector('.button1');

copyTextareaBtn.addEventListener('click', function(event) {

# work with the @result that was clicked over here
});

html.erb

<% @results.each { |result|  %>
    <tr>
      <td><%= result[:id] %></td>
      <td> 
        <button class="button1"> B1 </button> 
        <button class="button2"> B2 </button> 
        <button class="button3"> B3 </button> 
      </td>
    </tr>

    <% } %>

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax dom-events


    【解决方案1】:

    您确实可以为每个元素添加一个事件侦听器。问题是document.querySelector 将返回第一个匹配的元素。要获得所有这些,您可以使用document.querySelectorAll。我们可以将您的 JavaScript 重写为:

    var btns = document.querySelectorAll('.button1');
    
    Array.prototype.forEach.call(btns, function addClickListener(btn) {
      btn.addEventListener('click', function(event) {
        // code here to handle click
      });
    });
    

    请注意,querySelectorAll 返回一个 NodeList,它类似于一个数组,但不幸的是不是一个数组。所以它没有forEachArray 类上的类似方法。因此,上述工作通过使用来自Array.prototypeforEach 来迭代节点。

    但是,更好的方法是在表单的父元素或容器或文档级别侦听事件。事件冒泡,因此您可以只听一次点击事件并过滤到您想要响应的类型。那将是一个事件侦听器,而不是 N(其中 N 是按钮的数量)。

    【讨论】:

    • 嘿@cymen,感谢您的回答!那么你知道我如何使用与调用的按钮相关联的“@result”吗?
    • @chonglawr 我建议发布另一个问题,但一种方法是在 DOM 按钮元素上放置结果的 id 或其他属性,然后单击时,使用该 id 来确定哪个是点击。还有其他方法,但有很多选择。
    【解决方案2】:

    问题是您增加了每个className 的数字,例如button1button2 并在javascript 中仅调用button1 类,以便调用所有button1,您需要给类button1到 HTML 中的每个按钮。

    编辑:然后尝试下面的代码。

    var button1 = document.getElementsByClassName("button1");
    Object.keys(button1).map( function (key) {
        var button = button1[key] 
        button.addEventListener("click", function(){
            alert("button1")
        });
    });
    

    【讨论】:

    • 这不是问题。我只是没有在我的示例中包含其余按钮。我所拥有的是每个表格行的 3 个按钮,因此有多个按钮 class="button1" 我希望所有类按钮 1 都有一个事件侦听器并在它们被调用时进行侦听,以便我可以用它们做一些事情@结果
    • 让它工作时出现了一些错误,所以我使用了@cymen 的代码。你知道我如何能够引用单击按钮的“@result”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2021-03-21
    • 2015-02-04
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多