jQuery中dom元素上绑定的事件详解


Posted in Javascript onApril 24, 2015

作为技术狂热分子的职业本能,看到一个技术产品的功能,总会忍不住想知道它是怎么被实现的。比如我每每看到别人网站一个很炫的界面或者很酷的功能,就忍不住打开了浏览器的控制台。。。

好,不扯远,说说当你想看到网站上某个元素绑定的事件函数的代码时应该怎么做吧。

查看原生绑定的事件函数代码

所谓原生就是通过addEventListener方法绑定到dom元素上。这个好办:

审查绑定事件的元素(对着它右键->审查元素)在弹出的Elements视图的控制台,右侧点击“Event Listeners”页签然后就能看到所有绑定在该元素的事件了,点开后,找到handler,右击鼠标,选择“Show Function Definition”菜单。就能跳到绑定到该元素的事件函数的源码位置了。有图有真相:

jQuery中dom元素上绑定的事件详解

查看jquery绑定的事件函数代码

嗯,我知道,你遇到问题了吧,所有jquery绑定的事件函数,你通过上面的方式,跳到的都是jquery的代码,而且永远是那一个地方。看了跟没看一样。所以,宝哥在这里教你针对jquery的查看方式。

还是审查元素点击“Properties”视图。选择第一个,展开找到一个‘jQueryxxxxx(一串数字)'这样的属性,记住它的值(一般是一个数字)N

jQuery中dom元素上绑定的事件详解

然后左侧切到Console视图,在控制台里执行$.cache[N],这里的N是前面那个属性值

jQuery中dom元素上绑定的事件详解

然后就会出来绑定在这个元素上的东西了。展开events,里面就有你想要查看的真实函数了。右击具体事件下的handle后面的function…,然后选择“Show Function Definition”就可以看到了。

jQuery中dom元素上绑定的事件详解

例子=》http://demo.sudodev.cn/frontend/jqDetect查看jquery2.x版本绑定的事件函数代码

好的,我知道,你肯定又遇到问题了。因为当你使用的jquery2.x版本的jquery时,上面的这个方法又不work了,原因是2.x的代码架构变了。其实2.x版本的事件仍然是用的cache机制,但不像1.x版本暴露到外面去了,而是封装起来,并且存在了闭包对象data_priv中,而且一般使用的是jquery的压缩版本,这个data_priv名字你也无法查看到。所以在查看过jquery2.x版本的源码后,宝哥教你如何定位它:

直接进入控制台,构造一个包含jQuery的对象,以便在控制台里查看jQuery。比如输入var o={j:$},这样做的好处是,你执行后能在控制吧里查看jQuery的所有属性

jQuery中dom元素上绑定的事件详解

然后在控制台展开jQuery(这里是j)对象,找到_queueHooks这个方法,看到它的代码大概是“return L.get(a,c)||L.access…”这种,记住这个L也可能是不是L)

jQuery中dom元素上绑定的事件详解

展开任意一个j下面首层的对象,比如就是上面的_queueHooks,找到展开,再展开下面的Closure,找到前面的那个“L”对句,对着它后面的字母右键,选择“Store as Global Variable”

jQuery中dom元素上绑定的事件详解

然后控制台里就打出一个tempX的对象,它就那个装着cache的东东。假设它叫temp1。那个temp1有个get方法可以直接获取它的cache对象。假如你要查看绑定事件的对象的id叫clickMe。那执行temp1.get($('#clickMe').get(0))(或者temp1.get(document.querySelector('#clickMe'))))就会打出跟上面jquery1.x版本相当的东西

jQuery中dom元素上绑定的事件详解

后面就跟上面jquery1.x的方式一样例子=》http://demo.sudodev.cn/frontend/jq2Detect另:

以上默认是在chrome浏览器下做的操作,其实在Firefox下也是类似的,相信作为一个技术人员,你应该能举一反三的。至于IE嘛,呃…当我没说哈。:)

更新:

1.为省去查看属性的麻烦,jquery1.x可以直接在控制台执行$.cache[$('#clickMe').get(0)[$.expando]]输出元素上绑定的东西,而不是先去查看元素上jQueryxxxxxxx的属性的值了

2.经过一篇查阅和测试。有一个新的目前最省力而且jquery1,jquery2都适用的办法是,直接在控制台输入$._data($('#clickMe').get(0)),即可把绑定在元素的东西都输出来。但是,从jquery2的源码的注释中发现,$._data会在之后的新版本中废除。所以上面介绍的方法仍然是很有价值的。授人以鱼,不如授人以渔嘛,:)

Javascript 相关文章推荐
jQuery Ajax文件上传(php)
Jun 16 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
jQuery深拷贝Json对象简单示例
Jul 06 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
ES6正则的扩展实例详解
Apr 25 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
Apr 30 Javascript
three.js 如何制作魔方
Jul 31 Javascript
vue实现简单的登录弹出框
Oct 26 Javascript
原生js制作简单的数字键盘
Apr 24 #Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 #Javascript
Node.js实现Excel转JSON
Apr 24 #Javascript
js中for in语句的用法讲解
Apr 24 #Javascript
JScript中的条件注释详解
Apr 24 #Javascript
HTML5+setCutomValidity()函数验证表单实例分享
Apr 24 #Javascript
js闭包实现按秒计数
Apr 23 #Javascript
You might like
php部分常见问题总结
2008/03/27 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
Django web框架使用url path name详解
2019/04/29 Python
python3使用GUI统计代码量
2019/09/18 Python
python函数定义和调用过程详解
2020/02/09 Python
如何基于Python按行合并两个txt
2020/11/03 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
给女朋友的道歉信
2014/01/10 职场文书
作文评语大全
2014/04/23 职场文书
委托书的格式
2014/08/01 职场文书
项目合作协议书
2014/09/23 职场文书
医院感染管理制度
2015/08/05 职场文书
培训感想范文
2015/08/07 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS