使用javascript进行get-function调用

时间:2014-03-28 16:12:10

标签: java javascript gwt

抱歉,我知道过去曾问过这个问题,但是我不能让它运行。任何人都可以告诉我,为什么我的代码不起作用?

我尝试的是:我想在html页面中使用java脚本调用gwt函数。 gwt函数创建一个int,返回它,javascript应该在html页面中解析它。

我的java代码是:

package com.test.client;

import com.google.gwt.core.client.EntryPoint;

public class TestCode implements EntryPoint {
  public static native void exportTestReturn()/*-{
    $wnd.testReturn = $entry(@com.test.client.TestCode::testReturn());
  }-*/;

  public static int testReturn(){
    int testVar = 3;
    return testVar;
  }

  public void onModuleLoad() {
    exportTestReturn();
  }
}

我的HTML代码:

<!doctype html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>TestTitle</title>
    <script type="text/javascript" language="javascript" src="com.test.TestCode/com.test.TestCode.nocache.js">
    </script>
  </head>

  <body>
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>

    <p>Gwt html file tries to start gwt function and parse the return value</p>
    <script>
      document.write("JS output:" + testReturn() + "<br>");
    </script>
  </body>
</html>

1 个答案:

答案 0 :(得分:0)

在GWT onModuleload导出函数之前,您似乎正在调用该函数。

GWT使用引导脚本(your_app.nocache.js)来计算排列,然后异步加载应用程序脚本(xxxx.cache.js)。

如果您从浏览的javascript控制台调用您的函数,您可以看到它的工作原理。

将您的javascript代码配置为等待GWT代码完全加载,或者将其放在功能块中并从JSNI方法中调用它。

public static native void exportTestReturn()/*-{
  $wnd.testReturn = $entry(@com.test.client.TestCode::testReturn());
  $wnd.onLoad();
}-*/;


<script>
  function onLoad() {
    document.write("JS output:" + testReturn() + "<br>");
  }
</script>

如果你喜欢等到加载gwt之后,输入一个循环,直到gwt在加载窗口对象时设置的任何var存在,这是一个非常棘手的解决方案:

<script>
 (function loopWaitGwtReady() {          
  setTimeout(function () {
    if (window.__gwt_activeModules)
       document.write("JS output:" + testReturn() + "<br>");
    else
       loopWaitGwtReady()
  }, 50)
 })();    
</script>