Codename One JavaScript回调

3

我正在尝试在我的应用程序中显示一个同意页面。该页面应该使用HTML编写,因此应用程序需要处理来自浏览器的按钮点击事件。我试图复制博客中的示例(减去jQuery部分):

bc.addJSCallback(
    "document.getElementById('ACCEPT').addEventListener('click', function(){callback.onSuccess(true)})",
    res -> {
        System.out.println(res);
        dialog.dispose();
    }
);

HTML的代码如下:

<html>
<button id='ACCEPT'>Accept</button>
<button id='DECLINE'>Decline</button>
<script></script>
</html>
点击时没有反应。但是,将 js 表达式放在 <script> 标签中时,会记录 'callback' 未定义,这表明 js 表达式不是问题的原因。
我想知道哪个部分出了问题?感谢任何帮助。

1
很难说,但是这个HTML似乎从一开始就有问题。你缺少了body标签。你在onLoad被调用后调用了addJSCallback吗? - Shai Almog
也许我需要再确认一下。 - R. Wang
1个回答

1

回到最初的问题,似乎这个问题可以很容易地解决,而且不仅可以传递比简单的click事件更多的数据。


方法1:

使用<form><a>BrowserComponent重定向到任何页面,并监听导航事件,例如:

bc.addBrowserNavigationCallback(url -> {
    if (url.equals(initialPath)) { 
        return true; //Show the first page, but do no subsequent redirection
    }
    //Do something here with data encoded in url
});

表单数据可以按照这个链接中所述的方法获取。

方法 2:

在 JavaScript 中注册一个对象,可以作为按钮的 onclick,也可以作为从 JavaScript 调用的 function,详见 文档

bc.addWebEventListener(BrowserComponent.onLoad, evt -> {
    bc.execute("window.cb = json => {callback.onSuccess(json);};", json -> {
        //Do something with the data here (a json in this case)
    });
});

...并且使用JavaScript。
const handleFormSubmit = event => {
  event.preventDefault();
  const data = formToJSON(form.elements); //Refer to link above
  const json = JSON.stringify(data);
  //const d = btoa(json); Does not work with unicode character
  cb(json);
};
const form = document.getElementsByName('formmm')[0];
form.addEventListener('submit', handleFormSubmit);

一些事后想法:
  1. WebEventListener 不能与 BrowserNavigationCallback 一起使用。
  2. 将json作为base64字符串传递很困难,请参见Unicode Problem
  3. 虽然 encodeUrl() 是公共的(在 Util 中),但逆函数在BrowserComponent中是私有的。这使得将js对象作为url传递变得复杂。
  4. 在方法2中,使用 bc.addJsCallback 而不是 execute 来回调多次。

希望这能帮助到某些人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接