我正在尝试为某种类型的项目分配onclick功能。所以,在for循环中我有if(invType[i] != "empty")
然后在if语句中我有
if(invType[i] == "usable"){
(function(num) {
document.getElementById(num).onclick = function(){useItem(invName[num],num)};
})(i);
}
只有最后一个"usable"
对象才能获得onclick功能。每个人都会将我与this question联系起来,但这对我没有帮助。我已经尝试了一切,但我无法弄明白。有人可以给我一个更好的解释,说明这些意味着什么,以及如何让我的代码工作?
这里是添加所有按钮的完整代码:
function backpack(update) {
i = 0;
if (update != 1) {
/*
tempA = document.getElementById("scene").innerHTML;
tempB = document.getElementById("textbox").innerHTML;
*/
}
/*
document.getElementById("textbox").innerHTML = '<br><br><input type="button" value="Close Backpack" onclick="closeBackpack()">';
document.getElementById("scene").innerHTML = '<div id="backpack" style="height:400px; width:400px; background-image:url(files/sugame/sprites/backpackBackground.png); border-style:solid; border-width:8px; position:absolute; top:92px; left:192px"></div>';
*/
for (i = 0; i < 9; i++) {
if (invType[i] != "empty") {
switch (i) {
case 0:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:4px; top:4px;">';
break;
case 1:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:136px; top:4px;">';
break;
case 2:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:268px; top:4px;">';
break;
case 3:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:4px; top:136px;">';
break;
case 4:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:136px; top:136px;">';
break;
case 5:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:268px; top:136px;">';
break;
case 6:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:4px; top:268px;">';
break;
case 7:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:136px; top:268px;">';
break;
case 8:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:268px; top:268px;">';
break;
}
if (invType[i] == "usable") {
(function (num) {
document.getElementById(num).onclick = function () {
useItem(invName[num], num)
};
})(i);
}
if (invType[i] == "equipment") {
document.getElementById(i).onclick = function (i) {
return function () {
equipItem(invName[i], i)
};
}(i);
}
}
}
}
答案 0 :(得分:2)
问题在于您将所有按钮添加到DOM的方式。你在做什么:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:4px; top:4px;">';
这会重新解析整个DIV的HTML,因此旧按钮上的所有事件侦听器都会丢失。
有两种简单的方法可以解决这个问题:
不使用连接HTML,而是使用createElement
和appendChild
等函数直接添加到DOM,而不会影响以前的元素。
使用两个循环:一个循环添加所有按钮,第二个循环将事件侦听器添加到它们。
我注意到的另一件事,但它与问题无关,就是你忘了在你的函数中声明i
作为局部变量。如果你在循环中调用其他函数做同样的事情,这可能会导致问题,因为它们会影响外部循环。