15.JavaScript事件委托

15.1 问题

ul>li*1000

假如我们要对li的点击事件进行处理,通常情况下我们会这么写:

$(function(){
    $('li').click(function(e){
        console.log($(this).index()); // 输出当前下标
    })
});

但是这里li有1000个,每个li都做点击事件绑定,性能上是很消耗的。

这时事件委托就派上用场了。我们可以把监听处理转移ul上,当对li进行点击的时候,点击事件会传递到ul上并触发事件。这时候我们可以通过事件的target属性获取到真正点击的元素,并进行处理。

$(function(){
    $('ul').click(function(e){
        if(e.target.nodeName == 'LI') {
            console.log($(e.target).index()); // 输出当前下标
        }
    })
});

15.2 其他使用场景

事件委托,除了上面提到的避免对数量庞大的重复节点进行事件从而减少性能消耗外,还有一个很实用的使用场景就是:避免对新添加的节点进行重复的事件绑定。

这样,我们就可以再添加新节点的时候,不需要再考虑单独为新添加的节点进行事件绑定,从而减少冗余的而不必要的工作量。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style type="text/css">
        ul li {
            margin: 5px;
            background-color: #7B68EE;
        }
    </style>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script>
        $(function(){ 
            $('ul').click(function(e){
                if(e.target.nodeName == 'LI') {
                    $('ul').append( $('<li>/'));
                }
            })
        }); 
    </script>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
    </ul>
</body>
</html>

15.3 jQuery的delegate函数

上面的实现,我们也可以使用jQuery封装的事件委托函数delegate,写法如下:

$(function(){           
    $('ul').delegate('li', 'click', function(){
        $('ul').append( $('<li>/'));
    });
}); 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容