Codename one javascript callback
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
add a comment |
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
1
It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invokeaddJSCallback
afteronLoad
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
add a comment |
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
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
javascript codenameone
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 invokeaddJSCallback
afteronLoad
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
add a comment |
1
It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invokeaddJSCallback
afteronLoad
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
add a comment |
1 Answer
1
active
oldest
votes
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:
WebEventListener
cannot be used withBrowserNavigationCallback
- Passing json as base64 string is hard, see Unicode Problem
- While
encodeUrl()
is public (inUtil
), the inverse function is private in BrowserComponent. This complicates passing js object as url - In Method 2 use
bc.addJsCallback
instead ofexecute
to callback more than once
Hope this help someone
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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:
WebEventListener
cannot be used withBrowserNavigationCallback
- Passing json as base64 string is hard, see Unicode Problem
- While
encodeUrl()
is public (inUtil
), the inverse function is private in BrowserComponent. This complicates passing js object as url - In Method 2 use
bc.addJsCallback
instead ofexecute
to callback more than once
Hope this help someone
add a comment |
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:
WebEventListener
cannot be used withBrowserNavigationCallback
- Passing json as base64 string is hard, see Unicode Problem
- While
encodeUrl()
is public (inUtil
), the inverse function is private in BrowserComponent. This complicates passing js object as url - In Method 2 use
bc.addJsCallback
instead ofexecute
to callback more than once
Hope this help someone
add a comment |
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:
WebEventListener
cannot be used withBrowserNavigationCallback
- Passing json as base64 string is hard, see Unicode Problem
- While
encodeUrl()
is public (inUtil
), the inverse function is private in BrowserComponent. This complicates passing js object as url - In Method 2 use
bc.addJsCallback
instead ofexecute
to callback more than once
Hope this help someone
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:
WebEventListener
cannot be used withBrowserNavigationCallback
- Passing json as base64 string is hard, see Unicode Problem
- While
encodeUrl()
is public (inUtil
), the inverse function is private in BrowserComponent. This complicates passing js object as url - In Method 2 use
bc.addJsCallback
instead ofexecute
to callback more than once
Hope this help someone
answered Nov 12 '18 at 15:55
R. Wang
7818
7818
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
It's hard to tell but this HTML seems problematic to begin with. You are missing the body tag. Did you invoke
addJSCallback
afteronLoad
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