GWT JSNI javascript到Java不工作

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() /*

我试图从Javascript代码中调用Java方法。这适用于使用Phonegap的Windows Phone 7应用程序

我的javascript代码中包含以下内容

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);