如何在调用javascript函数时调用gwt函数
我正在开发一个项目,关于在WebView演示之后在android上嵌入web应用程序,但是当javascript函数'wave'时需要调用gwt函数由Android应用程序回叫:如何在调用javascript函数时调用gwt函数
<html>
<script language="javascript">
/* This function is invoked by the activity */
function wave(s) {
// call a gwt function and
// pass 's' to the gwt function
}
</script>
<body>
<!-- Calls into the javascript interface for the activity -->
<a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
...
</div></a>
</body>
</html>
有关如何实现此目的的任何想法?
您将需要将您想调用的任何方法从javascript导出到javascript全局范围中。这意味着你不能从手写javascript调用任意的java方法。您必须提前计划并在javascript范围内公开必要的方法。
过程是非常简单的:
- 编写创建于$ WND范围功能的JSNI方法。
- 从这个函数的主体调用java方法使用JSNI JavaScript to java syntax。
- 在应用程序启动期间调用步骤#1中声明的方法(例如,从入门点onmoduleload)
- 调用在$ wnd作用域中创建的函数从您的javascript。确保在加载gwt模块并运行入口点后执行此操作。
从GWT JSNI documentation与附加注释的例子:
package mypackage;
public MyUtilityClass
{
//Method to be called from javascript, could be in any other class too
public static int computeLoanInterest(int amt, float interestRate,
int term) { ... }
//This method should be called during application startup
public static native void exportStaticMethod() /*-{
//the function named here will become available in javascript scope
$wnd.computeLoanInterest =
$entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
}-*/;
}
编辑:
将参数传递给Java方法:
当你调用Java方法需要参数ERS,从JavaScript,你需要使用一个特定的语法:
[instance-expr.]@class-name::method-name(param-signature)(arguments)
例如,调用,需要一个字符串参数的静态方法是这样的:
@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
需要注意的是,我们在呼唤一个静态方法,'实例表达式'。被省略。其余代码是完全合格的类名称,后跟::
和方法名称。方法名称后面的Ljava/lang/String;
指定我们需要调用以String对象为参数的方法。最后s
是该参数的实际值。
请记住,在我们的例子中,参数签名Ljava/lang/String;
在语法上使用JNI type signature specs,并且GWT编译器要求选择正确的方法,即使存在多个具有相同名称的重载方法。即使方法没有过载,也需要param-signature
。
使用Javascript覆盖类型!
看吧:
不能descib任何更好!
GWT被编译为javascript,并且所有函数/对象名都被缩小了,所以它们变得不可读和未知,所以你不能直接从Javascript调用它们。要解决这个问题,你需要检查如何Call a Java Method from Handwritten JavaScript。
我的gwt应用程序现在可以接收来自硬写javascript的事件,但这是空参数。我需要将String传递给gwt函数作为它的参数,但是我不能在@entry中做到这一点,关于如何实现这一点的任何想法? – xybrek
@xybrek查看更新的答案 –