Codename one javascript callback












2














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.










share|improve this question


















  • 1




    It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke addJSCallback after onLoad was invoked?
    – Shai Almog
    Apr 6 '18 at 5:13












  • Maybe not I'll need to double check for that
    – R. Wang
    Apr 6 '18 at 17:09
















2














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.










share|improve this question


















  • 1




    It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke addJSCallback after onLoad was invoked?
    – Shai Almog
    Apr 6 '18 at 5:13












  • Maybe not I'll need to double check for that
    – R. Wang
    Apr 6 '18 at 17:09














2












2








2


1





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.










share|improve this question













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.







javascript codenameone






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Apr 5 '18 at 15:49









R. Wang

7818




7818








  • 1




    It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke addJSCallback after onLoad was invoked?
    – Shai Almog
    Apr 6 '18 at 5:13












  • Maybe not I'll need to double check for that
    – R. Wang
    Apr 6 '18 at 17:09














  • 1




    It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke addJSCallback after onLoad was invoked?
    – Shai Almog
    Apr 6 '18 at 5:13












  • Maybe not I'll need to double check for that
    – R. Wang
    Apr 6 '18 at 17:09








1




1




It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke addJSCallback after onLoad was invoked?
– Shai Almog
Apr 6 '18 at 5:13






It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke addJSCallback after onLoad was invoked?
– Shai Almog
Apr 6 '18 at 5:13














Maybe not I'll need to double check for that
– R. Wang
Apr 6 '18 at 17:09




Maybe not I'll need to double check for that
– R. Wang
Apr 6 '18 at 17:09












1 Answer
1






active

oldest

votes


















0














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






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f49676540%2fcodename-one-javascript-callback%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    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






    share|improve this answer


























      0














      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






      share|improve this answer
























        0












        0








        0






        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






        share|improve this answer












        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







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 12 '18 at 15:55









        R. Wang

        7818




        7818






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f49676540%2fcodename-one-javascript-callback%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Florida Star v. B. J. F.

            Danny Elfman

            Lugert, Oklahoma