在加载时部分替换WebView内容

Mik*_*rin 8 java javafx webview

我想要做的是用我自己的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

注:jewelsea提供了一个很好的方法,使后改变(在加载页面时),但我需要我的情况正是"负载,而"解决方案,这样的WebView不会做双重任务的渲染页面两次(前变更后).

jew*_*sea 8

将侦听器添加到WebEngine文档属性以及何时更改:

更新

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