代号一个javascript回调

时间:2018-04-05 15:49:10

标签: javascript codenameone

我正在尝试在我的应用中显示同意页面。页面应该用html编写,因此应用程序需要处理来自浏览器的按钮单击事件。我试图复制the example in blog(减去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' is not defined,这表明js表达式不是原因。

我想知道哪个部分出了问题?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

回到原始问题,似乎可以很轻松地解决问题,并且可以传递比简单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
});

可以如this link中所述获取表格数据。


方法2:

将JavaScript对象注册为按钮的onclick或注册为function的JavaScript,如documentation中所述。

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. 一起使用
  3. 很难将json作为base64字符串传递,请参见Unicode Problem
  4. 尽管encodeUrl()是公开的(在Util中),反函数在BrowserComponent中是私有的。这会使通过js对象作为url传递变得复杂
  5. 在方法2中,使用bc.addJsCallback而不是execute回调一次以上

希望这对某人有帮助