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 相关文章推荐
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
Feb 07 Javascript
javascript suggest效果 自动完成实现代码分享
Feb 17 Javascript
JavaScript打开word文档的实现代码(c#)
Apr 16 Javascript
wap图片滚动特效无css3元素纯js脚本编写
Aug 22 Javascript
jquery实现的横向二级导航效果代码
Aug 26 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 Javascript
小程序的上传文件接口的注意要点解析
Sep 17 Javascript
vue实现拖拽效果
Dec 23 Javascript
Vue中 axios delete请求参数操作
Aug 25 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP Directory 函数的详解
2013/03/07 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
js 表格隔行颜色
2009/12/02 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
使用console进行性能测试
2015/04/27 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
jquery学习笔记之无new构建详解
2017/12/07 jQuery
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
用python代码做configure文件
2014/07/20 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
keras打印loss对权重的导数方式
2020/06/10 Python
vscode调试django项目的方法
2020/08/06 Python
师范学院毕业生求职信范文
2013/12/26 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
小学家长通知书评语
2014/12/31 职场文书
个人年底工作总结
2015/03/10 职场文书
活着观后感
2015/06/03 职场文书
Nginx快速入门教程
2021/03/31 Servers
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android