使用EventListener在JavaScript中动态创建元素

sam*_*sam 6 html javascript addeventlistener

嗨,我很震惊这个问题.

我需要动态创建一个带Onclicklisteners.所以我更喜欢这种方式.

function create_weekmenu(json)
  {
      var column_list=json.week_list;
      var menu_table=document.getElementById("weekmenu");
      var row=document.createElement('tr');
      for(var i=0;i<column_list.length;i++)
      {
        var cell=document.createElement('th');
        var span_ele=document.createElement('span');
        if(span_ele.addEventListener)
        {
          span_ele.addEventListener('click', toggletable(column_list[i]),true);    
        } 
        else if(span_ele.attachEvent)
        { // IE < 9 :(
          span_ele.attachEvent('onclick', toggletable(column_list[i]));
        }
        span_ele.appendChild(document.createTextNode(column_list[i]))
        cell.appendChild(span_ele);
        row.appendChild(cell);
     }
     menu_table.appendChild(row);
  }
Run Code Online (Sandbox Code Playgroud)

我得到的结果元素结构是

<table id="weekmenu">
  <tr>
    <th>
       <span>week_one</span>
    </th>
    <th>
      <span>week_two</span>
    </th>
 </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

但我需要像这样的元素结构,

    <table id="weekmenu">
       <tr>
         <th>
              <span onclick="toggle(week_one)'>week_one</span>
         </th>
         <th>
              <span onclick="toggle(week_two)'>week_two</span>
         </th>
      </tr>
    </table>
Run Code Online (Sandbox Code Playgroud)

进一步注意:我可以看到onclick监听器在创建元素时触发.但它永远不会与元素绑定.

什么是解决方案.

我更喜欢使用appendChild()而不是.innerHTMLdocument.write()来构造DOM结构.

小智 3

问题是您在附加它时调用了toggleTable 函数。这就是为什么它在创建元素时被触发。

span_ele.addEventListener('click', toggletable(column_list[i]),true);
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,应该是:

span_ele.addEventListener('click', toggletable, true);
Run Code Online (Sandbox Code Playgroud)

但显然这不会在列中传递以进行切换,因此它并不理想。

我会使用类似的东西:

function create_weekmenu(json)
  {
      var column_list=json.week_list;
      var menu_table=document.getElementById("weekmenu");
      var row=document.createElement('tr');
      for(var i=0;i<column_list.length;i++)
      {
        var cell=document.createElement('th');
        var span_ele=document.createElement('span');
        if(span_ele.addEventListener)
        {
          span_ele.addEventListener('click', function(col) {
            return function() {
              toggletable(col);
            }
          }(column_list[i]),true);
        } 
        else if(span_ele.attachEvent)
        { // IE < 9 :(
          span_ele.attachEvent('onclick', function(col) {
            return function() {
              toggletable(col);
            }
          }(column_list[i]));
        }
        span_ele.appendChild(document.createTextNode(column_list[i]))
        cell.appendChild(span_ele);
        row.appendChild(cell);
     }
     menu_table.appendChild(row);
  }
Run Code Online (Sandbox Code Playgroud)

您需要确保将函数附加到事件处理程序,而不是函数的结果。