如何在调用javascript函数时调用gwt函数

时间:2011-08-17 19:29:17

标签: gwt

我正在开发一个关于在Android上嵌入web应用程序的项目,遵循WebView演示,但是当Android应用程序调用javascript函数'wave'时我需要调用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>

关于如何实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:5)

您需要将要从javascript调用的任何方法导出到javascript全局范围。这意味着你不能从手写的javascript中调用任意java方法。您必须提前计划并在javascript范围中公开必要的方法。

这个过程非常简单:

  1. 编写一个在$ wnd范围内创建函数的JSNI方法。
  2. 从此函数的主体使用JSNI JavaScript to java syntax调用java方法。
  3. 在应用程序启动期间调用步骤#1中声明的方法(例如,从入口点onmoduleload)
  4. 从您的javascript调用$ wnd范围内创建的函数。确保在加载gwt模块并运行入口点后执行此操作。
  5. 来自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方法:

    当你从javascript调用带有参数的Java方法时,你需要使用特定的语法:

    [instance-expr.]@class-name::method-name(param-signature)(arguments)
    

    例如,调用带有String参数的静态方法将如下所示:

    @com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
    

    请注意,我们正在调用静态方法'instance-expr。'省略。其余代码是完全限定的类名,后跟::和方法名称。方法名称后的Ljava/lang/String;指定我们需要调用将String对象作为参数的方法。最后s是该参数的实际值。

    请记住,在我们的示例中,param-signature,Ljava/lang/String;在语法中使用JNI type signature specs,并且即使存在多个具有相同名称的重载方法,GWT编译器也需要选择正确的方法。即使方法没有超载,也需要param-signature

答案 1 :(得分:1)

GWT被编译为javascript并且所有函数/对象名称都被缩小,因此它们变得不可读且未知,因此您无法直接从Javascript调用它们。要解决此问题,您需要查看Call a Java Method from Handwritten JavaScript的方法。

答案 2 :(得分:0)

使用Javascript叠加类型!

看这里:

不能更好地描述它!