2

我花了很长时间编码和搜索这个网站和其他网站,但没有成功。我有一个调用 JSNI 的 GWT 应用程序,然后调用一个 Applet 来执行一些文件加载​​。所以我需要在文件加载完成后被回调。尽我所能,我无法调用我的 JavaScript(或 Java)回调。通常你引用 $wnd 变量是这样的:

$wnd.myFunc()

如果我尝试这个(或我认为可能有用的大量其他变体),它会默默地失败。我什至不能称之为简单的东西:

$wnd.alert("Made it")

我试过使用window.eval("$wnd.myFunc()");

我也尝试window.call过同样的结果。

我猜我在错误的上下文中(GWT 将所有内容都放在 IFrame 中),但我找不到任何选项来访问 GWT 应该放置"$wnd"变量的全局上下文。

出于安全原因,IFrame 应该受到一些限制,我想知道我是否遇到了故意禁用的东西。

无论如何,我有很多猜测,但我对 JavaScript 的了解有限,所以也许我忽略了一些简单的事情。

4

2 回答 2

2

你的 GWT 代码

String value = JsniMethods.decryptData(data, publickey);

在 JsniMethods 类中

public static native String decryptData(String text, String publickey) /*-{
        var encrypted = $doc.appletname.methodname(text, publickey);
        return encrypted;
    }-*/;

你在 html 中的小程序初始化

<applet name="appletname" code="appletname.class"
        archive="appletname.jar" width="0" height="0" MAYSCRIPT="true"
        scriptable="true" > </applet>  

最后

把你appletname.jar的战争文件夹..

祝你好运

于 2013-01-24T13:27:12.973 回答
1

我终于解决了我自己的问题。以下是有效方法的简要概述:

这是小程序插入代码:

    String  appletDivHTML = "<div> <applet id=\"uploadApplet\" " +
            "code=\"<mypath>.ClientFileUpload\" " +
            "archive=\"applet.jar\" width=\"100\" height=\"100\" MAYSCRIPT> </applet>" +
            "<param name=\"MAYSCRIPT\" value=\"true\"/> </div>";
    com.google.gwt.user.client.Element  div = DOM.createDiv();
    div.setInnerHTML(appletDivHTML);
    BodyElement  body = Document.get().getBody();
    body.appendChild(div);

这是 Java 回调和 JSNI:

public static void fileCallback(String result) {
    Util.showMessage("Callback reached", "Result: " + result);
}

public static native void uploadFile(String serverURL, String filePath) /*-{
    $wnd.fileCallback = $entry(@<mypath>.Applet::fileCallback(Ljava/lang/String;));
    var  fileArray = [];
    fileArray.push(filePath);
    $wnd.uploadApplet.uploadFiles(serverURL, fileArray, "fileCallback");
}-*/;

调用 Java 回调的小程序代码:

        JSObject window = JSObject.getWindow(this);
        String[] args = new String[] {responseString};
        window.call(callbackJsMethod, args);
于 2013-01-25T04:07:48.087 回答