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).
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. –
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
Se agregó información para responder al interceptar y posiblemente modificar las secuencias que se cargarán en un WebView. – jewelsea