我尝试的是:我想在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>
答案 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>