2013-03-06 98 views
2

我正在处理GWT应用程序,我想让该应用程序监听外部自定义JavaScript事件。这些事件将从我的模块外部触发。GWT听外部自定义JavaScript事件

基本上,就像你在一个基本的web应用程序有一些jQuery的做什么:

$('#foo').bind('customEvent', function() { 
    ... 
}); 
... 
$('#foo').trigger('customEvent'); 

我试图通过覆盖在我复合的onAttach方法来实现这一目标与GWTQuery:

@Override 
protected void onAttach() { 
    super.onAttach(); 
    $("#mainView").bind("refreshSheet", new Function() { 
     public boolean f(Event e) { 
      refreshSheet(); 
      return true; 
     } 
    }); 
} 

这不起作用,回调函数被调用,而我没有触发另一边的事件。

你会建议如何实现这个目标?

+0

这是什么帮助http://stackoverflow.com/questions/2951621/gwt-custom-events/2967359#2967359 – 2013-03-06 12:05:55

+0

不幸的是,它不能解释如何处理在应用程序中触发的事件,在Java中(但也许人们可以从JSNI发起一个事件)。在我的情况下,JavaScript事件会从应用程序的外部触发,从页面上的其他组件或从浏览器本身的模块将在Eclipse RCP应用程序显示在嵌入式的XULRunner。 – 2013-03-07 08:11:33

回答

2

我有同样的问题。在下面的解决方案中,我通过调用生成GWT事件的Java方法(来自我的Javascript代码)从JS发送事件。因此,这里是我的建议:

在JS

window.parent.sendEvent(evendID, eventBody) 

(我只好打电话给window.parent作为GWT和JS们在2个独立的帧)

,但我之前registred在GWT(见下文)的方法,如在GWT https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#calling

解释:

package com.mypackage.client; 
class myclass { 
public static int generateEvent(int eventID, String eventBody) { ...... } 

public static native void exportStaticMethod() /*-{ 
$wnd.sendEvent= 
    $entry(@com.mypackage.client.myclass::generateEvent(ILjava/lang/String;)); 
}-*/; 
} 

其中I是evendID(整数在JNI中)和Ljava/lang/String;是eventBody字符串。 您必须从onModuleLoad()方法调用此方法的exportStaticMethod()。

myclass中的generateEvent()方法然后生成一个GWT自定义事件(如Abhijith链接中的解释)。所以我没有通过JS堆栈以这种方式从JS向GWT广播事件,但我在java/GWT一侧保持了一个干净的架构。

主要优点我看到的是,它最大限度地减少JS代码的大小,并且很容易用GWT.event和JS事件之间的任何未来桥梁进行更新。

的主要问题是,你必须能够访问你的JS代码。