GWT JSNI javascript 到 Java 不工作

标签 gwt jsni

我正在尝试从我的 Javascript 代码调用 Java 方法。这是针对使用 Phonegap 的 Windows Phone 7 应用程序。

我的 JavaScript 代码中有以下内容。

document.addEventListener("backbutton", onBackKeyDown, false);
 function onBackKeyDown(){

    }

在我的 Java 代码中,我有以下内容。

  public static native void exportStaticMethod() /*-{
    $wnd.onBackKeyDown = 
        $entry(<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="60140809134e20030f0d4e0d19030f0d10010e194e0d190110104e030c09050e144e2d19211010" rel="noreferrer noopener nofollow">[email protected]</a>::hideSettingsWidgets());

    }-*/;

然后在 onModuleLoad() 中我这样调用它:

MyApp.exportStaticMethod();

它不起作用,我在 hideSettingsWidgets() 中有一个警报,但它从未显示。

*编辑* 这是更多代码。 EventListener 未添加到 Javascript 中。它是专门添加到java代码中的。我最初无法让听众注册,所以这是我添加的内容。

public static native void removeBackListener() /*-{
   $wnd.removeTheListener();
}-*/;

在我的 JavaScript 中

function removeTheListener(){
        document.removeEventListener("backbutton", onBackKeyDown, false);

        }

这是我对 hideSettingsWidgets() 的调用

public void hideSettingsWidgets(){
        for(int i=0;i<settingsScreenWidgets.length;i++){
            settingsScreenWidgets[i].setVisible(false);
        }
        alertString("Working");
        removeBackListener();



    }

我正在调用你在 showSettingsWidgets()

中给我的方法

p

rivate void showSettingsWidgets(){
        for(int i=0;i<settingsScreenWidgets.length;i++){
            settingsScreenWidgets[i].setVisible(true);
        }
        setCurrentImage();
        setOnOffImage();
        setupJavaHandler();

    }

它似乎确实添加了您的事件监听器

public native void setupJavaHandler() /*-{
      var app = this;
      var onBackKeyDown = $entry(function() {
        <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aacbdada84eac9c5c784c7d3c9c5c7dacbc4d384c7d3cbdada84c9c6c3cfc4de84e7d3ebdada" rel="noreferrer noopener nofollow">[email protected]</a>::hideSettingsWidgets();
      });
      $doc.addEventListener("backbutton", onBackKeyDown, false);
    }-*/;

所以我不确定我哪里出了问题。我没有添加您提到的 ArrayList<>,因为不确定,并且加载页面时事件监听器未运行。

似乎 showSettingsWidgets() 永远不会运行

最佳答案

addEventListener 代码可能在页面加载时运行,对吧?这会将您的空函数 onBackKeyDown 映射到后退按钮事件。然后,当您的模块加载时,您尝试将 onBackKeyDown 函数重新定义为一个新函数 - 但旧函数已附加到您尝试监听的事件.

这大致相当于这个(使用字符串而不是监听器函数):

// 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!";

要解决此问题,您需要在其他问题 Adding Eventlisteners to document with GWT JSNI 中所做的事情之间进行交叉,以及你在这里做什么。将 Java 函数包装在 $entry 调用中,并将其传递给 $doc.addEventListener 是最符合逻辑的(尽管我对 WP7 不太了解)。

public static native void setupJavaHandler() /*-{
  var onBackKeyDown = $entry(<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="582c30312b76183b37357635213b373528393621763521392828763b34313d362c761521192828" rel="noreferrer noopener nofollow">[email protected]</a>::hideSettingsWidgets());
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;

还有一件事 - 请记住我们正在用 native 代码编写 JavaScript,当调用 hideSettingsWidgets() 方法时,this 会是什么? JavaScript 不知道所有 Java 实例方法都需要 this 才能运行(并且 JavaScript 在 B 上运行对象 A 的方法没有问题 - A.method.call(B) code> 是完全合法的,而且通常很有帮助)。我们需要确保 this 的含义符合我们的想法:

public static native void setupJavaHandler() /*-{
  var app = this;
  var onBackKeyDown = $entry(function() {
    <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cbaabbbbe58ba8a4a6e5a6b2a8a4a6bbaaa5b2e5a6b2aabbbbe5a8a7a2aea5bfe586b28abbbb" rel="noreferrer noopener nofollow">[email protected]</a>::hideSettingsWidgets();
  });
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;

编辑:哎呀,原来你的方法是静态的,所以 this 实际上没有任何意义!要么将 exportStaticMethod/setupJavaHandler 更改为非静态并直接调用它(可能在您现在拥有的 onModuleLoad 中),或者传入一个调用 hideSettingsWidgets() 的实例,就像我们在上一个示例中使用 app 所做的那样。

public native void setupJavaHandler() /*-{
  var app = this;
  var onBackKeyDown = $entry(function() {
    <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1879686836587b77753675617b777568797661367561796868367b74717d766c365561596868" rel="noreferrer noopener nofollow">[email protected]</a>::hideSettingsWidgets();
  });
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;
// in onModuleLoad:
setupJavaHandler();

public static native void setupJavaHandler(MpApp app) /*-{
  //var app = this;
  var onBackKeyDown = $entry(function() {
    <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="741504045a34171b195a190d171b1904151a0d5a190d1504045a17181d111a005a390d350404" rel="noreferrer noopener nofollow">[email protected]</a>::hideSettingsWidgets();
  });
  $doc.addEventListener("backbutton", onBackKeyDown, false);
}-*/;

// in onModuleLoad:
MyApp.setupJavaHandler(this);

关于GWT JSNI javascript 到 Java 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9951750/

相关文章:

java - 从 GWT CellTable 获取所有对象

java - 如何在GWT UiBinder中使用JavaScript回调函数?

gwt - 从任何拥有它的地方移开焦点

java - 替换 FileService Api 以在服务器端创建 Blob 文件

javascript - 如何从 JavaScriptObject 读取 String[]? (GWT)

javascript - 使用 JSNI 从 GWT 向 Google Analytics 发送事件

javascript - 如何在GWT中实现JSNI

java - 如何使用 JSNI 从 GWT Java 运行 JavaScript 函数?

java - 如何在Project POM中继承External Maven POM

java - GXT:ComboBoxCell 不可编辑