如何在Web浏览器中获取第一个可见的html元素?

时间:2013-07-13 21:53:00

标签: html wpf dom webbrowser-control

我正在使用.Net 4.0 WebBrowser(来自System.Windows.Controls)。在我的应用程序中,用户可以修改html数据,webbrowser显示更新。然后,应用程序应自动滚动到显示的上一个元素。

我在Windows 7上使用WPF / c#4.0。

详细说明:

  • 在代码中我调用WebBrowser.NavigateToString(htmlData1);
  • 用户滚动到任意位置
  • 用户更改(以某种方式)html文档
  • 现在我想找到(并记住)显示的第一个html元素
  • 我调用WebBrowser.NavigateToString(htmlData2);
  • 现在我想使用memorized元素自动滚动html文档(我知道有IHTMLElement.scrollIntoView()来执行此操作)

所以问题是:如何在WebBrowser中获得第一个可见的html元素?

您可能会说更新的html将不再具有记忆元素。对。但我在文档中有时间戳,并将使用记忆的html元素在新的html文档中找到最佳位置。

1 个答案:

答案 0 :(得分:0)

我认为我找到了正确的使用方法。在刷新文档时,实际上有两种可能性来保留滚动位置。

假设以下成员:

WebBrowser _browser;
HTMLDocument HtmlDoc { get { return (HTMLDocument)_browser.Document; } }

(1)如果文档没有真正改变(在我的例子中只改变了样式)我使用当前滚动位置在更新后自动滚动:

    刷新之前
  • _scrollPos = ((IHTMLElement2)(HtmlDoc.documentElement)).scrollTop;
    
  • 刷新后
  • HtmlDoc.parentWindow.scrollTo(0, _scrollPos);
    

(2)如果文件已经改变,我使用文件的左上方元素(已知结构)

    刷新之前
  • IHTMLElement el = HtmlDoc.elementFromPoint(50, 0);
    

    对el进行一些魔术(需要知道doc)并记住一些可用于在更新后搜索最佳元素的字符串。

    string beforeRefresh = fromElement(el);
    
  • 刷新后使用记住的字符串
  • 并在重新加载的html文档中搜索最佳的html元素。

    IHTMLElement newEl = fromString(beforeRefresh);
    newEl.scrollIntoView(true);
    

所以我缺少的实际方法是elementFromPoint()。其余的是“自定义逻辑”。