从html脚本标记调用GWT Java函数

Mik*_*ike 14 javascript java gwt jsni

我有一个GWT项目,我想在GWT项目的主html文件中添加一个脚本标记,该文件调用位于我的客户端代码中的Java函数.

根据文档,我应该添加类似下面的html标记:

<script type='text/javascript'> 
this.@com.myCompany.myProject.client.myClass::myFunction();
</script>
Run Code Online (Sandbox Code Playgroud)

其中com.myCompany.myProject.client.myClass是类路径,myFunction是我想调用的java函数.

当我尝试使用myFunction的以下实现时,没有任何反应:

public void myFunction() {
    HTMLPanel panel = new HTMLPanel("I have been called");
    RootPanel.get().add(panel);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,myFunction没有被调用.

但是当我从JSNI方法进行相同的调用时,它就可以工作了.

是否可能无法通过html脚本进行调用,或者我做错了什么?

谢谢!

Pet*_*ego 13

  1. 您尝试做的事情不起作用,因为GWT编译器重命名所有标识符名称以最小化生成的代码大小:所以myFunction()存在,但它被称为其他东西.

  2. 您正在查看旧版本的文档.在最新版本中,所有解释都是:从手写JavaScript调用Java方法

解决方案 - 在某处添加其他方法:

public static native void exportMyFunction() /*-{
   $wnd.myFunction =
      $entry(@com.myCompany.myProject.client.myClass::myFunction());
}-*/;
Run Code Online (Sandbox Code Playgroud)

然后在您的应用初始化中,您必须调用EnclosingClass.exportMyFunction().然后在手工制作的JavaScript中,您可以通过以下方式访问它:

window.myFunction();
Run Code Online (Sandbox Code Playgroud)

  • 在这个答案中还有完整的例子:http://stackoverflow.com/questions/5234735/gwt-jsni-problem-passing-strings (2认同)