【发布时间】:2015-12-31 00:29:35
【问题描述】:
下面的代码从 xml 文件中获取信息。 我成功地用一个按钮显示了每个行星的 id 和名称。
我想在按钮上添加一个 onclick 事件。
现在的问题是:它确实添加了 onclick 事件,但仅在循环中创建的最后一个按钮上。
我做错了什么?为什么它不为每个按钮创建一个onclick 事件,而只为循环中的最后一个按钮创建一个?
function updatePlaneten() {
var valDiv, planets, valButton, textNode;
// Get xml files
planets = this.responseXML.getElementsByTagName("planeet");
// loop through the <planet> tags
for (var i = 0; i < planets.length; i++) {
valDiv = ''; // clear valDiv each time loop starts
// Get the id and the name from the xml info in current <planet> tag
valDiv += planets[i].getElementsByTagName("id")[0].childNodes[0].nodeValue + "<br>";
valDiv += planets[i].getElementsByTagName("name")[0].childNodes[0].nodeValue + "<br>";
document.getElementById("planetenID").innerHTML += valDiv + "<br>";
// Create button with a value and pass in this object for later reference use (valButton.object=this)
valButton = document.createElement("input");
// valButton.setAttribute("planeetID", planets[i].getElementsByTagName("id")[0].childNodes[0].nodeValue);
valButton.setAttribute("value", 'Meer info');
valButton.setAttribute("type", 'button');
valButton.id = (i + 1);
valButton.object = this;
//
// Here is the problem i cant get fixed
//
//valButton.onclick = function(){ showinfo(); }
valButton.addEventListener('click', showinfo);
// Place the button on screen
document.getElementById("planetenID").appendChild(valButton);
}
}
// simple function to check if it works
function showinfo() {
console.log(this.object);
console.log(this.id);
}
【问题讨论】:
-
@Andreas,这不是重复的,因为问题是 OP 在每次设置 innerHTML 时都会破坏按钮,从而有效地破坏先前设置的事件侦听器
-
@PatrickEvans 你说得对。我应该更仔细地阅读代码... :(
标签: javascript loops events onclick