【问题标题】:Partially replace WebView content while it is loading在加载时部分替换 WebView 内容
【发布时间】:2012-06-26 16:08:30
【问题描述】:

我想做的是用我自己的 HTML 内容替换网页 HTML 内容的某些部分(当前正在 WebView 引擎中加载)。

作为一个简单的示例 - 我想将每个加载的页面正文的背景颜色替换为 RED。这意味着我需要用我自己的值添加或替换现有的 body bgcolor 属性。我应该怎么做才能做到这一点?

下面是基于JavaFX WebView组件的基本浏览器代码:

public class BrowserTest extends Application
{
    public static void main ( String[] args )
    {
        launch ( args );
    }

    public void start ( Stage stage )
    {
        stage.setTitle ( "WebView" );

        Browser browser = new Browser ();
        browser.load ( "http://google.com" );

        Scene scene = new Scene ( browser );
        stage.setScene ( scene );

        stage.show ();
    }

    public class Browser extends Region
    {
        final WebView browser;
        final WebEngine webEngine;

        public Browser ()
        {
            super ();
            browser = new WebView ();
            webEngine = browser.getEngine ();
            getChildren ().add ( browser );
        }

        public void load ( String url )
        {
            webEngine.load ( url );
        }

        private Node createSpacer ()
        {
            Region spacer = new Region ();
            HBox.setHgrow ( spacer, Priority.ALWAYS );
            return spacer;
        }

        protected void layoutChildren ()
        {
            double w = getWidth ();
            double h = getHeight ();
            layoutInArea ( browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER );
        }

        protected double computePrefWidth ( double height )
        {
            return 750;
        }

        protected double computePrefHeight ( double width )
        {
            return 500;
        }
    }
}

在一些 Oracle 文档中有这种技术的一个很好的例子,但自从上次 JavaFX 和站点更新以来,我根本找不到它。也许有人有旧文档的链接...

注意: 此外,jewelsea 提供了一种进行后期更改(页面加载时)的好方法,但我需要完全“加载时”解决方案情况下,这样 WebView 就不会做两次渲染页面的双重作业(更改前后)。

【问题讨论】:

    标签: java webview javafx


    【解决方案1】:

    有点晚了,但你可以:

    1. 加载页面(不在屏幕上显示组件)。
    2. 在文档结构中更改您想要的内容。
    3. 展示舞台。

    更改后的内容将出现并开始对用户可见。

    【讨论】:

    • 这是一个选项,但它可能会延迟内容显示,而且在我的情况下,它更像是一种技巧而不是适当的解决方案。似乎“拦截”连接本身是完全按照我的意愿行事的唯一可行选择。
    【解决方案2】:

    the WebEngine document property添加一个监听器,当它发生变化时:

    更新

    要拦截正在运行的 html 源并可能在它到达 WebView 之前对其进行修改,您可以implement您自己的 UrlConnection 处理程序。这是我过去能够成功实现的目标。请参阅 id jsmith 下的 option 3 of my longish forum post 了解一些背景信息和有关如何执行此操作的指示。这样做的关键是设置URL.setURLStreamHandlerFactory(myHandlerFactory)

    【讨论】:

    • 感谢有关 WebEngine 文档更改的想法 - 它确实有效。但我仍然在寻找一个稍微不同的解决方案。要修改文档,我需要先等待它的加载,WebView 将至少渲染一次加载的文档。但我想拦截文档加载并修改传入的数据,所以第一个 WebView 渲染结果将是最后一个。我什至不需要任何已解析的 DOM 树来处理 - 处理简单的 HTML(文本)内容会更好,因为我有其他工具来解析和修改 HTML 内容。
    • 添加到上面的想法:你可以伪装 WebView 直到它完成第二次渲染。这不会修复“双重渲染”,但会阻止用户看到第一个
    • 添加了有关拦截和可能修改要加载到 WebView 中的流的信息。
    • 谢谢,这是一个很好的起点。我想我的问题现在已经回答了:)
    • 您可以粘贴您的自定义myHandlerFactory 吗?您在 Oracle 论坛中提到的链接已失效。
    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多