2012-09-25 36 views
27

Tôi đang sử dụng một điều khiển WebBrowser và tôi muốn thao tác Mã HTML trước khi nó được hiển thị trong Control.Thay đổi HTML trong WebBrowser trước khi nó được hiển thị cho người dùng?

Ví dụ mở trang web A với nội dung sau:

<html> 
    <body> 
    <p id="Text">Hello</p> 
    </body> 
</html> 

Tôi muốn thay đổi nó để

<html> 
    <body> 
    <p id="Text">Bye</p> 
    </body> 
</html> 

Tôi biết tôi có thể làm điều đó với sự kiện DocumentCompleted và sau đó vận dụng nó. Nhưng nếu trang web thực hiện các công cụ JavaScript được thực hiện trên sự kiện sẵn sàng Tài liệu, sẽ không có ý nghĩa gì khi thay đổi nó, bởi vì nó đã được thực thi.

+0

Bạn muốn thay đổi HTML đã tải xuống trước khi hiển thị và sau đó chỉ hiển thị mã đã thay đổi, đúng không? –

+0

Yea bạn nói đúng, đó chính là điều tôi muốn làm .. – RaphaelH

Trả lời

14

Bạn có thể làm các thao tác DOM bên trong sự kiện Navigated:

webBrowser1.Navigated += (sender, e) => 
{ 
    ((WebBrowser)sender).Document.GetElementById("Text").InnerHtml = "Bye"; 
}; 

này sẽ thực thi trước khi bất cứ xử lý sẵn sàng DOM trong tài liệu. Vì vậy, ví dụ nếu bạn có HTML sau ban đầu:

<html> 
<head> 
    <title>Test</title> 
</head> 
<body onload="document.getElementById('Text').innerHTML = document.getElementById('Text').innerHTML + ' modified';"> 
    <p id="Text">Hello</p> 
</body> 
</html> 

Khi bạn hiển thị mã này trong WebBrowser bạn sẽ nhận được Bye modified.

+2

Tôi thích ý tưởng này .. Nhưng vấn đề là, nếu Tài liệu HTML nhỏ hơn một chút, Trình điều khiển WebBrowser không đọc mọi thứ cùng một lúc, vì vậy Sự kiện điều hướng được gọi, nhưng nó vẫn đang tải trang .. – RaphaelH

0

Điều này không hoạt động. Tôi đang đối mặt với vấn đề tương tự. Nếu bạn muốn sửa đổi các cuộc gọi ajax thì sao? Phương pháp điều hướng không bao giờ cháy. Ngoài ra, phương pháp điều hướng không bao giờ kích hoạt trên iFrames.

Tôi nghĩ giải pháp duy nhất là sử dụng proxy. Chỉ cần nhấp vào thêm gói NuGet. Tìm kiếm fiddlercore. Khi bạn thêm một tham chiếu đến http://www.telerik.com/fiddler/fiddlercore. Bây giờ, chỉ cần thực hiện tìm kiếm trên google về cách sửa đổi phản hồi bằng FiddlerCore. Tôi chắc chắn sẽ có rất nhiều ví dụ.

Lưu ý: khi bắt đầu lõi fiddler theo mặc định, nó sẽ thay đổi cài đặt proxy máy tính của bạn. Bạn không muốn điều đó! bạn chỉ muốn điều khiển webbrowser của bạn kết nối với nó không phải toàn bộ hệ thống của bạn. Vì vậy, khởi tạo lõi fidderl để nghe tại một cổng ngẫu nhiên mà không cần khởi động như một proxy hệ thống. Sau đó, đặt điều khiển trình duyệt web của bạn để kết nối với proxy đó.

Nó sẽ được phức tạp hơn khi cố gắng truy cập HTTPS trang web:/

0

Bạn có thể làm điều này trong một callback setInterval với một khoảng thời gian hợp lý (~ 20ms) và sau đó xóa các khoảng thời gian vào một thời điểm thích hợp như trên DOM sẵn sàng .

Thông báo trước duy nhất là cuộc gọi lại của bạn sẽ cần phải là idempotent vì nó sẽ được gọi nhiều lần. Tôi không nghi ngờ rằng sẽ khó khăn nếu bạn chỉ cần thêm thuộc tính dữ liệu hoặc tên lớp vào các nút DOM mà bạn đã sửa đổi để chúng không bị sửa đổi lần nữa.

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