[英]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.