Codename one javascript callback

左心房为你撑大大i 提交于 2021-02-19 04:49:05

问题


I am trying to display a consent page in my app. The page should be written in html so the app need to handle a button clicked event from browser. I tried to replicate the example in blog (minus the jQuery part):

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

The html looks like this:

<html>
<button id='ACCEPT'>Accept</button>
<button id='DECLINE'>Decline</button>
<script></script>
</html>

Nothing happened when the button was clicked. However, when the js expression was put in the <script> tag instead, 'callback' is not defined was logged, suggesting that the js expression was not the cause.

I'd like to know which part went wrong? Any help is appreciated.


回答1:


Coming back to the original question, it seems that the problem can be solved quite easily, and more data than simple click event can be passed as well.


Method 1:

Use a <form> or <a> to redirect the BrowserComponent to any page, and listen to navigation event, like

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

Form data can be obtained as explained in this link.


Method 2:

Register a javascript object either as onclick of a button, or as a function that is called from javascript, as explained in the 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)
    });
});

... and in 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);

A few afterthought:

  1. WebEventListener cannot be used with BrowserNavigationCallback
  2. Passing json as base64 string is hard, see Unicode Problem
  3. While encodeUrl() is public (in Util), the inverse function is private in BrowserComponent. This complicates passing js object as url
  4. In Method 2 use bc.addJsCallback instead of execute to callback more than once

Hope this help someone



来源:https://stackoverflow.com/questions/49676540/codename-one-javascript-callback

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!