【问题标题】:GWT JSNI call applet methodGWT JSNI 调用小程序方法
【发布时间】:2011-09-21 19:01:48
【问题描述】:

我想将 Java 小程序添加到 GWT 页面并调用一些小程序的方法。这可以通过以下方式在 javascript 中实现:

document.applet_id.someAppletMethod("value");

但是,当我尝试在 GWT 中使用 JSNI 本机函数实现相同的想法时,它失败了。基本上它找不到小程序对象。这是 JSNI 代码:

public native void callStringMethod(String methodName, String arg) /*-{
    var temp = "document." + this.@com.my_project.AppletWrapper::appletName + "." + methodName + "(\"" + arg + "\");";             
    eval(temp);                                     //<----- FAIL

    //SOME TEST CODE
    $doc.applet_id.someAppletMethod("test value")   //<----- FAIL as well
    alert(typeof $doc.applet_id);                   //Undefined
    alert(typeof document.applet_id);               //Undefined
    alert(typeof $wnd.applet_id);                   //Undefined
}-*/;

注意 1:我知道“文档”不是 JSNI 使用的有效名称,您可以改用 $doc (explanation)。我不太清楚如何在 eval() 语句中对此进行编码,因此编译器将 $doc 替换为适当的引用,并且生成的 javascript 还包含用户指定的方法名称和参数。您可能知道,不能只混合输入 Java 变量和 Javascript (explanation)

注意2:以下JavaScript从Web浏览器地址栏运行

javascript:document.applet_id.someAppletMethod("asdf")

所以小程序在页面上,在文档对象下,我可以从 Javascript 访问它。它只是在 JSNI 中无法正常工作。

注意 3:我通过继承 GWT 的 HTML 类将实际的小程序标签添加到面板中。大致如下:

public AppletWrapper(String appletName, String jarName, String className) {
    StringBuilder applet = new StringBuilder();
    applet.append("<applet archive=\"").append(jarName).append("\" ");
    applet.append("code=\"").append(className).append("\" ");
    applet.append("name=\"").append(appletName).append("\" ");
    applet.append("id=\"").append(appletName).append("\" ");
    applet.append("width=\"100%\" height=\"450\">");
    applet.append("Browser doesn't support Java");
    applet.append("</applet>");
    this.setHTML(applet.toString());
}

感谢您为这项工作提供任何帮助。

【问题讨论】:

    标签: java javascript gwt applet jsni


    【解决方案1】:
    1. 尝试将mayscript="mayscript" 添加到&lt;applet&gt; 标记中。
    2. 也许很幼稚 - 是在将小程序添加到页面后调用 callStringMethod() 吗?
    3. 还有另外 2 个至少 2 个类似这样的问题:GWT JSNI: invoking applet methods? 和 GWT problem with calling Java methods from JSNI

    【讨论】:

    • 我已经看到了其他问题,但我没有使用
    • 我已经有一段时间没有使用小程序了,但是几年前如果没有指定mayscript,脚本是不允许访问小程序方法的。但我不认为它已经改变了。 GWT 代码最终是 javascript,因此需要授予权限。也许 URL 栏中的 javascript 受到不同的威胁,因为它是由用户手动运行的。
    • mayscript 什么都不做。不过时间有问题。添加应用程序后,我正在调用方法,但我认为应用程序未完全加载并且调用失败。如果有人可以提供帮助,我仍然想知道一种方法来解决 JSNI 中的“文档”和 $doc 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多