我的GWT应用程序设计为将一个iframe嵌入其中的另一个Web应用程序(这次不是GWT)。该嵌入式应用程序希望能够像我这样调用父应用程序中的一些API:
window.parent.f(function(result) { console.log("Result == " + result); });
我如何声明一个可以将该函数作为参数的JSNI函数?
private static final void f(Consumer<String> onsuccess) {
onsuccess.accept("abcd");
}
public static native void installApi() /*-{
$wnd.f = function(onsuccess) {
@my.package.client.Example::f(...); // What goes in here?
}
}-*/;
答案 0 :(得分:1)
查看JsInterop。这是目前在GWT中Java和JavaScript之间进行通讯的最佳和最简便的方法。
http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJsInterop.html
此外,从其他域/端口加载iframe时,存在安全限制。
Calling a parent window function from an iframe
编辑: 试试这个:
@JsType(name = "Foo", namespace = JsPackage.GLOBAL)
public class Foo {
@JsFunction
public interface Callback {
public abstract void onCallback(String msg);
}
public void test(Callback callback) {
GWT.log("Message from Java");
callback.onCallback("Massage passed from Java");
}
}
并通过以下方式致电:
var foo = new $wnd.Foo();
foo.test(function(msg) {
console.log("Message from JavaScript");
console.log("Received: " + msg);
});
最重要的是它隐藏在文档中,您需要添加此选项以编译和superdev模式参数。
-generateJsInteropExports