使用 GWT JSNI 与 js 文件集成
Using GWT JSNI to integrate with js files
我目前正在开发一个 GWT 项目,它现在需要由外部 Java 脚本文件使用。我现在正在创建一个测试原型,以确保双方都能正常工作。
当我 运行 和编译时,我看到浏览器中的控制台日志来自正在调用的事件。但是,未调用 GWT java 方法。
在尝试了很多方案之后,我还注意到,如果我从 exportStaticMethods()
中删除 $entry
包装器,则会发生相反的情况。我看到 System.out
s 在我的 java 代码中被调用,但是来自浏览器中 JavaScript 的控制台日志没有被调用。
我正在尝试找出导致该行为的原因,以及是否有遗漏的小部分被我忽略了。
我已经查看了 calling a Java method from js 的 GWT JSNI 文档,并试图从 Whosebug 上的其他相关问题中找到解决方案。
GWT 和 Java 方
我已经进入 EntryPoint
class 的 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()();
});
编辑,因为我还是错了,忘记了成员的 ::
运算符。
我发现了一个类似的 post 但关键是实际上 return JSNI 函数中的方法调用。之后,一切正常。
public static native void exportStaticMethods() /*-{
$wnd.pingApp = $entry((function) {
return @com.application.PokePingClass::pingApp()();
});
$wnd.pokeApp = $entry((function) {
return @com.application.PokePingClass::pokeApp()();
});
}-*/
我目前正在开发一个 GWT 项目,它现在需要由外部 Java 脚本文件使用。我现在正在创建一个测试原型,以确保双方都能正常工作。
当我 运行 和编译时,我看到浏览器中的控制台日志来自正在调用的事件。但是,未调用 GWT java 方法。
在尝试了很多方案之后,我还注意到,如果我从 exportStaticMethods()
中删除 $entry
包装器,则会发生相反的情况。我看到 System.out
s 在我的 java 代码中被调用,但是来自浏览器中 JavaScript 的控制台日志没有被调用。
我正在尝试找出导致该行为的原因,以及是否有遗漏的小部分被我忽略了。
我已经查看了 calling a Java method from js 的 GWT JSNI 文档,并试图从 Whosebug 上的其他相关问题中找到解决方案。
GWT 和 Java 方
我已经进入 EntryPoint
class 的 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()();
});
编辑,因为我还是错了,忘记了成员的 ::
运算符。
我发现了一个类似的 post 但关键是实际上 return JSNI 函数中的方法调用。之后,一切正常。
public static native void exportStaticMethods() /*-{
$wnd.pingApp = $entry((function) {
return @com.application.PokePingClass::pingApp()();
});
$wnd.pokeApp = $entry((function) {
return @com.application.PokePingClass::pokeApp()();
});
}-*/