2017-02-07 7 views
0

VB.NETフレームワークを使用してドキュメントの要素を取得するカスタムブラウザを作成しました。私は要素をクリックするたびに簡単な要約のために、メッセージを表示しますが、iFrameの中の要素をクリックすると、私には何のデータも与えません。Visual Basicで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 
+0

私はこれが完全な答えであるかどうかはわかりませんが、私の経験では、VB WebBrowserコントロールは完全なブラウザではありません。常駐IEブラウザエンジンを使用して簡単に表示するVBコントロールですHTMLページ。 いくつかの機能はその機能を超えています(contenteditableを使ってみてください)。 私はiframeを試していませんが、それが気に入らなければ私を驚かせることはありません。本当に限られています。 –

+0

私は、WebページのすべてのiFrameを見つけて要素を見つけることで、iFrameの要素を自動的に取得できます。基本的には、HTMLDocumentの代わりにiFrame(HTMLWIndow)を生成するiFrameClickedサブを持つ必要があります。私の理解に。 – Torewin

+0

OK - これは有望だと思います... iframe要素を取得できれば、iframeドキュメント(これはコンテナHTMLドキュメントとは別のドキュメントです)内で正しく識別する必要があるかもしれません。 コードが表示されていないと、他にはあまりお勧めできません。 –

答えて

0

あなたは正しい軌道に乗っていました。今、私のコメントで言ったように、Iframeと親ウィンドウの両方が同じドキュメントドメインにある場合にのみ動作します。そうしないと、不正アクセス例外が発生します。

このページにiframeが1つしかないと仮定しています。リストをループして正しいものを特定する必要があります。

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

あなたは、変数の宣言を簡素化するために歓迎されています。

+0

これは、私が必要とするものを達成するために必要な基礎的なものでした。ありがとうございました! – Torewin

関連する問題