事件代理的实际应用
来源:互联网 发布:python 回滚 编辑:程序博客网 时间:2024/05/20 05:54
今天就写一下关于事件的代理的运用,首先由一个例子来揭开个面纱,很简单:导航是我们平时用得很多的一个组件,一般都是用ul/li组成的,然后一般来说我们会为每个li绑定一个click事件,去处理相应的事情。其实我们还可以用另一个方法,把这个click事件绑定到ul上,这样只需要绑定一次,就可以实现绑定多个li的效果了,简约了代码,又提高了效率,确实比较实用。
从上面的描述就可以看出,我们把触发事件绑定到了“父标签”上,其实就是利用了事件的冒泡性质,使得“父标签”能够代替“子标签”去实现触发事件的回调函数。
但是我们就有疑问了:
1.如果不同的子标签有不同的回调函数,那么如何去区分具体是哪一个子标签呢?
2.如果子标签会动态的增添或者减少,对于新增加的子标签的也可以代理么?
答案肯定是可以的:
1.每一个触发事件的回调函数中都会有一个event的参数,这个参数具有很多属性,最重要的是event.target这个属性,你打印这个属性可以获取当前触发的子标签具体是哪一个,然后可以通过event.target.nodeName.toLowerCase()来获取具体是什么元素(返回的是大写,所以我们最好转化成小写)event.target.id获取这个子标签的id,这个就可以解决我们第一个疑问
2.每次返回的这个evnet都是最新的,这样就可以解决我们第二个疑问。
那这样就能解决两个问题:
1.当列表很多,且每一行都需要做相应处理的时候,我们就没必要每一行去给它绑定事件。
2.当列表会动态增加的时候,我们不需要再为新增的元素绑定事件。
下面是我自己写的一个小demo,可以动态添加导航,利用事件代理为子标签及新增加的子标签绑定相应事件,不过这个适用于子标签的代理事件都是一致,没太多差别的,如果是子标签的回调函数处理的不一样的话,就需要根据id的不同然后去分情况写。
更新:2017/3/5
对于事件代理我们完全可以利用on这个jq的API来使用
$("#myul").click(function(e){ if(e.target.nodeName.toLowerCase()=="li"){ var i=e.target.id.substring(4)-1; $(".page").hide(); $(".page").eq(i).show();}})上面这段代码用on来替换:
$("#myul").on("click","li",function(){var i=this.id.substring(4)-1;$(".page").hide();$(".page").eq(i).show();})
瞬间又少了一些代码和操作,方便了许多呢~ 第二个参数是选择器,我们可以填id class... ("#xxx" ,".xxx")都可以,这样就可以一步到位,不用再去e.target去一个个寻找,还转换为小写,有的还要去兼容e.target这个对象。
下面是完整代码:
<!DOCTYPE html><head> <title></title> <style type="text/css"> body { margin: 0; } div { background-color: Gray; text-align: center; } .main { margin-left: 310px; height: 550px; } .sidebar1 { width: 300px; height: 550px; position: absolute; top: 0; } .sidebar1 ul{list-style:none; } .sidebar1 li{width:200px;height:50px;background-color:#e4e4e4;border:2px solid #d4d4d4;margin-top:2px;line-height:50px;color:#1dd4f4;cursor:pointer; } .sidebar1 li:hover{ background-color:black; } .sidebar2 { width: 300px; height: 340px; position: absolute; top: 210px; } </style></head><body> <div class="main" id="main"><div class="page" >第1页</div><div class="page" style="display:none">第2页</div><div class="page" style="display:none">第3页</div><div class="page" style="display:none">第4页</div><button id="btn">增加</button> </div> <div class="sidebar1" id="preView" ><ul id="myul"><li id="page1">第1页</li><li id="page2">第2页</li><li id="page3">第3页</li><li id="page4">第4页</li></ul> </div> <script src="jquery.js"></script><script type="text/javascript"> $(function(){$("#myul").click(function(e){if(e.target.nodeName.toLowerCase()=="li"){var i=e.target.id.substring(4)-1;$(".page").hide();$(".page").eq(i).show();}})$("#btn").click(function(){var length=$("li").length+1;var oLi = "<li id='page"+length+"'>第"+length+"页</li>";var oDiv="<div class='page' style='display:none'>第"+length+"页</div>"$("#myul").append(oLi);$("#btn").before(oDiv);})}) </script></body></html>
- 事件代理的实际应用
- 接口的实际应用--代理设计模式
- 实际应用中installshield的事件处理
- jQuery事件代理的应用
- 代理模式之实际应用
- 探讨Java代理模式与反射机制的实际应用
- 设计模式原来如此-代理模式的实际应用
- ApplicationContext事件传播实际应用
- ApplicationContext事件传播实际应用
- 事件代理应用
- SOA 的实际应用
- Filter的实际应用
- 反射的实际应用
- 门禁的实际应用
- CLHLock的实际应用
- MV5的实际应用
- ROW_NUMBER() 的实际应用
- ArrayList的实际应用
- ionic2 iframe加载外部url,引用其他网站
- oj2006: C语言实验——拍皮球
- Android高级Renderscript---Andvanced Renderscript(二)
- AOP的理解摘抄
- 常用命令
- 事件代理的实际应用
- 身份证号检测工具
- BZOJ 4563: [Haoi2016]放棋子
- protobuf安装使用(python版)
- SSM开发实例(基于spring 3.X)
- Attempt to set a non-property-list object null as an NSUserDefaults
- https是如何工作的?
- 【Java基础】Java分支结构
- Tomcata-Tomcat的系统安全管理