【问题标题】:Call of Java Method via Javascript not working in Simulator通过 Javascript 调用 Java 方法在模拟器中不起作用
【发布时间】:2016-11-30 13:36:02
【问题描述】:

单击按钮什么也没做 - 但为什么。

点击按钮应该会打印出“[Javascript Logger] Aha”。

代码如下:

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

【问题讨论】:

  • 也许您需要将记录器设置在 setPage 调用之前?

标签: codenameone


【解决方案1】:

setPage() 是异步的。您需要等到页面加载后才能在其上注册功能。最简单的方法是在 onLoad 事件中。

例如


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

【讨论】:

  • 在 onLoad 上进行初始化不会改变:browserComponent.addWebEventListener("onLoad", (e) -> Display.getInstance().callSerially(() -> { 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); }));
  • 令人惊讶的是,当通过com.codename1.ui.BrowserComponent.setURLHierarchy(String) 加载 HTML 时它可以工作,但会引发 FileNotFound 异常
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2020-12-15
  • 2017-09-19
  • 2011-12-14
相关资源
最近更新 更多