2019独角兽企业重金招聘Python工程师标准>>>

可以添加代理事件,监听指定属性的指定动作,不依赖于节点结构,只依赖于冒泡冒上来的节点属性

先写好绑定事件的方法:

http://www.baisoujs.com

1 var addEvent=function(node,type,fn){2     if(window.attachEvent){    3       node.attachEvent("on"+type,fn);      4     }      5     else if(document.body.addEventListener){      6       node.addEventListener(type,fn,false);      7     }      8     else node["on"+type]=fn;9   }

然后是正文:

var delegater = function(node) {   var actions = {};//要监听的自定义属性   var types = {};//要监听的事件类型开关    var that = {};//返回句柄
//从某节点向上循环,至node,返回这之间具有‘action’属性的节点 var getTarget = function(el, type, action) {       var nodeList = [];     while(el.parentNode && el !== node) {         if(el.getAttribute('action')) {               nodeList.push(el);          }           el = el.parentNode;        }       return nodeList.length ? nodeList : null;   }   var dispatch = function(e, type) {     var ev = e || window.event;        var targets = getTarget(ev.target || ev.srcElement, type);
//没有要监听的节点则返回       if(!targets) {          return;     };
//对每个节点取一次action和data,传入绑定的对应方法中     for(var i in targets) {         var act = targets[i].getAttribute('action');         if(!actions[act]) {             continue;           }           for(var k in actions[act]) {                if(actions[act][k]['type'] == type) {
//每个对应方法都trycatch防止阻断                   try {                       actions[act][k]['fn']({                           'e' : e,                          'el' : targets[i],                            'type' : type,                            'data' : targets[i].getAttribute('data')                        });                 } catch(e) {                    }               }           }       }   }//外抛方法,添加对指定action的对事件type的监听   that.add = function(action, type, fn) {        actions[action] || (actions[action] = []);
//加锁,防止多重绑定和冗余绑定     types[type] || (function() {            types[type] = true;            addEvent(node, type, function(e) {              dispatch(e, type);          })      })();       actions[action].push({          'type' : type,            'fn' : fn     }); }   return that;}

测试html和js如下:

level3 level3 level3
level3 level3 level3

var h = delegater(document.getElementById('container'));h.add('level3a', 'click', function(obj) {   console.log(obj);});h.add('level2a', 'click', function(obj) {   console.log(obj);});h.add('level2b', 'click', function(obj) {   console.log(obj);});h.add('level3a', 'mouseover', function(obj) {   console.log(obj);});
摘自 http://www.baisoujs.com/detail_137578221121877.html

转载于:https://my.oschina.net/u/1244001/blog/151440

简单代理事件工具(百搜技术)相关推荐

  1. J2EE总体的学习计划(百搜技术)

    2019独角兽企业重金招聘Python工程师标准>>> 第一部分:     JAVA语言基础知识.包括异常.IO流.多线程.集合类.数据库.(切记基础知识一定要时时刻刻巩固)     ...

  2. 北风设计模式课程---深入理解[代理模式]原理与技术

    北风设计模式课程---深入理解[代理模式]原理与技术 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装 ...

  3. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  4. 揭秘高效协作工具背后的技术架构

    揭秘高效协作工具背后的技术架构 发表于2015-12-08 10:50| 1731次阅读| 来源CSDN| 4 条评论| 作者蒲婧 CTOCTO俱乐部CTO讲堂管理实践团队协作Worktile wid ...

  5. 经典|Linux:为什么性能工具需要 BPF 技术(送多本)

    了解更多BPF技术内幕,推荐阅读<BPF之巅:洞悉Linux系统和应用性能>一书. ▼ BPF是近年来Linux 系统技术领域一个巨大的创新.作为 Linux 内核的一个关键发展节点,其重 ...

  6. iOS 自定义Cell按钮的点击代理事件

    在实际开发工作中,我们经常会在自定义的Cell中布局一些按钮,并且很多时候我们会在点击这个按钮的时候使我们的UItableviewController跳转到下一界面,有的可能还要传值.那么如何使我们的 ...

  7. 获取客户端ip_代理IP工具能否解决反爬?

    互联网已成了生活中的部分,从事互联网的工作者,避免不了需要去一些网站上进行爬取需要的数据来达到自己产品或者业务上的需求.比如反爬策略,但是,使用代理IP工具一定可以解决反爬虫策略吗? 一.不同的网站有 ...

  8. HTTP代理原理以及HTTP隧道技术

    通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口号,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之 ...

  9. c语言案例朗读工具源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

最新文章

  1. XML(eXtensible Markup Language)文件的解析
  2. 几款优秀的jQuery 插件
  3. ubuntu配置vnc访问
  4. 虚拟主机 php .htacess,LiteSpeed添加虚拟主机+支持htaccess图文教程
  5. python 获取文件列表_Python3 - 获取文件夹中的文件列表
  6. oracle sql练习_使用Scrapy爬虫,并将数据存储到oracle
  7. python用matplotlib画图时将标签竖着显示
  8. mysql 取模分区_MySQL分区
  9. Pytorch完成线性回归
  10. linux(5)--补充(管道| / 重定向 / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)...
  11. 盘点面试中常见的智力题
  12. java关联vss 80020009,80020009: Invalid password[src=SourceSafe,guid=null]
  13. coreseek分词
  14. 性能魔方七剑下天山之由龙剑:世界级监测、完整且免费
  15. Codeforces 868C - Qualification Rounds 思维
  16. 计算机专业的研究方向
  17. live555直播startplaying
  18. 排列组合和二项式定理
  19. matlab 将图片转为视频
  20. 特岗计算机考试题2018年,2020年特岗模拟考试试题及答案.pdf

热门文章

  1. 知识付费平台年度排行榜!哪些平台活着其实已经死了?
  2. excel系列【统计一列中的不重复项】
  3. 【Mac小技巧】如何改变顶部状态栏的颜色
  4. android应用是非正式版本,Androidstudio 打包apk安装失败 应用是非正式发布版本,当前设备不支持安装...
  5. LPC1768 关于延时Delay时间与不同等级的优化对比
  6. 7-97 约会成功了吗?
  7. Jenkins部署spring boot项目
  8. SDRAM DQM的解释
  9. 056.单链表就地逆置
  10. 什么叫机械硬盘_机械硬盘内部是什么结构?