2017-02-07 3 views
0

VB.NET 프레임 워크를 사용하여 문서의 요소를 가져 오는 사용자 지정 브라우저를 만들었습니다. 간단한 요약의 경우 각 요소를 클릭 할 때마다 documentClicked가 메시지를 표시하지만 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

웹 페이지에서 모든 iFrame을 찾아 요소를 찾으면 자동으로 iFrame의 요소를 가져올 수 있습니다. 기본적으로 HTMLFrame 대신 iFrame (HTMLWIndow)을 생성하는 iFrameClicked 하위가 필요합니다. 내 이해에. – Torewin

+0

OK - 유망한 것 같습니다 ... iframe 요소를 얻을 수 있다면 iframe 문서 (컨테이너 HTML 문서와 완전히 별개의 문서)에서 제대로 식별해야합니다. 코드를 보지 않고도 다른 방법을 제안 할 수는 없습니다. –

답변

0

궤적이 굉장히 컸습니다. 이제, 내 의견에 말했듯이 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()); 
    } 

당신은 변수 선언을 단순화에 오신 것을 환영합니다.

+0

이것은 내가 필요로하는 것을 성취 할 수있는 필요한 접지였습니다! 고맙습니다! – Torewin