8

我想做的事情是用我自己的 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 就不会两次渲染页面(之前和之前)更改后)。

4

2 回答 2

8

向WebEngine 文档属性添加一个监听器,并在它更改时:

更新

要拦截飞行中的 html 源并可能在它到达 WebView 之前对其进行修改,您可以实现自己的 UrlConnection 处理程序。这是我过去能够成功实现的目标。有关如何执行此操作的一些背景信息和指示,请参阅我在 id jsmith 下的冗长论坛帖子的选项 3 。这样做的关键是设置URL.setURLStreamHandlerFactory(myHandlerFactory)

于 2012-06-25T17:37:02.670 回答
2

有点晚了,但你可以:

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

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

于 2016-08-08T11:19:38.543 回答