【问题标题】:How to find the position of an element in the Web Browser Control?如何在 Web 浏览器控件中找到元素的位置?
【发布时间】:2012-02-09 19:41:03
【问题描述】:

我有一个带有网络浏览器控件的表单,它可以加载一个网页(它工作正常,页面加载正常)

现在我的问题是,我想查找特定的 url 链接是在首屏下方还是首屏之上 (我的意思是,用户是否必须向下滚动才能看到此链接) 这个 v 是否在不滚动的情况下可见,或者我们需要滚动才能看到它。我希望我很清楚

我进行了广泛的搜索,但似乎没有关于查找 html 元素位置(当前视图上方或下方)的信息

有没有人对此有所了解并可以指出正确的方向? (我正在寻找 c# 解决方案 - WinForms)

更新:非常感谢 John Koerner 提供的代码。非常感谢他为解决我的问题所付出的时间和精力。

还有乔纳森和其他所有人.. 我希望我也可以将乔纳森的回复标记为答案,但它只允许将一个回复标记为答案。他的评论也是明确而有用的提示。谢谢你们太棒了!!!

【问题讨论】:

  • 地铁?表格? WPF?银光?单触?
  • WinForms(已编辑和添加)
  • 如果它不可见,是否只想滚动到视图中?如果是这样,您可以使用 ScrollIntoView 方法来显示它。
  • 没有。我只需要知道这个链接是否在不滚动的情况下可见.. 还是我们需要滚动才能看到它。问题是这个链接可能出现在页面上的任何地方(不固定)。还是谢谢你

标签: c# winforms webbrowser-control


【解决方案1】:

好的,我已经在 google 和 stackoverflow 上对此进行了测试,它似乎可以工作:

private bool isElementVisible(WebBrowser web, string elementID)
{

    var element = web.Document.All[elementID];

    if (element == null)
        throw new ArgumentException(elementID + " did not return an object from the webbrowser");

    // Calculate the offset of the element, all the way up through the parent nodes
    var parent = element.OffsetParent;
    int xoff = element.OffsetRectangle.X;
    int yoff = element.OffsetRectangle.Y;

    while (parent != null)
    {
        xoff += parent.OffsetRectangle.X;
        yoff += parent.OffsetRectangle.Y;
        parent = parent.OffsetParent;
    }

    // Get the scrollbar offsets
    int scrollBarYPosition = web.Document.GetElementsByTagName("HTML")[0].ScrollTop;
    int scrollBarXPosition = web.Document.GetElementsByTagName("HTML")[0].ScrollLeft;

    // Calculate the visible page space
    Rectangle visibleWindow = new Rectangle(scrollBarXPosition, scrollBarYPosition, web.Width, web.Height);

    // Calculate the visible area of the element
    Rectangle elementWindow = new Rectangle(xoff,yoff,element.ClientRectangle.Width, element.ClientRectangle.Height);

    if (visibleWindow.IntersectsWith(elementWindow))
    {
        return true;
    }
    else
    {
        return false;
    }
}

然后要使用它,您只需调用:

isElementVisible(webBrowser1, "topbar")  //StackOverflow's top navigation bar

【讨论】:

  • 哇.. 太棒了。感谢 John Koemer。非常感谢您为帮助我付出的努力和时间。祝你好运.. 伙计们,你们都太棒了。非常感谢!!!!
  • 你让我开心,谢谢约翰
【解决方案2】:

我有一个可行的想法(从未尝试过,但这是我能提供给你的最好的,抱歉)

可以在webbrowsercontrol中调用javascripts函数:LINK

您还可以制作 javascripts 函数来为您提供元素的位置:LINK

如果你混合这两个概念,你可以知道元素是否可见,就像你知道 webbrowsercontrol 的大小一样。

请注意,您可以将 javascript 代码注入 webbrowsercontrol。这篇 SO 帖子解释了如何做到这一点:LINK

祝你好运。

【讨论】:

  • 谢谢乔纳森。我一定会试试的。如果有人有任何快速修复或更简单的方法,请不要犹豫添加它
  • Jonahtan,我希望我也可以将您的回复标记为答案,但它只允许将一个回复标记为答案。您的评论也非常清晰和有用的提示。改为评价你的答案
  • 谢谢 :D 没关系。我们来这里是为了帮助人们,而不是为了积分。
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多