我想知道如何正确地将事件监听器(如onClick)添加到动态div中。这是我的摘录:
var $menu = new Array(2);
createDiv('yes');
function createDiv(title) {
var $class = 'menuLink';
var $title = 'title';
for(var i=0; i<$menu.length;i++)
{
$title = 'title';
var newdiv = document.createElement('div');
newdiv.setAttribute('class', $class);
newdiv.setAttribute('id', 'item'+i);
newdiv.addEventListener('onclick', clickHandle(newdiv.id),false);
if (title)
{
newdiv.innerHTML = $title;
} else {
newdiv.innerHTML = "No Title";
}
document.getElementById('menu').appendChild(newdiv);
showMenu();
}
}
function clickHandle(e)
{
if(e == 'item0')
{
alert('Link is' + ' ' + e);
}else{
alert('Another Link');
}
}
这是我的问题,代码段运行正常,它创建了我的div,添加了id的值和所有内容,但是事件在附加事件后立即触发,因此,在for循环创建div时,警报窗口会说:链接为item0 ,并在此之后立即显示:另一个链接。
我误会吗? (我在AS3中用了无数次这种方法,并获得了预期的结果,只是附加了等待点击的功能)。我想要的是Divs等待用户单击它们,而不是在连接后立即触发。感谢您对此的任何提示。问候。
附言IE不支持addEventListener,但是我想在赶上IE疯狂之前解决此问题,但是我也会喜欢IE的方法。
-我尝试了“ onclick”,只是“点击”到addEventListener行中,两者都具有与上述相同的结果。
最佳答案
更换
newdiv.addEventListener('onclick', clickHandle(newdiv.id),false);
与
(function(newdiv){
newdiv.addEventListener('onclick', clickHandle(newdiv.id), false);
})(newdiv);
该事件未触发,但您正在调用
clickHandle(newdiv.id)
并将此调用的结果传递给addEventListener
。另请注意,事件的名称是'click'
,而不是'onclick'
。此外,变量newdiv由以下循环更改。这就是为什么我建议将其封闭在封闭中以防止其变化。
您也可以使用:
(function(newdiv){
newdiv.onclick = function(){clickHandle(newdiv.id)};
})(newdiv);