为什么onclick只被分配给最后一个对象?
Why is the onclick only being assigned to the last object?
我试图分配一个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函数。每个人都把我和这个问题联系在一起,但这对我没有帮助。我什么都试过了,就是不明白。有人能给我一个更好的解释,这意味着什么,我怎么能让我的代码工作?
JSFiddle
下面是添加所有按钮的完整代码:
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);
}
}
}
}
问题在于您将所有按钮添加到DOM的方式。你在做什么:
document.getElementById("backpack").innerHTML += '<input type="button" value="' + invName[i] + '" id="' + i + '" style="position:absolute; left:4px; top:4px;">';
这将重新解析整个DIV的HTML,因此旧按钮上的任何事件侦听器都将丢失。
有两种简单的方法可以解决这个问题:使用
createElement
和appendChild
等函数直接添加到DOM中,而不影响前面的元素,而不是连接HTML。使用两个循环:一个循环添加所有按钮,第二个循环添加事件侦听器。
我注意到的另一件事,但它与问题无关,是您忘记将i
声明为函数中的局部变量。如果在循环内调用做同样事情的其他函数,这可能会导致问题,因为它们会影响外部循环。
相关文章:
- Parse.com在循环中保存对象,只保存最后一个对象
- 如何在Javascript中的对象数组的最后一个对象之后附加几个新对象
- Javascript事件处理程序总是被添加到数组中的最后一个对象
- Javascript - 循环访问对象数组,仅显示最后一个对象
- JS将对象推送到变量,将最后一个对象添加到所有元素中
- 主干集合视图仅渲染集合中的最后一个对象
- JSON 从最后一个对象中删除尾随逗号
- for 循环仅显示数组中的最后一个对象
- 更有效的方法来删除第一个和最后一个对象
- 检索localStorage的最后一个对象中的值
- 为什么onclick只被分配给最后一个对象?
- 使用jquery迭代数组只返回最后一个对象
- jQuery -删除最后一个对象的关键
- 不能检索Angularjs $scope数组的最后一个对象
- 如何在字符串对象的两个对象之间添加逗号,而不是最后一个对象
- 从对象数组中删除最后一个对象
- 获取selector中的第一个和最后一个对象
- 检索JSON对象列表中的最后一个对象
- 如何定义第一个和最后一个对象并停止循环
- Javascript指向最后一个对象实例