2012-06-25 13 views
7

私がしたいことは、自分のHTMLコンテンツでWebページのHTMLコンテンツ(現在WebViewエンジン内にロードされている)の一部を置き換えることです。ロード中に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回(変更前後)行うことはありません。

答えて

6

the WebEngine document propertyにリスナーを追加し、それが変化した場合:

を使用して文書を変更してください更新

飛行中のHTMLソースを傍受し、潜在的にmそれがWebViewに達する前にodifyすることができます。implement独自のUrlConnectionハンドラが可能です。これは私が過去に成功することができたものです。いくつかの背景情報とこれを行う方法については、id jsmithのoption 3 of my longish forum postを参照してください。これを行うための鍵はURL.setURLStreamHandlerFactory(myHandlerFactory)です。

+0

WebEngineドキュメントの変更についてのお考えをありがとう - それは動作します。しかし、私はまだ若干異なる解決策を探していました。ドキュメントを変更するには、最初にロードを待つ必要があり、WebViewはロードされたドキュメントを少なくとも1回レンダリングします。しかし、私は最初のWebViewのレンダリングの結果が最終的なものになるように、ドキュメントの読み込みを傍受し、受信データを変更したい。私は動作するDOMツリーを解析する必要はありません.HTMLコンテンツを解析して変更するためのツールがあるので、単純なHTML(テキスト)コンテンツで作業するのは大丈夫です。 –

+0

上記の考え方を追加すると、2度目のレンダリングが終了するまでWebViewを装うことができます。これは "ダブルレンダリング"を修正するものではなく、ユーザが最初のものを見るのを妨げるでしょう。 – miniBill

+0

WebViewに読み込まれるストリームを傍受し、潜在的に修正するための情報を追加しました。 – jewelsea

2

それは少し遅れているが、あなたは可能性があります

  1. は(画面上のコンポーネントを表示せずに)ページをロードします。
  2. ドキュメント構造で必要なものを変更します。
  3. ショーステージ。

変更された内容が表示され、ユーザーの目に見えるようになります。

+0

これはオプションですが、コンテンツの表示が遅れることがあります。私の場合は適切な解決策よりもむしろハックです。私が望んでいたことを正確に行うには、接続自体を「傍受する」ことが唯一実行可能な選択肢であるようです。 –

関連する問題