javascript - 使用GWT JSNI与js文件集成

标签 javascript java gwt smartgwt smartgwt-pro

我目前正在开发一个 GWT 项目,现在需要由外部 JavaScript 文件使用。我现在正在创建一个测试原型(prototype),以确保双方都能正常工作。

当我运行和编译时,我在浏览器中看到来自被调用事件的控制台日志。但是,GWT java 方法没有被调用。

在尝试了多种方案之后,我还注意到,如果我从 exportStaticMethods() 中删除 $entry 包装器,则会发生相反的情况。我看到在我的 java 代码中调用了 System.out,但是浏览器中 JavaScript 的控制台日志没有被调用。

我试图找出导致这种行为的原因,以及是否有一个我忽略的小缺失部分。

我已经查看了 calling a Java method from js 的 GWT JSNI 文档并尝试从 StackOverflow 上的其他相关问题中找到解决方案。

GWT 和 Java 端

我已经进入 EntryPoint 类的 onModuleLoad() 方法,并添加了一个名为 exportStaticMethods() 的静态方法。我还创建了下面列出的 PokePingClass.java 文件。

EntryPointClass.java

public class EntryPointClass implements EntryPoint {

    @Override public void onModuleLoad() {
        exportStaticMethods();
        // load application here.
    }

    public static native void exportStaticMethods() /*-{

        $wnd.pingApp = $entry((function) {
                           @com.application.PokePingClass::pingApp()();
                       });

        $wnd.pokeApp = $entry((function) {
                           @com.application.PokePingClass::pokeApp()();
                       });
    }-*/
}

PokePingClass.java

public class PokePingClass {

    public static void pokeApp() {
        System.out.println("pokeApp() called");
    }

    public static void pingApp() {
        System.out.println("pingApp() called");
    }
}

HTML 和 js

在项目的.html文件中,我添加了一个id为“pokePing”的隐藏div元素,以及pokeping.js 文件。

<html>
    <head>
        .
        . <!-- other stuff -->
        .
        <script type='text/javascript' src='pokeping.js</script> 
    </head>

    <body>
        .
        . <!-- other stuff -->
        .
        <div id="pokePing" style="visibility: hidden;"></div>
    </body>
</html>

pokeping.js

$(document).ready(function) {

    var $pp = $('#pokePing');

    var pokeApp = function() {
        console.log("app handling poke event");
        window.parent.pokeApp();
    }

    var pingApp = function() {
        console.log("app handling ping event");
        window.parent.pingApp();
    }

    $pp.trigger('pokeApp');
    $pp.trigger('pingApp');
}

最佳答案

public static native void exportStaticMethods() /*-{

    $wnd.pingApp = $entry(function) {
                       @com.application.PokePingClass.pingApp()();
                   }

    $wnd.pokeApp = $entry(function) {
                       @com.application.PokePingClass.pokeApp()();
                   }
}-*/

这不是有效的 JS,并且作为 JSNI 没有意义。试试这个:

    $wnd.pingApp = $entry(function() {
                       @com.application.PokePingClass::pingApp()();
                   });

    $wnd.pokeApp = $entry(function() {
                       @com.application.PokePingClass::pokeApp()();
                   });

编辑,因为我仍然有错,忘记了成员的 :: 运算符。

关于javascript - 使用GWT JSNI与js文件集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41469714/

相关文章:

java - 检测弹性表中按下了哪个按钮

javascript - 如何在 Angular 2 中使用自定义 http 刷新访问 token ?

javascript - 使用必需值和空对象解构参数对象

java - 安装 Galago 时出错

java - 如何检测面板上任意位置的按键?

Maven Tomcat 使用配置文件部署插件

javascript - 如何使用javascript获取url参数

javascript - 将现有关系数据库(MySQL)转换为图形数据库(OrientDB)

Java - 将 byte[] 转换为 double[],反之亦然

java - Spring Integration 和原型(prototype)范围之谜