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 相关文章推荐
javascript 节点遍历函数
Mar 28 Javascript
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
js替换字符串中所有指定的字符(实现代码)
Aug 17 Javascript
JavaScript  event对象整理及详细介绍
Oct 10 Javascript
解析ajaxFileUpload 异步上传文件简单使用
Dec 30 Javascript
微信小程序 this和that详解及简单实例
Feb 13 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
angularJS自定义directive之带参方法传递详解
Oct 09 Javascript
深入理解react 组件类型及使用场景
Mar 07 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 Javascript
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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
List Installed Hot Fixes
2007/06/12 Javascript
javascript call和apply方法
2008/11/24 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
简述vue状态管理模式之vuex
2018/08/29 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
python删除特定文件的方法
2015/07/30 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
没编程基础可以学python吗
2020/06/17 Python
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
自荐信的两点禁忌
2013/10/30 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
2014年质检员工作总结
2014/11/18 职场文书
2015年采购员工作总结
2015/04/27 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers