我的GWT项目中有helloJava.HTML,在那个html文件中,我有这个javascript代码
<script type="text/javascript">
function testJavaScript(var input){
var var1inJS = "Default value";
alert("Value of Var1 = " + var1inJS);
var1inJS = input;
alert("Value of Var1 = " + var1inJS);
var var2inJS = "Waht is the value of Var2";
alert("Value of Var2 = " + var2inJS);
}
现在我想从我的onmoduleLoad类(即我的java类)中调用这个方法。
有可能吗?
hellojava.html文件
<!doctype html>
<!-- The DOCTYPE declaration above will set the -->
<!-- browser's rendering engine into -->
<!-- "Standards Mode". Replacing this declaration -->
<!-- with a "Quirks Mode" doctype is not supported. -->
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!-- -->
<!-- Consider inlining CSS to reduce the number of requested files -->
<!-- -->
<link type="text/css" rel="stylesheet" href="HelloJSNI.css">
<!-- -->
<!-- Any title is fine -->
<!-- -->
<title>Web Application Starter Project</title>
<!-- -->
<!-- This script loads your compiled module. -->
<!-- If you add any GWT meta tags, they must -->
<!-- be added before this line. -->
<!-- -->
<script type="text/javascript" language="javascript" src="hellojsni/hellojsni.nocache.js"></script>
<script type="text/javascript">
function testJavascript(var input){
window.jsniAlert();
var var1inJS = "Default value";
alert("Value of Var1 = " + var1inJS);
var1inJS = input;
alert("Value of Var1 = " + var1inJS);
var var2inJS = "Waht is the value of Var2";
alert("Value of Var2 = " + var2inJS);
}
function callJava(){
}
</script>
</head>
<!-- -->
<!-- The body can have arbitrary html, or -->
<!-- you can leave the body empty if you want -->
<!-- to create a completely dynamic UI. -->
<!-- -->
<body>
<!-- OPTIONAL: include this if you want history support -->
<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
<!-- RECOMMENDED if your web app will not function without JavaScript enabled -->
<noscript>
<div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
Your web browser must have JavaScript enabled
in order for this application to display correctly.
</div>
</noscript>
<h1>JSNI EXAMPLE</h1>
<table align="center">
<tr>
<td colspan="2" style="font-weight:bold;"></td>
</tr>
<tr>
<td id="nameFieldContainer"></td>
<td id="sendButtonContainer"></td>
</tr>
<tr>
<td colspan="2" style="color:red;" id="errorLabelContainer"></td>
</tr>
</table>
</body>
</html>
答案 0 :(得分:2)
是。这大概就是你想要的:
public static native void callJavascript() /*-{
$wnd.testJavaScript("hello");
}-*/;
然后在Java代码中调用此方法:callJavascript();
在JSNI上阅读Google的文档: https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI
答案 1 :(得分:0)
Travis的函数语法是正确的,问题是调用函数的名称,JS脚本不是正确。
以下是更正
函数声明出错,不应使用var
争论。
删除第一行window.jsniAlert();
将第二个函数function
callJava(){
的声明更正为function callJava(){
这是代码(让我们调用JS testJSnative
中的函数):
<script type="text/javascript">
function testJSnative(input){
//window.jsniAlert();
var var1inJS = "Default value";
alert("Value of Var1 = " + var1inJS);
var1inJS = input;
alert("Value of Var1 = " + var1inJS);
var var2inJS = "What is the value of Var2";
alert("Value of Var2 = " + var2inJS);
}
function callJava(){
}
</script>
实施EntryPoint
的类的示例:
public void onModuleLoad() {
Button jsniButton = new Button("call JS");
jsniButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
callJavascript();
}
});
RootPanel.get().add(jsniButton);
}
public native void callJavascript() /*-{
$wnd.testJSnative("hello");
}-*/;
我希望这会有所帮助。