簡體   English   中英

使用GWT JSNI與js文件集成

[英]Using GWT JSNI to integrate with js files

我目前在GWT項目上工作,現在需要由外部JavaScript文件使用。 我現在正在創建一個測試原型,以確保雙方都能正常工作。

當我運行和編譯時,我從被調用的事件中看到控制台在瀏覽器中的日志。 但是,未調用GWT Java方法。

在嘗試了許多場景之后,我還注意到,如果我從exportStaticMethods()刪除$entry包裝器,則會發生相反的情況。 我看到在Java代碼中調用了System.out ,但是未調用瀏覽器中JavaScript的控制台日志。

我試圖弄清楚是什么原因導致了這種現象,如果我忽略了一個小的遺漏部分。

我已經閱讀了有關從JS調用Java方法的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()();
                   });

編輯,因為我仍然有錯,忘記了成員的::運算符。

我發現了類似的帖子,但關鍵是實際上要返回JSNI函數中的方法調用。 之后,一切正常。

public static native void exportStaticMethods() /*-{

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM