2012-12-23 2 views
3

웹 페이지와 입력 단추가 있습니다. 이 버튼을 클릭하면 특정 div에 일부 데이터가로드됩니다. 내 문제는이 데이터를 잡을 수 없다는 것입니다.WebBrowser OnPropertyChange 이벤트가 실행되지 않습니다.

다음 코드는이 문제를 해결하기위한 시도이지만 성공하지 못했습니다.

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    HtmlElement div_result = webBrowser1.Document.GetElementById("div_result"); 
    div_result.AttachEventHandler("onpropertychange", new EventHandler(resultEventHandler)); 
} 
private void resultEventHandler(object sender, EventArgs e) 
{ 
    MessageBox.Show("Loaded"); 
} 

내가 입력 버튼을 클릭하면

은 DIV의 내용이 수정되고 있지만, resultEventHandler가 발생하지 않습니다.

그래서, 두 가지 질문이 있습니다

내 잘못이 코드에
  1. ?
  2. 타이머를 사용하지 않고 "Aplication.DoEvents()"이라는 일반적인 방법이 있습니까? C#에서 WebBrowser 컨트롤을 사용하여 아약스로 작업 하시겠습니까?
+0

"자식 요소의 innerText 또는 innerHTML을 변경해도 부모 요소에 대해 onpropertychange 이벤트가 실행되지 않습니다." 내용이 변경 될 때 DIV의 속성을 변경해야하기 때문에. http://msdn.microsoft.com/en-us/library/ie/ms536956(v=vs.85).aspx – aliassce

답변

0

자식 요소의 innerText 또는 innerHTML을 변경해도 부모 요소에 대해 onpropertychange 이벤트가 실행되지 않습니다.

+0

msdn에서이 메모를 읽었지만 하위 요소가 없습니다. 나는이 실험을 위해 특별하게 만든 매우 간단한 웹 페이지 (http://fast-index.ru/wbajax.php)를 가지고있다. – zerocube

0

왜 HtmlElement 이벤트가 작동하지 않는지 알 수 없습니다. 하지만이 같은 문제를 가지고 있었고, COM 래퍼를 사용하여 해결 :

mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)webBrowser1.Document.DomDocument; 
mshtml.IHTMLElement2 div_result = (mshtml.IHTMLElement2)doc.getElementById("div_result"); 
mshtml.HTMLElementEvents2_Event events = (mshtml.HTMLElementEvents2_Event)div_result; 
events.onpropertychange += resultEventHandler; 
0

이 너무 늦을 수 있지만 여기가 경우에 어쨌든 당신은 아직도 궁금하다 :

1 -는 HTMLElement div_result = webBrowser1.Document .GetElementById ("div_result"); 라인 # 1은 웹 페이지가로드되고 브라우저가 DocumentCompleted 이벤트를 호출 할 때 실행됩니다. 이벤트 핸들러에서 DOM 요소 "div_result"에 대한 포인터를 먼저 가져오고 div_result라는 HtmlElement 유형 변수를 지정합니다.

2 - div_result.AttachEventHandler ("onpropertychange", new EventHandler (resultEventHandler)); 라인 # 2 - "onpropertychange"이벤트를 등록하고 resultEventHandler 메소드를 리스너 메소드로 지정합니다.

웹 페이지의 버튼을 클릭 할 때마다 버튼이 제출되어 웹 페이지가로드되는 형태가됩니다. 그런데 버튼을 클릭 할 때 (게시 또는 가져 오기) 사용중인 게시 방법을 지정하지 않았습니다. 웹 페이지 다운로드가 완료되고 DOM 요소 트리가 생성되면 DocumentCompleted 이벤트가 호출됩니다. 당신은 DocumentCompleted 이벤트 핸들러 메서드는 위에서 설명한 지침을 수행했습니다.

버튼을 클릭 할 때마다 웹 페이지가 다시로드되고 onpropertychange 이벤트에 대한 이벤트 리스너가 다시 할당됩니다. 이벤트 리스너 만 할당하고 있습니다. 이벤트는 절대 호출되지 않습니다. 버튼을 클릭 할 때마다 정의됩니다. 당신은 첫번째 닭고기, 또는 계란 문제가 된 고전 있습니다. 그러나 귀하의 경우 치킨은 버튼 클릭 이벤트로 DocumentCompleted 메서드가 실행되어 메서드의 모든 변수 상태를 재설정하고 계란은 웹에서 버튼을 클릭하기 전에 DIV 요소의 onpropertychange 이벤트에 대한 포인터를 원합니다. 페이지. 구성되지 않은 DOM에서 포인터를 가져 오기 전에 이벤트 리스너를 htmlelement에 어떻게 할당합니까? DocumentCompleted 메서드가 포함 된 클래스에 Boolean 플래그 변수를 삽입하고 초기 상태를 설정합니다. div_result 변수를 DocumentCompleted 메서드 외부로 이동하면 범위가 확대되고 단추 클릭 이벤트에서 상태가 저장됩니다. 이렇게하면 div 요소에 대한 포인터가 생기고 웹 페이지가 처음 다운로드 될 때 onpropertychange 이벤트 리스너가 설정됩니다.DIV 요소의 onpropertychange 이벤트 리스너에 포인터를 한 번만 설정하려면 테스트를 추가하고 (다음 샘플 코드에 하나씩 넣음) 다음 번에 단추를 클릭하면 이벤트가 실행됩니다. 노트! 웹 페이지의 요소 나 이벤트에 대한 포인터를 저장 한 후에는 웹 페이지에 요소를 추가하거나 삭제하지 마십시오. 그렇지 않으면 DOM 트리에서 Element의 새 위치에 대한 포인터를 가져 오기 위해 DOM을 재분석해야합니다.

// 아래를 참조

나는 DIV에로드되는 데이터에 대한 자세한 정보가 필요 두 번째 질문에 대답하기 위해
class SomeClass 
{ 
    bool DocumentHasLoaded = false; 
    HtmlElement div_result = null; 

    //Constructor and other methods go here.... 

    //Then change your DocumentCompleted method to look like this: 
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 

     if (DocumentHasLoaded == false) // I prefer using a ! before the variable instead 
     { 
      DocumentHasLoaded = true; // You will have to create your own appropriately timed mechanism to reset this variable's state should you want to execute the whole process again. 
      div_result = webBrowser1.Document.GetElementById("div_result"); 
      div_result.AttachEventHandler("onpropertychange", new EventHandler(resultEventHandler)); 
     } 
    } 
} 

; 예 : 어디서 왔는지, 어떤 유형인지, 생각할 수있는 다른 관련 정보가 포함되어 있습니다.

+0

"대신 변수 앞에!를 사용하는 편이 낫습니다"라고하는 이유는 무엇입니까? - 네 대답이야. – weston