【问题标题】:How can I get the page title in WebBrowser control?如何在 WebBrowser 控件中获取页面标题?
【发布时间】:2011-12-03 16:54:11
【问题描述】:

当我导航到不同的网站时,如何在 WebBrowser 控件中获取页面标题?


xmlns

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

以 D 开头的属性

DataContext
DesiredSize
Dispatcher
DoubleTap

xaml 标记

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

【问题讨论】:

    标签: c# windows-phone-7 browser windows-phone-7.1


    【解决方案1】:

    你可以使用InvokeScript来获取标题,

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

    我不知道它是否正确,但你也可以尝试 window.title。

    【讨论】:

    • 我尝试了LoadCompleted 事件,它抛出了一个未知的异常。
    • 您必须根据 msdn 文档启用脚本,并且此方法只能在文档加载后调用,因此如果文档未准备好,您必须等待一段时间。
    • 我尝试在接收到 Navigated 事件时调用它,并得到一个显示为“错误:80020006”的异常。是的,我的 XAML 中有 IsScriptEnabled="True"。
    【解决方案2】:

    我很确定

    String title = browser.Document.Title;
    

    应该可以解决问题。

    here

    【讨论】:

    • 以 D 开头的属性:DataContext、DesiredSize、Dispatcher、DoubleTap。 (Microsoft.Phone.Controls)。 xml 标签:&lt;phone:WebBrowser Name="browser" Height="760" VerticalAlignment="Top"&gt;&lt;/phone:WebBrowser&gt;
    • 抱歉,我想的是常规的 Forms WebBrowser 控件。您是否尝试过 @Akash Kava 的答案,但将 IsScriptEnabled 属性设置为 true
    【解决方案3】:

    我遇到了同样的问题。 @Akash Kava 的回答几乎是正确的,但这是读取 html 标题的正确 javascript:

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

    【讨论】:

    • 正如大卫所说,要正常工作,必须在 WebBrowser.LoadCompleted 事件处理程序中调用它。此外,由于这是在事件处理程序中执行的,因此如果 UI 正在更新,则应在 WPF 的 Control.Invoke 或 Silverlight/Windows Phone 的 Dispatcher.Invoke 的操作中调用上述代码。
    【解决方案4】:

    对我来说,以下代码有效。 @Akash 和 @Mikko 的回答让我走上了正确的道路,但我仍然在一些网站上遇到了一些问题。据我了解,问题是当WebBrowser 组件开始从远程服务器获取数据时引发了导航事件。因此 DOM 对象尚未完成,因此调用 document.title 会引发错误。所以我只是在几毫秒后重试,直到我得到标题。这个“循环”从未在我测试过的任何网站上迭代超过 3 次,并且每次都完美地为我带来了标题。

    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);
            }
        });
    }
    

    【讨论】:

      【解决方案5】:

      下面的代码适用于我,请注意导航事件,如果您使用加载,它将在页面加载之前触发,您希望它在页面完全加载“之后”的某个时间触发,导航充当该事件。

      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;
      
          }
      

      【讨论】:

        【解决方案6】:

        所有答案并非 100% 正确:

        您必须调用以下代码:

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

        在浏览器的 LoadCompleted 事件中,而不是在 navigated 事件中。

        【讨论】:

          猜你喜欢
          • 2016-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-13
          • 2015-01-04
          • 1970-01-01
          相关资源
          最近更新 更多