- 浏览: 2623384 次
- 性别:
- 来自: 小胖儿的大城
文章分类
最新评论
-
ni4wangba0:
ni4wangba0 写道亲测,算法有问题。对不起,其实是我自 ...
谈谈"求线段交点"的几种算法(js实现,完整版) -
ni4wangba0:
亲测,算法有问题。
谈谈"求线段交点"的几种算法(js实现,完整版) -
kers007:
苹果不让Webapp 在appstore 里发布,我不知道对 ...
苹果真的要在 AppStore 里封杀 WebApp 吗? -
striveandlive:
fins = js大牛
[原创]GT-Template, 一个超轻量级的js模板工具. -
AlwaysYang:
基础扎实的才能行走天下。
关于body的"大小"在ie和ff下的一些基础知识
2008-03-20更新一个临时解决方案.
测试发现,Ext2.02在IE下无法正常释放被删除的元素(当该元素被注册了事件时)
经过分析 发现ext事件机制中的一个bug
(
bug 具体描述见: http://fins.iteye.com/blog/173218
测试使用工具见: http://fins.iteye.com/blog/172891
)
使用 el.on(eventName, fn) 为el添加事件
调用 Ext.destroy(el) 方法移除el
此时,如果fn为全局类型,或者是被全局对象引用, 那么会使el元素成为孤立节点,无法彻底移除.
而如果在 Ext.destroy(el) 之前, 调用 el.un(eventName, fn) 移除添加的事件,
那么就可以彻底移除. 但是直接使用 Ext.destroy 才是ext中描述的正确做法,
切ext内部也都是这样使用的, 所以应该将解决问题的着手点放在 el.on 和 Ext.destroy方法上.
经过测试 Ext.destroy el.removeNode 均无问题. 核心问题在 事件机制. 下面详细分析一下.
==============================
产生问题的原因
执行Element.removeAllListeners时没有调用 EventManager.stopListener中的
"删除 fn._handlers 缓存内的相关数据 "
导致在IE下 当 fn 为全局对象 或者是被引用时, 元素无法被正确移除.
-----------------------------------------
如果只是简单的修改 Element.removeAllListeners
让其 调用 Ext.Event.un 时 改成调用 EventManager.stopListener 是不行的
因为 Element.removeAllListeners 调用 Ext.Event.un 时 ,传递的函数参数是h, 而不是最初的fn
但是 EventManager.stopListener需要得到 最初的fn.
-----------------------------------------
现在的情况是 从 fn 能找到h (fn._handlers) ,但是 通过h无法找到fn
缓存Ext.Event._listeners 中也没有存放 最初的fn.
-----------------------------------------
也许可以考虑在 removeAllListeners 或 purgeElement 中对 fn._handlers 进行清除,但是 拿不到 最初的fn
-----------------------------------------
如果之前 强制 做一个引用, 例如 h._core =fn;
然后在 Element.removeAllListeners 加以利用 利用完之后 再清除, 似乎看起来不错
但是我试了 ,失败 !!!!
具体原因我也说不清
==================================
我觉得 如果要解决 这个bug 确实要对ext的整个事件机制做一番大改动.(恕我直言,ext的这套事件机制真的有点太.... )
以上是我最近研究的成果
发上来和大家分享,如果说的不对 请务必一定马上纠正我, 以免误人子弟 谢谢大家了
======================================
下面附上刚刚写出的解决方案,请大家拍砖, 我想肯定还有更好的方法.
第一步 ========================
EventManager.js 153行
第二步 ========================
ext-base.js 227行
测试发现,Ext2.02在IE下无法正常释放被删除的元素(当该元素被注册了事件时)
经过分析 发现ext事件机制中的一个bug
(
bug 具体描述见: http://fins.iteye.com/blog/173218
测试使用工具见: http://fins.iteye.com/blog/172891
)
使用 el.on(eventName, fn) 为el添加事件
调用 Ext.destroy(el) 方法移除el
此时,如果fn为全局类型,或者是被全局对象引用, 那么会使el元素成为孤立节点,无法彻底移除.
而如果在 Ext.destroy(el) 之前, 调用 el.un(eventName, fn) 移除添加的事件,
那么就可以彻底移除. 但是直接使用 Ext.destroy 才是ext中描述的正确做法,
切ext内部也都是这样使用的, 所以应该将解决问题的着手点放在 el.on 和 Ext.destroy方法上.
============================= 销毁元素的方法(很简单) ============================= Ext.destroy(el){ el.removeAllListeners(); el.removeNode(); }
经过测试 Ext.destroy el.removeNode 均无问题. 核心问题在 事件机制. 下面详细分析一下.
============================= 给一个元素添加事件 ============================= Element.on(eventName, fn) { el=this; 调用 EventManager.on( el,eventName, fn ){ 调用 EventManager.listener( el,eventName, fn ){ 包装 h <---- fn 缓存 fn._handlers <---- [ [h] ] 调用 Ext.Event.on( el,eventName, h ) { 包装 wfn <---- h 缓存 Ext.Event._listeners <---- [ el , eventName, h, wfn ] el.addEvent( wfn ) } } } } 注意:真正注册到el上的事件是wfn
============================= 移除一个元素的事件 ============================= Element.un(eventName, fn) { el=this; 调用 EventManager.un( el,eventName, fn ){ 调用 EventManager.stopListener( el,eventName, fn ){ 取得之前缓存的 h <---- fn._handlers 删除 fn._handlers 缓存内的相关数据 调用 Ext.Event.un( el,eventName, h ) { 取得之前缓存的 wfn <---- Ext.Event._listeners el.removeEvent( wfn ) 删除 Ext.Event._listeners 缓存内的相关数据 } } } }
============================= 移除一个元素的所有注册的事件 ============================= Element.removeAllListeners() { el=this; 调用 Ext.Event.purgeElement(el){ 取得缓存中所有的和el相关的信息 l[] <---- Ext.Event._listeners <循环开始 l[] > 从 l中取得 eventName <---- l[i]; 从 l中取得 h <---- l[i]; 调用 Ext.Event.un( el,eventName, h ) { 取得之前缓存的 wfn <---- Ext.Event._listeners el.remove( wfn ) 删除 Ext.Event._listeners 缓存内的相关数据 } <循环结束> } }
==============================
产生问题的原因
执行Element.removeAllListeners时没有调用 EventManager.stopListener中的
"删除 fn._handlers 缓存内的相关数据 "
导致在IE下 当 fn 为全局对象 或者是被引用时, 元素无法被正确移除.
-----------------------------------------
如果只是简单的修改 Element.removeAllListeners
让其 调用 Ext.Event.un 时 改成调用 EventManager.stopListener 是不行的
因为 Element.removeAllListeners 调用 Ext.Event.un 时 ,传递的函数参数是h, 而不是最初的fn
但是 EventManager.stopListener需要得到 最初的fn.
-----------------------------------------
现在的情况是 从 fn 能找到h (fn._handlers) ,但是 通过h无法找到fn
缓存Ext.Event._listeners 中也没有存放 最初的fn.
-----------------------------------------
也许可以考虑在 removeAllListeners 或 purgeElement 中对 fn._handlers 进行清除,但是 拿不到 最初的fn
-----------------------------------------
如果之前 强制 做一个引用, 例如 h._core =fn;
然后在 Element.removeAllListeners 加以利用 利用完之后 再清除, 似乎看起来不错
但是我试了 ,失败 !!!!
具体原因我也说不清
==================================
我觉得 如果要解决 这个bug 确实要对ext的整个事件机制做一番大改动.(恕我直言,ext的这套事件机制真的有点太.... )
以上是我最近研究的成果
发上来和大家分享,如果说的不对 请务必一定马上纠正我, 以免误人子弟 谢谢大家了
======================================
下面附上刚刚写出的解决方案,请大家拍砖, 我想肯定还有更好的方法.
第一步 ========================
EventManager.js 153行
//修改 Ext.EventManager的 私有方法 listen // E.on(el, ename, h); // 改为如下 (即,多传一个最初的 fn) E.on(el, ename, h , fn);
第二步 ========================
ext-base.js 227行
//修改 Ext.lib.Event 的 addListener 和 removeListener 方法 addListener: function(el, eventName, fn , ofn) { el = Ext.getDom(el); if (!el || !fn) { return false; } if ("unload" == eventName) { unloadListeners[unloadListeners.length] = [el, eventName, fn]; return true; } // prevent unload errors with simple check var wrappedFn = function(e) { return typeof Ext != 'undefined' ? fn(Ext.lib.Event.getEvent(e)) : false; }; var li = [el, eventName, fn, wrappedFn,ofn]; var index = listeners.length; listeners[index] = li; this.doAdd(el, eventName, wrappedFn, false); return true; }, removeListener: function(el, eventName, fn) { var i, len; el = Ext.getDom(el); if(!fn) { return this.purgeElement(el, false, eventName); } if ("unload" == eventName) { for (i = 0,len = unloadListeners.length; i < len; i++) { var li = unloadListeners[i]; if (li && li[0] == el && li[1] == eventName && li[2] == fn) { unloadListeners.splice(i, 1); return true; } } return false; } var cacheItem = null; var index = arguments[3]; if ("undefined" == typeof index) { index = this._getCacheIndex(el, eventName, fn); } if (index >= 0) { cacheItem = listeners[index]; } if (!el || !cacheItem) { return false; } this.doRemove(el, eventName, cacheItem[this.WFN], false); fn=listeners[index][4]; if (fn){ var id = Ext.id(el), hds = fn._handlers, hd = fn; if(hds){ for(var i = 0, len = hds.length; i < len; i++){ var h = hds[i]; if(h[0] == id && h[1] == eventName){ hd = h[2]; hds.splice(i, 1); break; } } } } delete listeners[index][this.WFN]; delete listeners[index][this.FN]; listeners.splice(index, 1); return true; },
发表评论
-
HTML5 与 ”性工能“障碍
2012-12-13 18:08 9613HTML5 与 ”性工能“障碍 最近看了@王淮Harr ... -
聊聊 iOS 5 和 iOS 6 在HTML5 canvas渲染上的差异
2012-09-13 18:40 6012我录制了一段iphone4s 下 ios 5 和 ios 6 ... -
尝试挑战 running panda , HTML5的跑酷类游戏(开发中)
2011-08-01 00:02 6077我业余时间一直在尝试用HTML5 在ios平台上开发webga ... -
移动互联网 与 Web标准化技术
2011-07-14 19:54 3734移动互联网 与 Web标准化技术 ... -
为什么我喜欢safari 胜过chrome和ff?
2011-07-04 00:35 7852抛下IE不谈,目前在浏览器市场里 最受欢迎的莫过于chrome ... -
欢迎参加 "移动平台HTML5动画性能大赛"
2011-03-31 11:38 3827移动平台HTML5动画性能大赛 注 : 此页面为临时页面 待 ... -
为什么在今天,我要选择HTML5 (上) 【此文标题党,还是别看了】
2011-03-30 16:19 4052当初苹果禁止Flash登陆iOS设备时,曾经引起过一场“HTM ... -
HTML5游戏开发入门实例<脆弱的马里奥>
2011-03-14 20:10 10207HTML5游戏开发入门实例<脆弱的马里奥>: ht ... -
3月26号,北京,我将做一期HTML5游戏开发的技术讲座,欢迎参加.
2011-03-11 11:57 21623月26号,我将去北京做一次"html5游戏开发入门 ... -
w3ctech 2011 - 拥抱HTML5 技术大会即将召开,欢迎报名
2011-03-03 23:46 1666w3ctech 2011 - 拥抱HTML5 技术会议将于4月 ... -
[新增视频]我在<当HTML5来敲门>技术沙龙上做的一个关于HTML5游戏开发的分享
2011-02-27 11:03 1952我在2月26号的<当HTML5来敲门>技术沙龙上做 ... -
说说 iOS safari在retina屏下显示图像的原理
2011-02-24 17:05 8225我在 简析 HTML5 canvas在retina屏(视网膜屏 ... -
一个 HTML5 编写的 简谱播放程序
2011-02-17 15:14 3868一个 HTML5 编写的 简谱播放程序 : http:// ... -
试用了一下 HP touchPad ,有点小失望.
2011-02-16 12:57 2835我手里的这台机器是 工程样机. 从样机来看, 这台平板并不出色 ... -
简析 HTML5 canvas在retina屏(视网膜屏幕,如iphone4)设备上的优化(更新原理)
2011-02-11 04:01 9588随着iphone4 的推出, retina ... -
[更新,bug修复了]chrome开启canvas 2D GPU加速后, clearRect的一个严重bug.
2011-01-24 15:54 9867最新版的 chromium. 已经修复了这个bug 经过进一 ... -
我也来重复造个轮子吧 ,发布一个利用原型,在Javascript中实现类机制的简单框架: GT-Class
2011-01-07 11:23 3458我也来重复造个轮子吧 ,发布一个利用prototype(原型, ... -
关于"GPU加速"的简单问答.
2011-01-05 22:34 2756如今使用GPU来代替CPU进 ... -
求助:用这样的方式写Kissy组件,可行吗?(Kissy推荐的方式是怎样的?)
2010-12-29 09:43 2044看了Kissy自带组件的代码,又看了你在D2上的PPT , 看 ... -
简单聊一聊百度的开源JS库:Tangram
2010-12-24 12:20 9547简单聊一聊百度的开源JS库:Tangram 最近百度开源了 ...
相关推荐
"mimetype"和"ext_20docs.xml"通常是电子书或离线文档的标准组成部分,"mimetype"指定了文档的类型,而"ext_20docs.xml"可能是EXT2.02 API文档的元数据或索引文件。 总的来说,EXT2.02文档下载提供了EXT框架的重要...
但我们可以从博客链接(https://pengjj2.iteye.com/blog/1197832)推测,博主可能分享了他们在使用Ext JS 2.02版本时的经验、遇到的问题及解决方案,或者对新特性和性能优化进行了分析。 标签“源码”和“工具”...
ext 2.02 sample包ext 2.02 sample包ext 2.02 sample包ext 2.02 sample包ext 2.02 sample包
EXT2.02_API 对方法和属性都有详细的介绍
这个zip文件中包含的“grub-2.02~beta2-for-windows”可能是GRUB2的Windows安装程序或者工具集,用于在Windows下安装、更新或修复GRUB2配置。使用这样的工具,用户无需在Linux环境中进行操作,简化了对GRUB2的管理和...
在Ext Js 2.02中,表单组件(FormPanel)提供了一套完整的表单创建和验证机制。开发者可以方便地添加各种输入控件,如文本框、下拉列表、日期选择器等,并通过Validator进行数据验证,确保用户输入的数据符合业务...
ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0
Pivot-D3是EXT-D3的一个补充,它提供了一种高效的数据透视表解决方案。数据透视表是一种强大的数据分析工具,允许用户快速汇总、分析和理解大量数据。Pivot-D3组件通过EXT JS的API提供这种功能,用户可以通过拖放...
spketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-...
Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-...
ext-ms-win-gdi-desktop-l1-1-0.dll 用于解决这个dll文件丢失问题,下载后将此文件放置在相关文件根目录下,即可解决丢失问题
在实际项目中,开发者可以通过Maven或者Gradle等构建工具将EXT3.jar作为依赖引入,然后在Java代码中创建EXT组件并进行事件绑定,实现业务逻辑。 在网站开发中,EXT框架的使用可以提供强大的用户界面,例如,通过EXT...
在“Extjs源码之--Ext事件机制/继承关系”中,我们将深入探讨EXTJS如何处理事件以及其类层次结构。EXTJS的事件处理主要由EventManager.js这个文件负责,它是EXTJS事件系统的基础。 首先,EXTJS的事件机制基于观察者...
3. **ext-all-dev.js, ext-all-debug-w-comments.js, ext-all-debug.js, ext-all.js, ext-debug.js, ext.js**:这些都是Ext JS的核心库文件,不同文件的用途各有侧重: - `ext-all-dev.js`:包含了所有组件和功能,...
《哈工大版Chinese-BERT-wwm-ext for PyTorch深度解析》 在自然语言处理(NLP)领域,预训练模型已经成为基石,而BERT(Bidirectional Encoder Representations from Transformers)模型更是其中的明星。本文将深入...
DW CS3--EXT2.2插件DW CS3--EXT2.2插件DW CS3--EXT2.2插件DW CS3--EXT2.2插件DW CS3--EXT2.2插件
这个"ext-3-to-4-migration-pack.zip"包含的兼容性文件可能用于解决不同硬件或旧版软件与EXT4之间的兼容性问题,确保升级过程顺利进行。教程将详细指导用户如何执行上述步骤,以及如何处理可能出现的问题。通过遵循...
Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发实例宝典光盘源码Ext JS源码分析与开发...
3. **错误日志分析**:如果EXT JS在运行时抛出错误,通常会在控制台打印出错误信息。这些信息对于定位问题非常有帮助,因为它们会显示错误的类型、发生位置和可能的原因。 4. **版本兼容性**:确认EXT JS库的版本与...
总结来说,jcifs-ext-0.9.4.jar是Java应用与AD域集成的重要工具,特别是对于基于CAS的SSO解决方案。它简化了身份验证过程,增强了跨平台的兼容性和安全性。在设计和实现涉及Windows域服务的Java应用时,jcifs-ext库...