读Ext之四(事件的低级封装)
十一前读了Ext core的Ext.js,这篇开始读ext-base-event.js。该文件定义了Ext.lib.Event对象,Ext.lib这个命名空间在Ext core的Ext.js中命名的。
?
doAdd,亦是一个匿名函数执行后返回新函数,用来给html元素添加事件及事件响应函数(handler)。这个函数和多数的事件添加函数差不多,用特性判断 。标准浏览器使用addEventListener添加,IE系列使用attachEvent,都不支持则返回一个空函数。这里有几点,
1,有的代码中使用特性判断时,先写win.attachEvent,后是win.addEventListener。这是不对的,应该优先使用标准的addEventListener,而IE9同时支持这两种方式。
2,这里新增了mouseenter /mouseleave 事件,它们仅IE支持。mouseenter不同于mouseover,它是在第一次鼠标进入节点区域时触发,以后在节点区域内(子节点间)移动时不触发。Goodbye mouseover, hello mouseenter 详细讲述了使用mouseenter的好处。此处 有简单的实现。
这里为非IE浏览器间接实现了这两个事件,需要另两个函数的辅助私有的getPageCoord方法用来获取鼠标事件时相对于文档的坐标(水平,垂直)。
Firefox引入了pageX / Y ,IE9/Safari/Chrome/Opera虽然支持但仅在文档(document)内而非页面(page)。
Safari/Chrome/Opera可以使用标准的clientX/Y获取,IE下可通过clientX/Y与scrollLeft/scrollTop计算得到。
IE9实际上也可通过clientX/Y获取,这里判断浏览器Ext.isIE在IE9正式版即将发布后明显欠妥。?
再往下就是一个对象pub,匿名函数执行后会返回该对象。猜测pub是public的简写,即匿名函数执行后对外公开的接口对象(pub)。pub有以下方法
getListeners : function(el, eventName) { Ext.EventManager.getListeners(el, eventName);},// deprecated, call from EventManagerpurgeElement : function(el, recurse, eventName) { Ext.EventManager.purgeElement(el, recurse, eventName);},这两个方法在后续讲述。
1 楼 lixinlixin2008 2010-11-11 赞z兄,学习了。
再下对load, unload做了单独处理。
Ext.lib.Event完毕。
1,elContains非IE用compareDocumentPosition 更快吧~~~~
2,“使用局部变量win,doc比直接使用window,document要快。因为它们存在于执行函数的活动对象中,解析标识符只需要查找作用域链中的单个对象。
而读取变量值的耗时是随着查找作用域链的逐层深入而不断增加。”
唉,性能的最大消耗还是DOM,渲染repait、refolw(拼写有误),和网络请求。。。html不给力啊。。。 2 楼 zhouyrt 2010-11-12 谢谢 天堂, 已修改。 3 楼 clue 2010-11-12 lixinlixin2008 写道赞z兄,学习了。
1,elContains非IE用compareDocumentPosition 更快吧~~~~
2,“使用局部变量win,doc比直接使用window,document要快。因为它们存在于执行函数的活动对象中,解析标识符只需要查找作用域链中的单个对象。
而读取变量值的耗时是随着查找作用域链的逐层深入而不断增加。”
唉,性能的最大消耗还是DOM,渲染repait、refolw(拼写有误),和网络请求。。。html不给力啊。。。
第1点,直接沿Dom树往上找速度很快的,compareDocumentPosition还实现了前后位置比较,运算量更大吧?猜测的...
第2点,前些日子翻JE上的旧帖,才知道这样做还有一个含义:
将window、document等外部(非函数作用域内)变量存于本地变量中,这样JS压缩程序就能对它们进行名称替换,获得更高的压缩率。
这点真不是一般人能想到的…… 现在写JS代码已经有意识地将用得多的外部对象存于本地变量中,这样就能成功被压缩程序混淆了,嘿嘿 4 楼 zhouyrt 2010-11-12 非常感谢clue,你说的第二点还真没想到。哈哈又学一招。 5 楼 hyj1254 2010-11-14 引用将window、document等外部(非函数作用域内)变量存于本地变量中,这样JS压缩程序就能对它们进行名称替换,获得更高的压缩率。
确实,这也是个好处,还真没想到。 6 楼 duchengning 2010-11-18 我的hoouf.com中用到createChild,在其他浏览器没问题,但是IE9出不来,也没想到好的替代方法,请各位指点一下。大概代码如下:
var rd = Ext.getDom('regVerCode');
var rd0 = Ext.get(rd.parentNode);
rd0.createChild({
tag: 'img',
src: '/Captcha.jpg',
width: '80',
height: '25',
align: 'absbottom',
onclick: "this.src=getCaptcha()",
title: "点击刷新验证码"
});