2011-10-08 21 views
11

Tôi làm cách nào để có được tiêu đề trang trong điều khiển WebBrowser khi tôi điều hướng đến các trang web khác nhau?Làm thế nào tôi có thể lấy tiêu đề trang trong điều khiển WebBrowser?


xmlns

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 

Thuộc tính bắt đầu với D

DataContext 
DesiredSize 
Dispatcher 
DoubleTap 

thẻ XAML

<phone:WebBrowser Name="browser" Height="760" VerticalAlignment="Top"></phone:WebBrowser> 

Trả lời

9

Tôi đã gặp vấn đề tương tự. Câu trả lời của @Akash Kava gần như chính xác nhưng đây là javascript chính xác để đọc tiêu đề html:

String title = (string)browser.InvokeScript("eval", "document.title.toString()"); 
+0

Như David đã nói, để làm việc đúng cách, điều này phải được gọi trong trình xử lý sự kiện ** WebBrowser.LoadCompleted **. Ngoài ra, vì điều này đang được thực thi trong một trình xử lý sự kiện, mã trên nên được gọi trong hành động của 'Control.Invoke' cho WPF hoặc' Dispatcher.Invoke' cho Silverlight/Windows Phone nếu giao diện người dùng đang được cập nhật. – Ben

0

Bạn có thể sử dụng InvokeScript để có được danh hiệu như,

String title = browser.InvokeScript("document.title"); 

Tôi không biết nó có chính xác hay không nhưng bạn cũng có thể thử window.title.

+0

Tôi đã thử sự kiện 'LoadCompleted' và nó đã ném một ngoại lệ không xác định. – BrunoLM

+0

Bạn phải bật kịch bản theo tài liệu msdn và phương pháp này chỉ có thể được gọi sau khi tài liệu được tải, do đó bạn phải đợi đôi khi tài liệu chưa sẵn sàng. –

+1

Tôi đã thử gọi điện thoại này khi nhận được sự kiện Điều hướng và nhận ngoại lệ có nội dung là "Lỗi: 80020006". Và có, tôi có IsScriptEnabled = "True" trong XAML của tôi. – tronman

0

Tôi khá chắc chắn rằng

String title = browser.Document.Title; 

nên làm các trick.

Xem here.

+0

Thuộc tính bắt đầu bằng D: DataContext, DesiredSize, Dispatcher, DoubleTap. (Microsoft.Phone.Controls). xaml tag: '' – BrunoLM

+1

Xin lỗi, đang nghĩ đến việc kiểm soát biểu mẫu WebBrowser thông thường. Bạn đã thử câu trả lời của @Akash Kava chưa nhưng thuộc tính 'IsScriptEnabled' được đặt thành' true'? –

+0

vâng, cùng một kết quả ... – BrunoLM

2

Đối với tôi, mã sau hoạt động. Các câu trả lời từ @Akash và @Mikko đặt tôi trên con đường đúng, nhưng tôi vẫn gặp một số vấn đề với một vài trang web. Vấn đề như tôi hiểu đó là sự kiện điều hướng được nâng lên khi thành phần WebBrowser bắt đầu nhận dữ liệu từ máy chủ từ xa. Vì vậy đối tượng DOM chưa hoàn thành, do đó, gọi document.title sẽ phát sinh lỗi. Vì vậy, tôi chỉ thử lại sau một vài phần nghìn giây cho đến khi tôi nhận được danh hiệu. "Vòng lặp" này chưa bao giờ lặp lại nhiều hơn 3 lần trên bất kỳ trang web nào tôi đã thử nghiệm và hoàn hảo mang lại cho tôi tựa đề đó mọi lúc.

private void webBrowser1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(UpdateText); 
} 

private void UpdateText(object o) 
{ 
    Thread.Sleep(100); 
    Dispatcher.BeginInvoke(() => 
    { 
     try 
     { 
      textBlock1.Text = webBrowser1.InvokeScript("eval", "document.title").ToString(); 
     } 
     catch (SystemException) 
     { 
      ThreadPool.QueueUserWorkItem(UpdateText); 
     } 
    }); 
} 
0

Đoạn code dưới đây làm việc cho tôi, lưu ý các trường hợp lái, nếu bạn sử dụng nạp nó sẽ kích hoạt ngay trước khi trang web được tải, bạn muốn điều đó để kích hoạt đôi "sau khi" trang là Fully Loaded, hành vi lái như sự kiện đó.

private void web1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
    { 
     //Added thread using "using System.Thread", to act as a buffer for any page delay. 
     Thread.Sleep(2000); 
     String title = (string)web1.InvokeScript("eval", "document.title"); 
     PageTitle.Text = title; 

    } 
1

Tất cả các câu trả lời là không chính xác 100%:

Bạn phải gọi như sau:

Chuỗi title = (string) browser.InvokeScript ("eval", "document.title.toString () ");

trong sự kiện LoadCompleted sự kiện của trình duyệt chứ không phải trong sự kiện điều hướng.

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