Javascript只在最后一个条目的foreach循环中添加事件监听器

rud*_*dib 0 javascript asp.net loops event-listener

我有一个函数,它通过一个数组并添加<h3>元素到div.然后它将一个事件监听器(an onclick)添加到当前<h3>元素,但只有通过该函数的最后一个元素由onclick.

var runstr = [];

//txt comes from the content of a tab separated textfile spilt by '\n'
txt.forEach(function (lcb) { //lcb goes through each line of txt
    lcb = lcb.split("   ", 30); //split the line by tab
    //MainContent_Infralist is a div where the <h3> elements are listed and lcb[2] is the title
    document.getElementById("MainContent_Infralist").innerHTML = 
        document.getElementById("MainContent_Infralist").innerHTML + 
        '<h3 class="Infraa" id="' + "Infralist_" + lcb[2] + '">' + lcb[2] + '</h3>';
    //I put the id into an array to get the index of the marker later
    runstr.push("Infralist_" + lcb[2]);

    //I'm working with openlayers here i try to set the entry of 
    //the list.onlick to trigger a mousedown on a marker.
    //And there is the problem: It works, but only for the last entry of my <h3> list...
    document.getElementById("Infralist_" + lcb[2]).onclick = function () {
        var theM = runstr.indexOf("Infralist_" + lcb[2]);
        markers.markers[theM].events.triggerEvent('mousedown');
    };
};
Run Code Online (Sandbox Code Playgroud)

kam*_*uel 6

问题出在这里:

document.getElementById("MainContent_Infralist").innerHTML = 
     document.getElementById("MainContent_Infralist").innerHTML + 
     '<h3 class="Infraa" id="' + "Infralist_" + lcb[2] + '">' + lcb[2] + '</h3>';
Run Code Online (Sandbox Code Playgroud)

每次分配时innerHTML,您基本上都会删除所有内容并重新添加.这会导致所有事件侦听器中断.

这就是为什么只有最后一个有效的原因 - 它是分配之后唯一没有更多innerHTML操作的原因.

要解决此问题,请使用document.createElement()创建元素,并使用element.appendChild()附加它们.

它可能看起来像:

var header = document.createElement('h3');
header.id = 'Infralist_' + lcb[2];
header.className = 'Infraa';
header.textContent = lcb[2];

document.getElementById('MainContent_Infralist').appendChild(header);

header.onclick = function () {
  // you function here
}
Run Code Online (Sandbox Code Playgroud)

  • **非常感谢!!!它有效!!!** 我还不能投票,但当我可以的时候我会这样做...... (2认同)
  • @user2519977 - 很高兴我提供了帮助:) 经验法则不是使用 `innerHTML` 进行 DOM 操作。 (2认同)