javascript - 如何为表行结果的每个按钮添加事件监听器?

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

在我的 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>

    <% } %>

最佳答案

您确实可以向每个元素添加事件监听器。问题是 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,它类似于数组,但不幸的是它不是数组。因此它没有 forEach 以及在 Array 类中找到的类似方法。因此,上面的工作是通过使用 Array.prototype 中的 forEach 来迭代节点。

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

关于javascript - 如何为表行结果的每个按钮添加事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652336/

相关文章:

javascript - 我的 View 似乎没有看到我的css,js。我使用 spring boot 和 thymeleaf

Jquery 使用每个迭代器

javascript - 淡入淡出多个元素

javascript - 如何使用jquery打印隐藏的div内容?

ruby-on-rails - 保持 Web 应用程序配置的最佳方法是什么?

ruby-on-rails - 在 Controller 操作之间共享一个 Net::IMAP 连接

javascript - 关于javascript对象的问题

javascript - Jasmine 在 d3 中测试鼠标悬停事件

javascript - 如何从多页应用程序迁移到 Piral

ruby-on-rails - Rails rake 数据库 :schema:load fails with new database