如何使用JSNI从GWT Java运行JavaScript函数?

时间:2011-12-23 14:13:22

标签: java gwt jsni

无法从手册中理解:如何从Java运行JS函数?

例如,我的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函数呢?

更新1 以下作品。

爪哇:

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

JS:

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

你自己回答了你的问题。没有更好的方法,原因很简单:有多种方式可以部署GWT应用程序,在iframe中运行只是其中一种选择。所以这就是你必须使用$ wnd变量来访问外部JS函数的原因,所以如果你切换链接器,你的静止代码就可以了。