1
votes

Clicking the Button does nothing - but why.

The click on the button should print "[Javascript Logger] Aha".

Here the code:

public class FormNotCalled extends Form {
    public FormNotCalled() {
        setTitle("FormNotCalled");
        setLayout(new BorderLayout());
        setScrollable(false);
        BrowserComponent browserComponent = new BrowserComponent();
        browserComponent.setPage(
                "<html lang=\"en\\\">\n" + 
                "    <body >\n" + 
                "        <button onclick=\"logger.log('Aha');\">Click me</button>\n" + 
                "    </body>\n" + 
                "</html>", 
                null);
        getContentPane().add(BorderLayout.CENTER, browserComponent);
        JavascriptContext javascriptContext = new JavascriptContext(browserComponent);
        JSObject logger = (JSObject)javascriptContext.get("{}");
        logger.set("log", new JSFunction() {
            public void apply(JSObject self, Object[] args) {
                String msg = (String)args[0];
                Log.p("[Javascript Logger] " + msg);
            }

        });
        javascriptContext.set("window.logger", logger);
    }
}
1
Maybe you need the logger set to be before the setPage call? - Shai Almog

1 Answers

1
votes

setPage() is asynchronous. You need to wait until the page is loaded before registering functions on it. The easiest way to do this is inside the onLoad event.

e.g.


browserComponent.addWebEventListener(e->{
        JSObject logger = (JSObject)javascriptContext.get("{}");
        logger.set("log", new JSFunction() {
            public void apply(JSObject self, Object[] args) {
                String msg = (String)args[0];
                Log.p("[Javascript Logger] " + msg);
            }

        });
        javascriptContext.set("window.logger", logger);
});