【问题标题】:Passing callback to a JSNI function in GWT将回调传递给 GWT 中的 JSNI 函数
【发布时间】:2019-11-12 23:03:15
【问题描述】:

我的 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?
    }
}-*/;

【问题讨论】:

    标签: gwt jsni


    【解决方案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);
    });
    

    最重要的是它隐藏在文档中,你需要添加这个选项来编译和超级开发模式参数。

    -generateJsInteropExports
    

    【讨论】:

    • 我一直在阅读 jsinterop 文档,但我还没有掌握它。安全限制很好理解,在这种情况下,子应用是从同一个域加载的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多