我想知道如何正确地将事件监听器(如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);

10-06 03:12