博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript事件委托练习
阅读量:6676 次
发布时间:2019-06-25

本文共 2769 字,大约阅读时间需要 9 分钟。

JavaScript事件代理是一种简单的技巧,通过它你可以把事件处理器添加到一个父级元素上,这样就不需要为每一个元素添加或者删除事件处理器,从而避免了内存泄露或者是遍历节点造成的性能下降。

 

如果整个页面都采用同样事件流方式,当红色蓝色区域触发相同事件,冒泡法:先处理蓝色区域请求,捕获法:先处理红色区域请求

如果不同层的元素使用的useCapture不同,会先从最外层元素往目标元素寻找设定为capture(捕获)模式的事件,到达目标元素执行目标元素的事件后,再寻原路往外寻找设定为bubbling(冒泡)模式的事件。(先捕获后反向冒泡)

练习如下(考虑绑定方式兼容性问题,但不确定是否正确,欢迎探讨)

function delegateEvent(element, tag, eventName, listener) {    // your implement    var wrapId=document.getElementById("element");//定位包裹层    if(wrapId.addEventListerner)//IE8+及Firefox、chrome    {        wrapId.addEventListerner("eventName",function(ev){            var e=window.event||ev;            var target=e.target||e.srcElement;            if(target.nodeName.toLowerCase==tag)                listener(e);//事件对象传递给listener        },false)//冒泡,true为捕获            }    if(wrapId.attachEvent)//IE低级版本只能用此方法绑定    {        wrapId.attachEvent("on"+"eventName",function(ev){            var e=window.event||ev;            var target=e.target||e.srcElement;            if(target.nodeName.toLowerCase==tag)                listener(e);//事件对象传递给listener        })//冒泡    }}$.delegate = delegateEvent;// 使用示例
  • Simon
  • Kenner
  • Erik
// 还是上面那段HTML,实现对list这个ul里面所有li的click事件进行响应$.delegate($("#list"), "li", "click", clickHandle);

 

类jQuery封装

$.on =function(selector, event, listener){    var element = $(selector);    if (element.addEventListener) {    element.addEventListener(event,listener,false);  }else{    event = "on" + event;    element.attachEvent(event,listener);  }};$.click =function(selector, listener) {    var element = $(selector);     if (element.addEventListener) {      element.addEventListener("click",listener,false);    }else{      element.attachEvent("onclick",listener);    }}$.un=function(selector, event, listener) {   var element = $(selector);   if (element.removeEventListener) {    element.removeEventListener(event,listener,false);  }else{    event = "on" + event;    element.detachEvent(event,listener);  }}$.delegate(selector, tag, event, listener) {    // your implement    var element=$(selector);    if(element.addEventListerner){        element.addEventListerner(event,function(ev){            var e=window.event||ev;            var target=e.target||e.srcElement;            if(target.nodeName.toLowerCase==tag)                listener(e);//事件对象传递给listener        },false)//冒泡,true为捕获    }    if(element.attachEvent){        element.attachEvent("on"+event,function(ev){            var e=window.event||ev;            var target=e.target||e.srcElement;            if(target.nodeName.toLowerCase==tag)                listener(e);//事件对象传递给listener        })    }};

 

参考:

http://www.cnblogs.com/leo388/p/4461579.html

http://www.itxueyuan.org/view/5225.html

转载于:https://www.cnblogs.com/bianxirui/p/4508753.html

你可能感兴趣的文章
linkin大话数据结构--Set
查看>>
$.each 和$(selector).each()的区别
查看>>
JSON格式自动解析遇到的调用方法问题.fromJson() ..readValue()
查看>>
Crystal Reports for Visual Studio 2015 安装
查看>>
iOS UI 15 网络编程下载 图片 音乐 大文件 视频 get/ post方法
查看>>
linux文件系统 - 初始化(二)
查看>>
Python的可视化图表工具集
查看>>
《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》
查看>>
三个文件,
查看>>
webpack的总结
查看>>
hibernate 一级缓存和二级缓存
查看>>
javac不是内部或外部命令
查看>>
mvc SelectList selected失效的解决方法
查看>>
JAVA 设计模式 中介者模式
查看>>
我的软件工程课目标
查看>>
var a={n:1}; var b=a; a.x=a={n:2}; console.log(a.x); console.log(b.x);
查看>>
【HDOJ】3016 Man Down
查看>>
window.open打开新页面,并将本页数据用过url传递到打开的页面;需要两个页面;...
查看>>
查看本机IP分为两种情况:
查看>>
Scala进阶之路-Scala特征类与unapply反向抽取
查看>>