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中获取未知对象属性的代码
Apr 27 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
js中函数声明与函数表达式
Jun 03 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 Javascript
Vue响应式原理详解
Apr 18 Javascript
原生JS 购物车及购物页面的cookie使用方法
Aug 21 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 Javascript
微信小程序中实现手指缩放图片的示例代码
Mar 13 Javascript
javascript匿名函数中的'return function()'作用
Oct 15 Javascript
express express-session的使用小结
Dec 12 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 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
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
php日历制作代码分享
2014/01/20 PHP
ThinkPHP路由详解
2015/07/27 PHP
文字幻灯片
2006/06/26 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
js闭包用法实例详解
2016/12/13 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Scrapy框架使用的基本知识
2018/10/21 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
医院保洁服务方案
2014/06/11 职场文书
学校党员对照检查材料
2014/08/28 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
JS中如何优雅的使用async await详解
2021/10/05 Javascript
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技