比将多个事件处理程序附加到DOM中的元素更好的方法

时间:2011-02-25 04:29:45

标签: jquery hover event-handling

我目前正在考虑一些效率/速度问题。

我有大约40个元素和div嵌套在li的

<ul id=ul>  
<li><a href="#">Link</a><div>Text</div></li>  
<li><a href="#">Link</a><div>Text</div></li>  
<li><a href="#">Link</a><div>Text</div></li>  
<li><a href="#">Link</a><div>Text</div></li>  
<li><a href="#">Link</a><div>Text</div></li>  
....   
</ul>

在所有的li上,我有悬停事件附加

$('#ul li').hover(function(e){
    $(this).children(div).show();},
function(){
    $(this).children(div).hide();
})

我想知道是否有更好的方法,而不是将40个事件处理程序附加到dom上进行悬停事件。我认为在某些浏览器中这可能会很慢。

我听说过DOM遍历,比如当你在#ul容器上只放置一个处理程序并让dom在浏览器中遍历时(e.target)找出已经悬停的元素。有谁知道如何处理这个问题?

3 个答案:

答案 0 :(得分:5)

.delegate()执行您所描述的内容:

$('#ul').delegate('li', 'mouseenter', function (e) {...});
$('#ul').delegate('li', 'mouseleave', function (e) {...});

请注意,.hover()只是两个事件(mouseenter和mouseleave)的快捷方式,因此上面两次调用.degelate()

即使在.delegate()上调用$('#ul')$(this)也会引用事件处理程序中的<li>元素。

答案 1 :(得分:1)

我认为你真正想要的是使用jQuery的delegate()

答案 2 :(得分:1)

您可以使用CSS来显示/隐藏div:

#ul li div
{
    display: none;
}  

#ul li:hover div
{
    display: block;
}