2012-06-25 18 views
7

Lo que quiero hacer es reemplazar algunas partes del contenido HTML de la página web (que actualmente se está cargando dentro del motor WebView) con mi propio contenido HTML.Reemplazar parcialmente el contenido de WebView mientras se está cargando

Como un ejemplo simple, quiero reemplazar el color de fondo de cada cuerpo cargado de página a ROJO. Lo que significa que necesitaré agregar o reemplazar el atributo body bgcolor existente con mi propio valor. ¿Qué debo hacer para lograr eso?

Aquí es el código del navegador básico basado en JavaFX componente 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; 
     } 
    } 
} 

Hubo un buen ejemplo de esta técnica en algunos documentos de Oracle, pero desde el pasado JavaFX y actualizaciones del sitio no pude encontrar nada en absoluto . Tal vez alguien tiene el enlace a los viejos documentos ...

Nota: La solución también jewelsea ofrecen una buena manera de hacer después de los cambios (cuando se carga la página), pero necesito exactamente "de carga, mientras que" para mi caso, para que WebView no haga doble página de renderizado de trabajo (antes y después de los cambios).

Respuesta

6

Añadir un oyente a the WebEngine document property y cuando cambia:

Para interceptar la fuente html en vuelo y potencialmente m odificarlo antes de que llegue a WebView, puede implement su propio controlador UrlConnection. Esto es algo que he podido lograr con éxito en el pasado. Consulte option 3 of my longish forum post en el id jsmith para obtener información de contexto y consejos sobre cómo hacer esto. La clave para hacerlo es establecer URL.setURLStreamHandlerFactory(myHandlerFactory).

+0

Gracias por la idea de los cambios en el documento de WebEngine: funciona. Pero aún estaba buscando una solución ligeramente diferente. Para modificar el documento, primero debo esperar su carga y WebView mostrará el documento cargado al menos una vez. Pero quiero interceptar la carga de documentos y modificar los datos entrantes para que el primer resultado de renderizado de WebView sea el definitivo. Ni siquiera necesito que trabaje con ningún árbol de DOM analizado; será más que correcto trabajar con contenido HTML (de texto) simple ya que tengo otras herramientas para analizar y modificar contenido HTML. –

+0

Agregando a la idea anterior: podría enmascarar el WebView hasta que se haya terminado de renderizar por segunda vez. Esto no solucionaría el "doble render", pero evitaría que el usuario vea el primero. – miniBill

+0

Se agregó información para responder al interceptar y posiblemente modificar las secuencias que se cargarán en un WebView. – jewelsea

2

Es un poco tarde, pero es posible que:

  1. carga la página (sin mostrar el componente en la pantalla).
  2. Cambie lo que desee en la estructura del documento.
  3. Muestra el escenario.

Cambiado el contenido aparecerá y comenzará a ser visible para el usuario.

+0

Esa es una opción, pero puede retrasar la visualización del contenido y es más un truco que una solución adecuada en mi caso. Parece que la conexión "interceptar" en sí misma es la única opción viable para hacer exactamente lo que yo quería. –

Cuestiones relacionadas