在加载时部分替换WebView内容

时间:2012-06-25 11:43:04

标签: java webview javafx

我想要做的是用我自己的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就不会做两次双重作业渲染页面(更改前后)。

2 个答案:

答案 0 :(得分:8)

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

<强>更新

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

答案 1 :(得分:2)

有点晚了,但你可以:

  1. 加载页面(不在屏幕上显示组件)。
  2. 在文档结构中更改所需内容。
  3. 展示舞台。
  4. 比改变了内容将会出现并开始对用户可见。