如何为表行结果的每个按钮添加事件侦听器
How can I add an event listener to each button for a table row result?
在我的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是按钮的数量)。
问题是,您增加了每个className
(如button1
、button2
)的编号,并在仅javascript的类button1
中调用,以便调用所有button1
,您需要在HTML中为每个按钮指定类button1
。
编辑:然后尝试下面的代码。
var button1 = document.getElementsByClassName("button1");
Object.keys(button1).map( function (key) {
var button = button1[key]
button.addEventListener("click", function(){
alert("button1")
});
});
- 将按钮添加到新元素中
- 使用加号按钮添加多个文本框,并通过PHP提交
- 复选框/单选按钮-添加所选项目的总价
- 将自定义按钮添加到现有网站
- 单击按钮添加HTML表单
- 将sharethis按钮添加到chrome扩展popup.html
- 从自定义DocuSign按钮添加信封自定义字段
- 我尝试将引导下拉按钮添加到 但下拉菜单不起作用.我该怎么做
- 将按钮添加到跨度
- 使用按钮添加到变量
- 单击禁用的按钮添加 CSS
- 将“下一步”和“上一个”按钮添加到较大的图像
- 将下一个和上一个按钮添加到我的图像滑块
- 按React按钮添加行
- 用jQuery点击按钮添加值
- 如何将下一个和上一个按钮添加到图像galary
- 如何为表行结果的每个按钮添加事件侦听器
- 使用setTimeout为按钮添加冷却时间
- 无法向按钮添加属性
- 如何将我的附加按钮添加到这个jQuery mp3播放器中