3

Webページと入力ボタンがあります。このボタンをクリックすると、特定のdivにいくつかのデータがロードされます。私の問題は、このデータを取得できないことです。

次のコードは、この問題を解決するための私の試みですが、成功しませんでした。

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しません。

だから、私は2つの質問があります:

  1. このコードのどこに私の欠点がありますか?
  2. C#のコントロールを Aplication.DoEvents()使用してajaxを操作する「通常の方法」(タイマーやを使用しないことを意味します)はありますか?WebBrowser
4

3 に答える 3

0

これは遅すぎるかもしれませんが、まだ疑問に思っている場合に備えて、とにかくここにあります:

1 - HtmlElement div_result = webBrowser1.Document.GetElementById("div_result"); 行 #1 は、Web ページが読み込まれ、DocumentCompleted イベントがブラウザーによって呼び出されたときに実行されます。イベント ハンドラー内で、最初に DOM 要素 "div_result" へのポインターを取得し、div_result という名前の HtmlElement 型変数を割り当てます。

2 - div_result.AttachEventHandler("onpropertychange", 新しい EventHandler(resultEventHandler)); 2 行目 - 「onpropertychange」イベントを登録し、resultEventHandler メソッドをリスナー メソッドとして割り当てます。

Web ページのボタンをクリックするたびに、ボタン (私が推測) は、Web ページをロードする送信されるフォームになっています。ちなみに、ボタンがクリックされたときに使用している投稿方法(取得または投稿)を指定していませんでした。Web ページのダウンロードが完了し、DOM 要素ツリーが構築されると、DocumentCompleted イベントが呼び出されます。DocumentCompleted イベント ハンドラー メソッドで上記の手順を実行しました。

ボタンをクリックするたびに Web ページがリロードされ、onpropertychange イベントのイベント リスナーを再割り当てします。イベントリスナーのみを割り当てています。イベントが呼び出されることはありません。ボタンをクリックするたびに定義されます。鶏が先か卵が先かという古典的な問題があります。しかし、あなたの場合、チキンはボタンクリックイベントであり、メソッド内のすべての変数の状態をリセットする DocumentCompleted メソッドを実行し、ウェブでボタンがクリックされる前に、卵は DIV 要素の onpropertychange イベントへのポインターを必要としています。ページ。構築されていないDOMからポインタを取得する前に、イベントリスナーをhtml要素にどのように割り当てますか? DocumentCompleted メソッドを含むクラスに Boolean フラグ変数を配置し、その初期状態を設定します。div_result 変数を DocumentCompleted メソッドの外に移動して、スコープを拡大し、ボタン クリック イベント全体で状態を保存します。このようにして、div 要素へのポインターを取得し、Web ページが初めてダウンロードされるときにその onpropertychange イベント リスナーを設定します。DIV 要素の onpropertychange イベント リスナーへのポインターを 1 回だけ設定する場合は、テストを追加します (以下のサンプル コードに 1 つ入れています)。次にボタンをクリックすると、イベントが発生します。ノート!Web ページの要素またはそのイベントへのポインタを格納した後は、Web ページに要素を追加または削除しないでください。それ以外の場合は、DOM を再解析して、DOM ツリー内の Element の新しい位置へのポインターを取得する必要があります。

//下記参照:

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

2 番目の質問に答えるには、DIV に読み込まれるデータに関する詳細情報が必要です。たとえば、それがどこから来て、どのようなタイプであるか、および考えられるその他の関連情報などです。

于 2014-09-30T03:31:59.680 に答える
0

子要素の innerText または innerHTML を変更しても、親要素の onpropertychange イベントは発生しません。

于 2012-12-24T01:51:33.690 に答える
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;
于 2014-06-25T10:46:46.017 に答える