事件委托与点击事件绑定

委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。点击事件这么频繁,主要是想办法解决浏览器的点击该怎么安排,设计比较好

事件委托

解决的问题:有很多的dom需要添加事件处理
“事件委托” 的本质是利用了事件冒泡的特性。把事件处理函数绑定到容器元素上,当容器内的元素触发事件时,就会冒泡到容器上。此时可以判断事件的源头是谁,再执行对应的事件处理函数。

  • 先用实例理解冒泡

html

    <div id="parent">
        父元素
        <div id="child">
            子元素
        </div>
    </div>

js

        var parent = document.getElementById("parent");
        var child = document.getElementById("child");

        document.body.addEventListener("click", function(e) {
            console.log("冒泡-body");
        }, false);

        parent.addEventListener("click", function(e) {
            console.log("冒泡-parent");
        }, false);

        child.addEventListener("click", function(e) {
            console.log("冒泡-child");
        }, false);

红色为parent,蓝色为child
这里写图片描述

点击蓝色
这里写图片描述
点击红色
这里写图片描述

可以看到事件触发顺序是由内到外的(想象下dom树结构),这就是事件冒泡,虽然只点击子元素,但是它的父元素也会触发相应的事件,至于怎么阻止,就不细说了

  • 经典的例子,为每个li绑定事件
    <ul id="btn">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>

事件委托实现(提醒:使用 .onclick 这样的事件属性来绑定事件有一个非常大的缺点,重复赋值会覆盖旧值。)

 var btn = document.getElementById('btn');
 btn.addEventListener('click', btnClick);

 function btnClick(e) {
    var that = this;
    if (e.target.nodeName.toLowerCase() === 'li') {
                //do something
         }  
 }
  • 其中JQuery中的$.on()就很好地实现了事件委托
$('body').on('click','li',function(){
    // do something
})

只要明白冒泡原理,应该是很好理解的

点击事件解决方案

  • 最近看到css魔法的一个解决方案action,很赞
  • 具体思路
    1. 利用html5的data-*属性设置统一的事件标识
    2. 事件以var list= {a:function(){ }}方式存储
    3. 再用JQuery的$.on()实现事件委托
    4. $.data()获取对应的data-*list[$.data()]设置响应事件
    5. 实现代码

HTML

    <button data-action="lucky-draw">Lucky Draw</button>
    <button data-action="some-action">Button</button>
    <a href="#" data-action="another-action">Link</a>

JS

  $(function() {
        var actionList = {
            'lucky-draw': function() {
                console.log("I am lucky-draw");
            },
            'some-action': function() {
                console.log("I am some-action");
            },
            // ...
            'another-action': function() {
                console.log("I am another-action");
            }
        };
        $('body').on('click', '[data-action]', function() {
            var actionName = $(this).data('action');
            var action = actionList[actionName];
            if ($.isFunction(action)) action();
        });

// 添加新的点击事件
        // HTML
        $('body').append('<a href="#" data-action="more-action">Link</a>')
        // JS
        $.extend(actionList, {
            'more-action': function() {
                console.log('I am more');
            }
        })
    })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值