2012-06-25 43 views
7

Điều tôi muốn làm là thay thế một số phần của nội dung trang web HTML (hiện đang được tải bên trong công cụ WebView) với nội dung HTML của riêng tôi.Thay thế một phần nội dung WebView khi đang tải

Ví dụ đơn giản - tôi muốn thay thế màu nền của từng trang đã tải thành ĐỎ. Có nghĩa là tôi sẽ cần thêm hoặc thay thế thuộc tính bgcolor body hiện tại bằng giá trị của riêng tôi. Tôi nên làm gì để đạt được điều đó?

Đây là mã trình duyệt cơ bản dựa trên JavaFX phần 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; 
     } 
    } 
} 

Có một ví dụ tốt về kỹ thuật này trong một số tài liệu Oracle nhưng vì JavaFX ngoái và cập nhật trang web của tôi không thể tìm thấy nó ở tất cả . Có lẽ bất cứ ai có liên kết đến tài liệu cũ ...

Lưu ý: Cũng jewelsea cung cấp một cách tốt để làm hậu thay đổi (khi trang web được tải), nhưng tôi cần phải chính xác "tải trong khi" giải pháp cho trường hợp của tôi, do đó WebView sẽ không làm hai trang kết xuất công việc hai lần (trước và sau khi thay đổi).

Trả lời

6

Thêm một người biết lắng nghe để the WebEngine document property và khi nó thay đổi:

Để chặn nguồn html trong chuyến bay và có khả năng phân biệt nó trước khi nó đạt đến WebView, bạn có thể implement trình xử lý UrlConnection của riêng bạn. Đây là điều tôi đã đạt được thành công trong quá khứ. Xem option 3 of my longish forum post trong trình hướng dẫn id để biết một số thông tin cơ bản và các gợi ý về cách thực hiện việc này. Chìa khóa để làm điều này là thiết lập URL.setURLStreamHandlerFactory(myHandlerFactory).

+0

Cảm ơn ý tưởng về các thay đổi trong tài liệu WebEngine - nó hoạt động. Nhưng tôi vẫn đang tìm kiếm một giải pháp hơi khác. Để sửa đổi tài liệu tôi cần phải đợi cho tải của nó đầu tiên và WebView sẽ làm cho tài liệu được nạp ít nhất một lần. Nhưng tôi muốn chặn tải tài liệu và sửa đổi dữ liệu đến để kết quả hiển thị WebView đầu tiên sẽ là kết quả cuối cùng. Tôi thậm chí không cần bất kỳ cây DOM được phân tích cú pháp nào để làm việc - nó sẽ tốt hơn để làm việc với nội dung HTML (văn bản) đơn giản vì tôi có các công cụ khác để phân tích cú pháp và sửa đổi nội dung HTML. –

+0

Thêm vào ý tưởng trên: bạn có thể giả mạo WebView cho đến khi nó được thực hiện hiển thị lần thứ hai. Điều này sẽ không khắc phục được "hiển thị kép", nhưng sẽ ngăn người dùng xem thông tin đầu tiên – miniBill

+0

Thêm thông tin để trả lời về chặn và có khả năng sửa đổi luồng được tải vào một WebView. – jewelsea

2

Đó là một chút muộn nhưng bạn có thể:

  1. tải trang (không hiển thị các thành phần trên màn hình).
  2. Thay đổi nội dung bạn muốn trong Cấu trúc tài liệu.
  3. Hiển thị sân khấu.

Thay đổi nội dung sẽ xuất hiện và sẽ bắt đầu hiển thị cho người dùng.

+0

Đó là một lựa chọn, nhưng nó có thể làm chậm hiển thị nội dung và nó là một hack hơn là một giải pháp thích hợp trong trường hợp của tôi. Dường như việc kết nối "chặn" chính nó là lựa chọn khả thi duy nhất để thực hiện chính xác những gì tôi muốn. –

Các vấn đề liên quan