javascript循环添加点击事件到按钮

标签 javascript loops events onclick

下面的代码从 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);
}

最佳答案

问题是这一行:

document.getElementById("planetenID").innerHTML += valDiv + "<br>";

当您设置 innerHTML 时,当前在那里的内容将被销毁并替换为新的 html,这意味着您所有的旧按钮现在都被销毁并创建新按钮。以前附加的事件监听器不会附加到新按钮。

相反,只需创建一个 div/span 或任何最有帮助的容器,将您的星球文本或其他内容添加到其中,然后使用 appendChild

valDiv = document.createElement("div");
var id = planets[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
var name = planets[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
valDiv.innerHTML = id+"<br>"+name+"<br>";
document.getElementById("planetenID").appendChild(valDiv);

你也可以使用 insertAdjacentHTML

var id = planets[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
var name = planets[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
valDiv = id+"<br>"+name+"<br>";
document.getElementById("planetenID").insertAdjacentHTML("beforeend",valDiv);

关于javascript循环添加点击事件到按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532630/

相关文章:

javascript - MSIE : Keep focus in text field when clicking outside of it

javascript - Array 构造函数的合法使用

javascript - 关于从输出中隐藏文本字符串的代码的几个问题

loops - 如何在 Graphviz 流程图中创建循环?

php - 从 PHP 中的下一个 foreach 项目中提取元素?

javascript - Meteor - 如何在模板事件函数中正确路由

angular - Ionic 事件在延迟加载模块之间无法正常工作

javascript - 如何使用 Jquery 触发 onload 事件?

javascript - 主页在popstate上加载两次

php - 带有双引号的json解析错误