JS和JQ的event对象区别分析


Posted in Javascript onNovember 24, 2014

代码测试:

<div id="test"><p>test text<p></div> 

<script src="vendor/jquery-2.1.1.js"></script> 

<script> 

test.addEventListener('click', function(e){console.log(e);}, false), 

$('#test').on('click', function(e){console.log(e)}); 

</script>

结果分析:

js-jq-event-common:{ 

  altKey: false, 

  bubbles: true, 

  button: 0, 

  cancelable: true, 

  clientX: 58, 

  clientY: 13, 

  ctrlKey: false, 

  offsetX: 50, 

  offsetY: 5, 

  pageX: 58, 

  pageY: 13, 

  screenX: 58, 

  screenY: 122, 

  view: Window, 

  which: 1, 

  type: 'click', 

  timeStamp: 1407761742842, 

  metaKey: false, 

  relatedTarget: null, 

  target: div#test /*jq-evt的target不一定是jQuery选择器匹配的元素,可能是第一个捕获事件的元素,然后向上冒泡时其中一个才是选择器匹配的元素*/

}, 

 js-jq-event-diff:{ 

  currentTarget: null/*貌似一般都为null*/

              || div#test/*jq选择器匹配的元素在[currentTarget]属性*/, 

  eventPhase: 0 || 2, 

  toElement: div#test 

}, 

 js-event-solo:{ 

  x: 58, 

  y: 13, 

  cancelBubble: false, 

  charCode: 0, 

  clipboardData: undefined, 

  dataTransfer: null, 

  defaultPrevented: false, 

  srcElement: div#test, 

  fromElement: null, 

  detail: 1, 

  keyCode: 0, 

  layerX: 58, 

  layerY: 13, 

  returnValue: true

}, 

 jq-event-solo: { 

  buttons: undefined, 

  data: undefined, 

  delegateTarget: div#test/*谁在监听?就是这个元素啦。*/, 

  isDefaultPrevented: function, 

  handleObj: Object, 

  jQuery211024030584539286792: true, 

  originalEvent: MouseEvent, 

  shiftKey: false

} 

 body-click-delegate-event: { 

  currentTarget: HTMLBodyElement, 

  delegateTarget: HTMLBodyElement, 

  target: HTMLDivElement 

}

总结:

js的event参数中,不管是target, toElement, srcElement都是指向第一个触发事件的元素(还没冒泡),而fromElement在click事件中为null,所以,你如果是设置包含很多元素的父容器parent事件,那么触发事件的很可能是这个parent的子元素。
因此,在实际应用中,如果要引用parent,那你只能使用this了
jq的event参数中,
currentTarget是匹配你选择器的元素,就是你的所要元素;
delegateTarget是在监听事件的元素,属于被委托的元素
target同js的event参数里的target,是第一个触发事件的元素,没currentTarget有用(也不一定,比如在bodyclick事件中的应用)
有同学可能说,你要直接引用被设备事件的元素用this就得啦,何必理解currentTarget和target呢。这个想法证明你还只是用下jQuery而已,没用过类似Backbone之类的工具。

Backbone很多地方绑定了this,所以在它的函数中用this是不行的:

var view = Backbone.View.extend({ 

  el: document.body, 

   events: { 

    'click p': 'showText'     // 委托body监听p的click事件   }, 

   showText: function(e){ 

    var p = e.currentTarget;  // [currentTarget]获取选择器匹配的元素     this.log(p.innerHTML);    // 看到了吧,this并不指向p元素   }, 

   log: function(msg){ 

    console.log(msg); 

  } 

});

虽然JS,JQ中event对象大同小异,但还是有些许区别的,大家是否了解了呢

Javascript 相关文章推荐
可缩放Reloaded-一个针对可缩放元素的复用组件
Mar 10 Javascript
jQuery第三课 修改元素属性及内容的代码
Mar 14 Javascript
用jquery设置按钮的disabled属性的实现代码
Nov 28 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
Sep 08 Javascript
JavaScript实现网页头部进度条刷新
Apr 16 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
Sep 25 Javascript
javascript实现小型区块链功能
Apr 03 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 Javascript
vue实现列表垂直无缝滚动
Apr 08 Vue.js
JavaScript实现大数的运算
Nov 24 #Javascript
使表格的标题列可左右拉伸jquery插件封装
Nov 24 #Javascript
jQuery实现隔行背景色变色
Nov 24 #Javascript
jQuery实现统计复选框选中数量
Nov 24 #Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 #Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 #Javascript
基于jQuery实现下拉框
Nov 24 #Javascript
You might like
PHP 文件类型判断代码
2009/03/13 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php上传文件问题汇总
2015/01/30 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
js canvas实现画图、滤镜效果
2018/11/27 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Python使用graphviz画流程图过程解析
2020/03/31 Python
python实现坦克大战
2020/04/24 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
索尼巴西商店:Sony巴西
2019/06/21 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
抗洪抢险事迹材料
2014/05/06 职场文书
岗位说明书怎么写
2014/07/30 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Java8中Stream的一些神操作
2021/11/02 Java/Android