为了账号安全,请及时绑定邮箱和手机立即绑定

使用参数将 onlick 事件添加到多个元素

使用参数将 onlick 事件添加到多个元素

白衣染霜花 2022-10-21 17:25:51
我正在动态创建一个元素表并将它们存储在一个数组中。以下内容可能看起来像是一场绝对的噩梦,但这就是我决定对其进行排序的方式。我现在的问题是addEventListener我想添加一个onclick连接到的事件PlayMusic()。我尝试了一个简单的.onclick =并省略了function(){}但随后PlayMusic()立即执行。在function(){}那里,当我单击其中一个元素时,第一个参数 ( i) 是“最后使用的数字”(也就是 21 个元素中的 22 个)。我将如何确保这些onclicks 中的每一个在其参数中都有正确的索引?var thetable = document.getElementById("mustable");for(var i=0; i<fullists.length-1; i++){    fullists[i][2] = [];    fullists[i][3] = [];    for(var j=0; j<fullists[i][1].length; j++)    {        var row = thetable.insertRow();        fullists[i][2][j] = row.insertCell();        fullists[i][2][j].className = "musentry";        var header = fullists[i][0].substring(0,fullists[i][0].lastIndexOf("."));        if(fullists[i][1][j][1] != undefined)            var title = fullists[i][1][j][1];        else            var title = fullists[i][1][j][0].substring(fullists[i][1][j][0].lastIndexOf("/"));        fullists[i][2][j].innerHTML = header + "<br /><b>" + title + "</b>";        fullists[i][2][j].addEventListener("click",function() { PlayMusic(i,j); },false);        fullists[i][3][j] = 0;    }}
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

问题是,当函数执行时,i已经有了不同的值,因为循环已经继续执行。如果您将循环更改为 uselet i而不是var i(same for j) 它将起作用,因为letfor迭代器变量中具有特殊行为,它实际上会在每次迭代时创建范围为循环内部的变量的另一个副本,因此该副本获胜不改变。

另一种方式,基本上是相同的,但明确地完成:首先将它存储在另一个块范围的变量中。例如const i2 = i,然后i2function () {}. 对j.

或者,写.addEventListener(..., PlayMusic.bind(null, i, j)). 你可以从bind一个函数创建一个新函数,其中 athis和 arguments 已经绑定到它。由于绑定立即发生,从而捕获了 and 的当前值ij这也解决了它。


查看完整回答
反对 回复 2022-10-21
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号