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 相关文章推荐
js实现日期级联效果
Jan 23 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
js钢琴按钮波浪式图片排列效果代码分享
Aug 26 Javascript
js前端面试题及答案整理(一)
Aug 26 Javascript
js实现无缝滚动图
Feb 22 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
vue项目中播放rtmp视频文件流的方法
Sep 17 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
Oct 29 Javascript
vue-cli4.0多环境配置变量与模式详解
Dec 30 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
Symfony生成二维码的方法
2016/02/04 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
python中xrange和range的区别
2014/05/13 Python
python 生成器协程运算实例
2017/09/04 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
小学毕业感言300字
2014/02/19 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
小学英语课教学反思
2016/02/15 职场文书
学校团代会开幕词
2016/03/04 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电