【问题标题】:JavaFX WebView popup handler not attempting to load pageJavaFX WebView 弹出处理程序未尝试加载页面
【发布时间】:2015-05-12 17:14:52
【问题描述】:

我有一个 WebView 对象,我已经添加了一个弹出处理程序:

WebView view = new WebView();
WebEngine engine = view.getEngine();

engine.setCreatePopupHandler(new Callback<PopupFeatures, WebEngine>() {

    public WebEngine call(PopupFeatures param) {

        Stage stage = new Stage(StageStyle.UTILITY);
        WebView popupView = new WebView();

        stage.setScene(new Scene(popupView));
        stage.show();

        return popupView.getEngine();

     }

});

当加载典型网页(例如 http://www.google.com)时,这将按预期工作。我遇到麻烦的地方是 JavaScript 打开了要传递给 Windows 命令行的 URI。特别是我正在尝试通过将“conf:sip...”传递给命令行来启动 lync 电话会议:

window.open("conf:sip...")

我知道 WebView 无法加载这样的位置,这不是主要问题。我可以捕获 MalformedURLException,然后自己传递命令。问题是弹出处理程序似乎永远不会传递目的地。我尝试向 locationProperty 和 workDoneProperty 添加一个侦听器,并为原始引擎和 popupView 引擎添加一个 onError 侦听器。弹出窗口似乎永远不会被传递到 window.open 函数的目的地,并且 popupView 引擎永远不会加载任何内容。

有没有办法在回调接口中获取 window.open 函数的目标,或者捕获阻止弹出窗口传递到目标的任何错误?

谢谢!

【问题讨论】:

  • 这确实很烦人;从来没有遇到过,但一个想法是:(1)在隐藏状态下创建新的Stage(2)在WebEngine.location属性中添加一个监听器(3)在监听器中你实际上可以获取URL并决定要做什么执行,即显示弹出窗口,或销毁弹出窗口并运行 Lync。
  • 感谢您的建议。我在Callback 函数中为popupView 的location 属性添加了一个侦听器。但是,侦听器永远不会触发。似乎弹出处理程序仅将window.open 函数的目标传递给Callback 返回的WebEngine,如果URL 某种形式的有效性检查。不知道有没有办法在调用Callback函数之前拦截window.open函数。
  • 哈,有趣!还有(一如既往:)jewelsea来救援!

标签: java javascript webview javafx popup


【解决方案1】:

conf:协议创建你的own protocol handler,那么就不会产生异常,你应该能够拦截并适当地响应请求。

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 2019-02-13
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多