2011-12-23 39 views
8

無法從手冊中瞭解:如何從Java運行JS功能?如何使用JSNI從GWT Java運行JavaScript函數?

例如,我有一個函數在我的html頁面:

<script type="text/javascript" language="javascript"> 
    function foo() { 
     alert('Foo!'); 
    } 
</script> 

以下模塊顯示兩個按鈕,僅次於它的工作原理:

public class Test_GoogleWeb_JSNI_01 implements EntryPoint { 

public void onModuleLoad() { 

    Button fooButton = new Button("Foo!"); 
    fooButton.addClickHandler(new ClickHandler(){ 
     public void onClick(ClickEvent event) { 
      fooRunner(); 
     }; 
    }); 


    HTML fooButtonNative = new HTML(); 
    fooButtonNative.setHTML("<input type='button' value='Foo Native' onclick='foo()'>"); 

    RootPanel rootPanel = RootPanel.get(); 
    rootPanel.add(fooButton); 
    rootPanel.add(fooButtonNative); 

} 

public static native void fooRunner() /*-{ 
    foo(); 
}-*/; 
} 

它在說明書上說,這本地函數在嵌套框架內實現,這解釋了情況。但是如何運行JS功能呢?

UPDATE 1 以下的工作。

的Java:

public static native void fooRunner() /*-{ 
    $doc.fooRunner(); 
}-*/; 

JS:

<script type="text/javascript" language="javascript"> 
    document.fooRunner = function foo() { 
     alert('Foo!'); 
    } 
</script> 

有沒有更好的辦法?

回答

4

你自己回答了你的問題。有一個非常簡單的理由沒有更好的方法:有多種方式來部署GWT應用程序,在iframe中運行只是其中一個選項。所以這就是爲什麼你必須使用$ wnd變量來訪問外部JS函數,所以如果你切換鏈接器,你的代碼仍然可以正常工作。

+0

你可以調用一個返回對象的javascrypt方法嗎?並使用該對象? – 2015-12-05 05:30:57