sam*_*sam 6 html javascript addeventlistener
嗨,我很震惊这个问题.
我需要动态创建一个带Onclicklisteners的表.所以我更喜欢这种方式.
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', 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); }
我得到的结果元素结构是
<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()而不是.innerHTML或document.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)
您需要确保将函数附加到事件处理程序,而不是函数的结果。
| 归档时间: |
|
| 查看次数: |
3301 次 |
| 最近记录: |