Ext库也对浏览器原生的事件对象做了包装,以保证兼容所有浏览器。
这里
列举了浏览器原生事件对象各浏览器中兼容性。
这里
列出了各种情况下事件对象的获取。
在Ext事件管理类 Ext.EventManager 中会悄悄的将浏览器原始事件对象进行转换
e = Ext.EventObject.setEvent(e);
Ext.EventObject 即为包装后的事件对象(暂称为Ext事件对象)。先从全局上看看该对象的实现,其中...省略了部分代码。
Ext.EventObject = function(){
var E = Ext.lib.Event,
...;
Ext.EventObjectImpl = function(e){
if(e){
this.setEvent(e.browserEvent || e);
}
};
Ext.EventObjectImpl.prototype = {
/** @private */
setEvent : function(e){
var me = this;
...
},
...
};
return new Ext.EventObjectImpl();
}();
可看到匿名函数执行后返回了Ext.EventObjectImpl的实例对象,该对象才是真正的Ext.EventObject。
这一点和jQuery类似,jQuery中是new了一个Event类。
第一句
var E = Ext.lib.Event,
变量E暂存了Ext.lib.Event对象,该对象在 读Ext之四
中已经介绍了。后面的很多方法都要用 E 来实现。
第二个变量 safariKeys 为一个对象,
// safari keypress events for special keys return bad keycodes
safariKeys = {
3 : 13, // enter
63234 : 37, // left
63235 : 39, // right
63232 : 38, // up
63233 : 40, // down
63276 : 33, // page up
63277 : 34, // page down
63272 : 46, // delete
63273 : 36, // home
63275 : 35 // end
},
注释说是为了修复Safari中keypress事件返回错误的键码。但我用Safari 5.0.3测试input,document.body 。
回车键(enter)返回的是13,正确的。
方向键(left等)和翻页键(page up等)则不会触发。
测试代码如下
var inp = document.getElementById('txt');
inp.onkeypress = function(e){
e = window.event || e;
alert(e.keyCode);
}
document.body.onkeypress = function(e){
e = window.event || e;
alert(e.keyCode);
}
之前已经提到过要获取按键值应该使用keydown或keyup事件。这里应该是为了兼容旧版本的Safari。
第三个变量是btnMap
// normalize button clicks
btnMap = Ext.isIE ? {1:0,4:1,2:2} :
(Ext.isWebKit ? {1:0,2:1,3:2} : {0:0,1:1,2:2});
用来统一鼠标按键值。这里
有详细分析,不重复了。
经测试,webkit内核的Safari5和Chrome7在mousedown/mouseup事件中左,中,右键返回的是符合标准的0,1,2。
因此这里对webkit的判断是可去掉的。
接下来是 Ext.EventObjectImpl 类的定义,
Ext.EventObjectImpl = function(e){
if(e){
this.setEvent(e.browserEvent || e);
}
};
如果传了浏览器原生事件对象,则调用this.setEvent,this.setEvent是挂在Ext.EventObjectImpl的原型上的。
原型上还有很多其它方法,逐个看
setEvent : function(e){
var me = this;
if(e == me || (e && e.browserEvent)){ // already wrapped
return e;
}
me.browserEvent = e;
if(e){
// normalize buttons
me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1);
if(e.type == 'click' && me.button == -1){
me.button = 0;
}
me.type = e.type;
me.shiftKey = e.shiftKey;
// mac metaKey behaves like ctrlKey
me.ctrlKey = e.ctrlKey || e.metaKey || false;
me.altKey = e.altKey;
// in getKey these will be normalized for the mac
me.keyCode = e.keyCode;
me.charCode = e.charCode;
// cache the target for the delayed and or buffered events
me.target = E.getTarget(e);
// same for XY
me.xy = E.getXY(e);
}else{
me.button = -1;
me.shiftKey = false;
me.ctrlKey = false;
me.altKey = false;
me.keyCode = 0;
me.charCode = 0;
me.target = null;
me.xy = [0, 0];
}
return me;
},
var me = this; 将this暂存到me上。接着判断所传的是否就是本身,如果是则不再包装直接返回。
仅当是浏览器原生事件对象才进行包装。
me.browserEvent = e; 把浏览器原始事件对象挂在this上,即该类的字段browserEvent就是浏览器原始对象。
因为有时会用到浏览器原始对象。
me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1);
先从btnMap中取,上面已经提到了。e.which原本是键盘事件,jQuery中将鼠标按键也存在e.which中,Ext这里是为了兼容jQuery。
if(e.type == 'click' && me.button == -1){
me.button = 0;
}
建议获取判断鼠标按下哪个键应该使用mousedown/mouseup事件,这里是为了兼容click事件。
但有点问题,IE6/7/8中左键单击(click)事件为0,但中键和右键单击(click)则无法触发该事件。这里的实现欠妥。
me.type = e.type;
me.shiftKey = e.shiftKey;
事件类型(如click)和shiftKey复制到this上。
接着是ctrlKey,altKey,keyCode,charCode。
接着是target,使用E.getTarget(e)获取。E.getTarget在第四篇提到了。
接着是xy,xy不是事件对象原有的属性。而是Ext自定义的。
setEvent说了,看stopEvent
stopEvent : function(){
var me = this;
if(me.browserEvent){
if(me.browserEvent.type == 'mousedown'){
Ext.EventManager.stoppedMouseDownEvent.fire(me);
}
E.stopEvent(me.browserEvent);
}
},
用来停止事件冒泡,阻止元素默认行为。
有两点,其一对mousedown事件做了特殊处理Ext.EventManager.stoppedMouseDownEvent 实际是Ext.util.Event类的一个实例对象。如
pub.stoppedMouseDownEvent = new Ext.util.Event();
后续有一篇会读到该类。
其二,调用了E.stopEvent(me.browserEvent),这里的E即为Ext.lib.Event对象,第四篇提到了。
接着是preventDefault,stopPropagation等
preventDefault : function(){
if(this.browserEvent){
E.preventDefault(this.browserEvent);
}
},
stopPropagation : function(){
var me = this;
if(me.browserEvent){
if(me.browserEvent.type == 'mousedown'){
Ext.EventManager.stoppedMouseDownEvent.fire(me);
}
E.stopPropagation(me.browserEvent);
}
},
可看到都是调用E(Ext.lib.Event)来实现的,不再重复。
getTarget 采用事件代理时会用到,实现上用到了Ext.fly等。后续提到。
getWheelDelta 用来获取滚轮的速度
getWheelDelta : function(){
var e = this.browserEvent;
var delta = 0;
if(e.wheelDelta){ /* IE/Opera. */
delta = e.wheelDelta/120;
}else if(e.detail){ /* Mozilla case. */
delta = -e.detail/3;
}
return delta;
},
IE/Safari/Chrome/Opera中使用事件对象的wheelDelta属性,Firefox则使用detail属性。
属性的方向值也不一样,IE向前滚 > 0为120,相反在-120,Firefox向后滚 > 0为3,相反则-3。
好了,整个Ext事件对象读完了。可以看到Ext为了保证兼容,统一对原生事件对象做了修复,扩充等。
分享到:
相关推荐
在深入探讨“读Ext之十(解析JSON)”这一主题之前,我们首先需要理解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,设计简单且易于人阅读和编写,同时...
标题“读Ext之十三(Ext元素)”暗示我们将关注Ext.js中的元素操作,这是构建用户界面的基础。Element是Ext.js中的一个核心类,它封装了DOM元素的操作,提供了大量便捷的方法来处理样式、事件、动画等。 描述中提到...
在Ext框架中,面向对象的概念得到了进一步的强化和扩展,为开发复杂的Web应用程序提供了强大的支持。下面将详细解释标题和描述中涉及的各个知识点: 1. **命名空间**:命名空间是避免全局变量冲突的一种手段,它...
标题“Ext获取对象”指的是在Ext JS框架中获取或操作对象的方法。Ext JS是一个流行的JavaScript库,用于构建桌面和移动应用程序的用户界面。它提供了一种面向对象的编程模型,使得开发者可以方便地管理和操作组件、...
EXT JS不仅支持原生的DOM事件(如`mousedown`、`mouseup`、`mouseover`等),还提供了一些合成事件,如`itemclick`,这在处理网格或树形视图等复杂组件时非常有用。 4. ** bubbling 和 capturing** EXT JS支持事件...
ext封装的太死板,里面有常用到的15个ext.js触发事件和监听事件,对ext了解的不是特别深入,大部分都是经常碰到的
本文将深入探讨“读Ext之十二(在各个位置插入元素)”这一主题,主要关注如何利用ExtJS中的DomHelper工具来高效地在DOM树中插入元素。 首先,DomHelper是ExtJS中用于操作DOM的一个重要工具类,它的主要职责是创建...
标题中的“ext BUG修复补丁”指的是针对EXTJS框架中的某个或多个错误或漏洞的修复措施。EXTJS是一个流行的JavaScript库,用于构建富客户端Web应用程序。它提供了丰富的组件和工具,如表格、面板、菜单、窗口等,使...
"读Ext之十五(操作批量元素)"这篇博客文章可能详细讲解了如何在ExtJS中对多个DOM元素进行批量操作,这对于提高代码效率和减少重复工作至关重要。在ExtJS中,处理一组元素时,我们通常会使用CompositeElementLite类...
Linux系统EXT3修复工具是针对Linux环境中广泛使用的EXT3文件系统的故障排查和恢复工具。EXT3,全称为“Third Extended File System”,是Linux系统的一种日志文件系统,它在90年代末期由Hans Reiser开发并逐渐成为...
EXTjs2 的treeNode 带有checkbox,可是API中,关于checkbox的事件就只有一个checkchange事件,所以写个方法传上来。
在JavaScript的世界里,面向对象(Object-Oriented Programming, OOP)是一种常用的设计模式,它允许我们通过类和对象来组织代码,实现代码的复用和模块化。本篇文章将探讨EXTJS框架中的面向对象机制,特别是继承的...
Linux最常用的文件系统类型之一就是EXT系列,包括EXT2、EXT3和EXT4。然而,Windows操作系统默认并不支持直接读取这些格式的分区。这时,就需要借助第三方工具来实现这一目标,例如“Windows读取Ext4分区的工具”——...
通过对Windows 2000/2003/XP提供对EXT2/EXT3,XFS,Reiserfs文件系统的原生支持,Windows用户能方便地访问Linux分区的数据,并提供本地磁盘级性能。对windows下访问Linux文件有极大帮助。 用法参见:...
可以读写Ext2,以Ext2方式挂载Ext3文件系统(不支持Ext3日志),不支持中文! It provides Windows NT4.0/2000/XP/2003/Vista/2008 with full access to Linux Ext2 volumes (read access andwrite access). This ...
在探讨“ie9不支持ext对象的问题”时,我们首先需要理解几个关键概念:IE9浏览器、Ext JS框架以及它们之间的兼容性问题。IE9是微软Internet Explorer系列浏览器的一个版本,发布于2011年,它在当时引入了一些新的...
在Windows 10系统上读取ext4格式的文件系统可能需要一些额外的软件支持,因为Windows本身不原生支持ext4格式。以下是一种可行的方法:
标题中的“修复Ext3.0.0中自定义分页的小bug”指的是在Ext JS框架的3.0.0版本中,用户在实现自定义分页功能时遇到的一个问题。Ext JS是一个流行的JavaScript库,主要用于构建富客户端Web应用程序,它的组件库包含了...
它返回一个`Ext.Element`对象,该对象封装了原生的DOM元素,并提供了一系列用于操作这个元素的方法。 **优点**: - **直接访问**:`Ext.get`可以直接通过ID或其他选择器获取DOM元素。 - **功能全面**:通过`Ext....
代码功能: 1、利用io端口读磁盘 2、读ext2文件系统中的文件 注意: 1、代码只在ring0状态下测试通过。 2、代码没有读分区表的功能,group0的位置是通过...3、此代码仅作为用io端口读磁盘和读ext2文件系统的参考代码。