`
silentlakeside
  • 浏览: 108853 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

GWT一个页面包含多个模块时出现的问题

GWT 
阅读更多
GWT版本:1.4.61
浏览器版本:IE6

当一个页面里包含了多个GWT模块时,有可能在发生鼠标事件(主要是mouseover事件)的时候,IE会报javascript错误:Object doesn't support this property or method(对象不支持此属性或方法)。经过测试,GWT编译时如果不使用混淆,则不会出错。

经网上搜索和自己分析得知,该问题主要是由于GWT的浏览器事件管理机制在多个GWT模块间发生冲突造成。

GWT的网站上提供了一个出错的案例,在下面的网址可以找到说明和案例下载:
Issue 1804:    JavaScript Errors generated on mouse events with 2 Modules on 1 Page
本文后面也附上了这个案例的下载。另外在GWT网站的其他页面也有相关的讨论和解决方案:
JavaScript Error on Mouse Events with 2 Modules on 1 Page 选项
Issue 1788:    Only the last module to call DOMImplStandard.init() is able to preview events 
Issue 1546:    Eliminate DOM modifications to body element

首先说一下GWT的事件处理机制。GWT模块里的所有事件都会注册到$wnd.__dispatchEvent函数,如果一个页面存在多个模块,则每个模块都会将自己的组件的事件注册到自己定义的__dispatchEvent函数。
$doc.body.onclick = $doc.body.onmouseover = ... = $wnd.__dispatchEvent;

element.onclick = bits & 1 ? $wnd.__dispatchEvent : null;
...
element.XXX = bits & XX ? $wnd.__dispatchEvent : null;
//bits是每个组件上的一个事件的属性,用于判断是否注册了哪些事件,
//通过跟事件的位标志(如onclick是1)做位比较得知是否注册了该事件。


事件发生后,执行$wnd.__dispatchEvent函数:
var listener, cureElem = this;
while (curElem && !(listener = curElem.__listener))
    curElem = curElem.parentElement;
if (listener)
    com_google_gwt_user_client_DOM_dispatchEvent_Lcom_googel_gwt_user_client_Event_2Lcom_google_gwt_user_client_Element_2Lcom_google_gwt_user_client_EventListener_2($wnd.event, curElem, listener);

当listener存在的时候,最终会调用到如下代码:
listener.onBrwoserEvent__Lcom_google_gwt_user_client_Event_2(evt);


本来不同模块之间的着2段代码都是一致的,所以即使定义了多个__dispatchEvent方法也无所谓,问题是混淆之后,不同模块的组件的__listener属性对象的onBrwoserEvent__Lcom_google_gwt_user_client_Event_2函数会被混淆成不同的名字,如第一个模块叫a函数,第二个叫b函数。这样当多个模块在一个页面里时,有可能出现第一个模块的一个组件的事件发生后在第二个模块定义的__dispatchEvent函数里处理,结果就是调用了b函数,而这个函数在第一个模块的组件的listener属性对象里不存在,这时候就会报javascript错误了:Object doesn't support this property or method(对象不支持此属性或方法)。这也就是不混淆代码的时候就不出错的原因。

为什么多个模块之间的组件事件注册会发生冲突,这个问题我还没有搞清楚。目前的是测试结果表明,并不是所有情况下都会出现这个情况,只是在某些特殊的情况下才会出现,有空的时候我会将对所附的测试案例的分析补充到本文中。
分享到:
评论
1 楼 angjunwen 2010-01-19  
近期正在研究多模块的情况,这个问题值得关注下!

相关推荐

    GWT Demo,GWT学习时的一些小例子

    例如,一个示例可能展示了如何创建一个按钮控件,当用户点击按钮时,通过GWT的RPC机制向服务器发送请求,获取数据并更新页面上的显示。另一个示例可能涉及使用GWT的Composite类来组合多个Widget,创建自定义的复杂...

    GWT-API.rar

    GWT应用通常由多个模块组成,每个模块代表一个独立的功能或者页面。这些模块可以通过GWT的编译过程转换为单独的JavaScript文件,然后在运行时按需加载,有效地减少了页面初始化时的加载量。 2. **IFrame整合**: ...

    gwt实例,基于gwt-windows-1.5.2

    1. **GWT模块化**:GWT项目通常由一个或多个模块组成,每个模块包含一个或多个Java源文件。这些源文件会被编译成JavaScript,并在浏览器中运行。在“gwt-windows-1.5.2”中,你可能看到的是`.gwt.xml`配置文件,用于...

    GWTDemo

    2. **GWT 模块系统**: GWTDemo项目很可能由一个或多个GWT模块组成,每个模块定义了应用的一个部分。模块可以通过导入其他模块来共享代码,并且可以通过.gwt.xml配置文件进行定制。 3. **用户界面组件**: GWT提供了...

    部署一个简单GWT应用到Google App Engine

    标题 "部署一个简单GWT应用到Google App Engine" 涉及到的技术点主要包括Google Web Toolkit (GWT) 和 Google App Engine (GAE),这两者都是Google提供的开发和托管Web应用的重要工具。以下是对这些技术及其相关知识...

    hibernate+gwt2.4

    1. **模块系统(Module System)**:GWT项目由一个或多个模块组成,每个模块定义了应用的入口点、依赖和编译设置。 2. **UI组件库**:包含丰富的可重用组件,如Button、TextBox、Panel等,用于构建用户界面。 3. **...

    gwt教程

    2. **模块化**:GWT应用基于模块化结构,每个模块代表一个独立的可部署单元。模块包含了应用程序的类、资源和配置信息,这使得代码组织清晰,易于管理和维护。 3. **本地化**:GWT支持多语言本地化,允许开发者轻松...

    GWT简介.docx

    8. **模块化系统**:GWT应用由多个模块组成,每个模块包含特定的功能,这使得代码组织更加清晰,便于维护和扩展。 9. **性能优化**:GWT的编译器会进行一系列优化,包括死代码消除、代码压缩、按需加载等,以减少...

    gwt使用手册

    GWT工程中可以包含多个模块,每个模块代表一个独立的功能单元,可以有自己的入口点(`EntryPoint`)和资源。通过添加新模块,可以扩展应用的功能,或者将应用分割成更小、更易于管理的部分。模块之间可以通过依赖...

    gwt-2.0.3.rar

    6. **模块化系统**:GWT支持模块化开发,允许开发者将应用拆分为多个模块,便于管理和维护。 7. **本地化支持**:GWT内置了多语言支持,方便开发多语言应用。 8. **优化的代码分割**:GWT允许将大型应用拆分为小块...

    GWT(很好的资料和书籍不好你打我)

    2. **模块化系统**:GWT项目通常由多个模块组成,每个模块可以包含可重用的UI组件、服务接口和资源。 3. **用户界面(UI)构建**:GWT提供了丰富的Widget库,包括按钮、表单、布局容器等,可以方便地构建复杂的用户...

    GWT的物联网应用程序

    总之,GWT为物联网应用程序提供了一个高效且灵活的开发平台,尤其是在构建温室环境测控系统这样的实时监控应用时,能够充分发挥其实时性、可扩展性和易用性。通过结合现代物联网技术和GWT的专业优势,我们可以创建出...

    smartGWT

    "coral"可能指的是SmartGWT的一个特定版本或者一个模块,Coral可能是SmartGWT的一个皮肤或者主题,用于改变应用程序的外观和感觉。Coral可能包含了一组预定义的CSS样式和图像资源,使得开发者可以快速为应用提供一致...

    初次接触GWT,知识点概括

    - **模块系统**:GWT项目基于模块化,每个模块可以包含一个或多个类,模块之间可以相互依赖。 - **代码分割**:编译器将大的JavaScript文件分割成多个小块,以提高页面加载速度。 - **编译配置**:开发者可以通过...

    GWT SDK 2.5.1

    5. **模块化系统**:GWT支持模块化的项目结构,每个模块可以包含一个或多个应用程序单元,这有助于管理大型项目的复杂性,并实现按需加载,减少初始页面加载时间。 6. **用户界面构建工具**:GWT提供了一套丰富的UI...

    GWT1.7学习之 了解基本的使用

    1. **模块(Module)**:GWT项目通常由一个或多个模块组成,每个模块定义了应用的入口点、样式表、依赖库等。模块配置文件(.gwt.xml)包含了项目的元数据,如导入的其他模块、使用的库、本地化设置等。 2. **...

    GWT介绍--基于eclipse可后台开发前台页面

    **GWT(Google Web Toolkit)** 是一个由Google开发的开源JavaScript开发框架,它允许开发者使用Java语言来编写Web应用程序,然后自动编译为优化过的JavaScript代码,从而在客户端浏览器中运行。GWT的设计目标是简化...

Global site tag (gtag.js) - Google Analytics