Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用参数向多个元素添加onlick事件_Javascript_Onclick - Fatal编程技术网

Javascript 使用参数向多个元素添加onlick事件

Javascript 使用参数向多个元素添加onlick事件,javascript,onclick,Javascript,Onclick,我动态地创建一个元素表并将它们存储在一个数组中。下面的内容看起来像是一场噩梦,但这就是我决定对它进行分类的方式。现在我的问题是addEventListener,我想在其中添加一个onclick事件,该事件连接到PlayMusic()。我尝试了一个简单的.onclick=并省略了函数(){},但是播放音乐()会立即执行。如果有函数(){},当我单击其中一个元素时,第一个参数(I)是“使用的最后一个数字”(即21个元素中的22个)。如何确保这些onclicks的参数中都有正确的索引 var thet

我动态地创建一个元素表并将它们存储在一个数组中。下面的内容看起来像是一场噩梦,但这就是我决定对它进行分类的方式。现在我的问题是
addEventListener
,我想在其中添加一个
onclick
事件,该事件连接到
PlayMusic()
。我尝试了一个简单的
.onclick=
并省略了
函数(){}
,但是
播放音乐()
会立即执行。如果有
函数(){}
,当我单击其中一个元素时,第一个参数(
I
)是“使用的最后一个数字”(即21个元素中的22个)。如何确保这些
onclick
s的参数中都有正确的索引

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;
    }
}
var thetable=document.getElementById(“mustable”);

对于(var i=0;i问题在于,在函数执行时,
i
已具有不同的值,因为循环已继续执行。如果将循环更改为使用
,则让i
而不是
var i
(与
j
相同)它会起作用,因为
let
for
迭代器变量中的
有一个循环,它实际上会在每次迭代时在循环内部创建变量的另一个副本,所以副本不会更改

另一种方法,基本上是相同的,但是是明确的:首先将它存储在另一个块作用域变量中。例如,
const i2=i
,然后在
函数(){}
中使用
i2
。对于
j
也是这样

或者,编写
.addEventListener(…,PlayMusic.bind(null,i,j))
。使用
bind
可以从一个函数中创建一个新函数,其中
和参数已绑定到该函数。由于绑定立即发生,因此捕获了
i
j
的当前值,这也解决了该问题