2013-03-06 104 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代碼。