GWT JSNI javascript到Java不工作
我试图从Javascript代码中调用Java方法。这适用于使用Phonegap的Windows Phone 7应用程序 我的javascript代码中包含以下内容GWT JSNI javascript到Java不工作,gwt,jsni,Gwt,Jsni,我试图从Javascript代码中调用Java方法。这适用于使用Phonegap的Windows Phone 7应用程序 我的javascript代码中包含以下内容 document.addEventListener("backbutton", onBackKeyDown, false); function onBackKeyDown(){ } 在我的Java代码中,我有以下内容 public static native void exportStaticMethod() /*
document.addEventListener("backbutton", onBackKeyDown, false);
function onBackKeyDown(){
}
在我的Java代码中,我有以下内容
public static native void exportStaticMethod() /*-{
$wnd.onBackKeyDown =
$entry(this.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets());
}-*/;
然后在onModuleLoad()中,我这样调用它:
MyApp.exportStaticMethod();
它不起作用我在隐藏设置Swidgets()
中有一个警报,但从未显示
*编辑*
这里还有一些代码。EventListener未添加到Javascript中。它是在java代码中特别添加的。我无法让听众最初注册,因此我添加了以下内容
public static native void removeBackListener() /*-{
$wnd.removeTheListener();
}-*/;
在我的JavaScript中
function removeTheListener(){
document.removeEventListener("backbutton", onBackKeyDown, false);
}
这是我对hideSettingsWidgets()的调用
它似乎在添加您的内部的EventListener
public native void setupJavaHandler() /*-{
var app = this;
var onBackKeyDown = $entry(function() {
app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
});
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
所以我不确定我会错在哪里。我没有添加您提到的ArrayList,因为不确定是否添加,并且在加载页面时事件侦听器没有运行
似乎showsettingswidges()
从未运行过addEventListener
页面加载时代码可能正在运行,对吗?这将把空函数onBackKeyDown
映射到backbutton事件。然后,当加载模块时,您尝试将onBackKeyDown
函数重新定义为新函数,但旧函数已附加到您尝试侦听的事件
这大致相当于此(使用字符串而不是侦听器函数):
还有一件事-请记住,我们正在用该本地代码编写JavaScript,当调用该hideSettingsWidgets()
方法时,该this
将是什么?JavaScript不知道所有Java实例方法都需要一个this
来运行(JavaScript在B上运行对象a的方法没有问题-a.method.call(B)
是完全合法的,并且通常是有用的)。我们需要确保这个意味着我们认为它的作用:
public static native void setupJavaHandler() /*-{
var app = this;
var onBackKeyDown = $entry(function() {
app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
});
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
编辑:哎呀,原来你的方法是静态的,所以这实际上并不意味着什么!将exportStaticMethod
/setupJavaHandler
更改为非静态并直接调用它(可能是在您现在的onModuleLoad
中),或者传入一个实例以调用hideSettingsWidgets()
,就像我们在上一个示例中对app
所做的那样
public native void setupJavaHandler() /*-{
var app = this;
var onBackKeyDown = $entry(function() {
app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
});
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
// in onModuleLoad:
setupJavaHandler();
或
你好当页面加载时,不会添加或运行addEventListener代码,它是在java代码中专门添加的。我还通过调用javascript函数来删除它。我已经在上面添加了我的相关代码。谢谢你的帮助。我只是想确认一下,在我托管的html页面中,我还需要空的onBackKeyDown函数吗?它必须正常工作。我下载了GWT Phonegap,它也在做同样的事情。如果IE不完全支持JSNI,我也不会感到惊讶。嗨,我已经证实这是GWT JSNI的问题。我制作了一个普通的HTML5应用程序,“backbutton”代码工作正常。感谢您的帮助。我不太确定您的GWT应用程序如何与Phonegap集成,但如果它在浏览器上本地运行(而不是从服务器加载),您需要确保GWT正在使用ie6
用户代理目标。
// first, make the thing to hold the 'listener', and define the first one
List<String> strings = new ArrayList<String>();
String onBackKeyDown = "abcd";
strings.add(onBackKeyDown);
// then, redefine the string, but don't change the list!
onBackKeyDown = "zyxw";
assert strings.contains(onBackKeyDown) : "Whoops, reassigned, but not added!";
public static native void setupJavaHandler() /*-{
var onBackKeyDown = $entry(this.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets());
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
public static native void setupJavaHandler() /*-{
var app = this;
var onBackKeyDown = $entry(function() {
app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
});
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
public native void setupJavaHandler() /*-{
var app = this;
var onBackKeyDown = $entry(function() {
app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
});
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
// in onModuleLoad:
setupJavaHandler();
public static native void setupJavaHandler(MpApp app) /*-{
//var app = this;
var onBackKeyDown = $entry(function() {
app.@com.mycompany.myapp.client.MyApp::hideSettingsWidgets();
});
$doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
// in onModuleLoad:
MyApp.setupJavaHandler(this);