Visual Basic 在 iFrame 中获取被点击的元素
Visual Basic get clicked element in iFrame
我使用 VB.NET 框架制作了一个自定义浏览器来获取文档的元素。对于一个简单的总结,每次我单击一个元素时,documentClicked 都会显示一条消息,但是当我单击 iFrame 中的元素时,它不会给我任何数据。
我认为,由于 doc 是一个 HtmlDocument,而 iframe 将是一个 HtmlWindow 或类似的东西;这就是它不起作用的原因,但我不确定如何着手声明它。
基本上我只是希望能够单击任何页面上的任何元素,它会显示坐标和大小 - 除了 iFrame 中的元素之外的所有元素都可以正常工作。
Dim WithEvents doc As HtmlDocument
Private Sub WinBrowse_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles webBrowser.DocumentCompleted
doc = CType(sender, WebBrowser).Document
End Sub
Private Sub doc_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles doc.Click
documentClicked(webBrowser, e)
End Sub
您的方向非常正确。现在,正如我在评论中所说,这仅在 Iframe 和父 window 位于同一文档域中时才有效,否则您将获得未经授权的访问异常。
我还假设您在此页面上只有 1 个 iframe,否则您将不得不遍历列表并确定正确的 iframe。
VB
Public Class Form2
Dim WithEvents IframeDoc As HtmlDocument
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If (WebBrowser1.ReadyState = WebBrowserReadyState.Complete) Then
Dim doc = WebBrowser1.Document
Dim window = doc.Window
Dim IframeWindow = window.Frames(0)
IframeDoc = IframeWindow.Document
End If
End Sub
Private Sub Document_Click(sender As Object, e As HtmlElementEventArgs) Handles IframeDoc.Click
MessageBox.Show(e.ToElement.ToString())
End Sub
End Class
C#
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
var doc= webBrowser1.Document;
var window = webBrowser1.Document.Window;
var iframewindow = window.Frames[0]; //I am assuming its the first one
MessageBox.Show(iframewindow.Document.Domain);
}
}
private void Document_Click(object sender, HtmlElementEventArgs e)
{
MessageBox.Show(e.ToElement.ToString());
}
欢迎您简化变量声明。
我使用 VB.NET 框架制作了一个自定义浏览器来获取文档的元素。对于一个简单的总结,每次我单击一个元素时,documentClicked 都会显示一条消息,但是当我单击 iFrame 中的元素时,它不会给我任何数据。
我认为,由于 doc 是一个 HtmlDocument,而 iframe 将是一个 HtmlWindow 或类似的东西;这就是它不起作用的原因,但我不确定如何着手声明它。
基本上我只是希望能够单击任何页面上的任何元素,它会显示坐标和大小 - 除了 iFrame 中的元素之外的所有元素都可以正常工作。
Dim WithEvents doc As HtmlDocument
Private Sub WinBrowse_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles webBrowser.DocumentCompleted
doc = CType(sender, WebBrowser).Document
End Sub
Private Sub doc_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles doc.Click
documentClicked(webBrowser, e)
End Sub
您的方向非常正确。现在,正如我在评论中所说,这仅在 Iframe 和父 window 位于同一文档域中时才有效,否则您将获得未经授权的访问异常。
我还假设您在此页面上只有 1 个 iframe,否则您将不得不遍历列表并确定正确的 iframe。
VB
Public Class Form2
Dim WithEvents IframeDoc As HtmlDocument
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If (WebBrowser1.ReadyState = WebBrowserReadyState.Complete) Then
Dim doc = WebBrowser1.Document
Dim window = doc.Window
Dim IframeWindow = window.Frames(0)
IframeDoc = IframeWindow.Document
End If
End Sub
Private Sub Document_Click(sender As Object, e As HtmlElementEventArgs) Handles IframeDoc.Click
MessageBox.Show(e.ToElement.ToString())
End Sub
End Class
C#
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
var doc= webBrowser1.Document;
var window = webBrowser1.Document.Window;
var iframewindow = window.Frames[0]; //I am assuming its the first one
MessageBox.Show(iframewindow.Document.Domain);
}
}
private void Document_Click(object sender, HtmlElementEventArgs e)
{
MessageBox.Show(e.ToElement.ToString());
}
欢迎您简化变量声明。