質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

5回答

3634閲覧

C# WebBrowserControl ドキュメントの読み込みが完了したときのイベント

ElecDove

総合スコア254

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2015/10/23 14:02

お世話になります。

C#でWebBrowserControlを使用しており、DocumentCompletedイベントを使っているのですが、
ひとつのページを読み込む際に複数回このイベントが発生しております。

以前、同じような質問をした際にはフレームの読み込みが原因として挙げられましたが、フレームを使用していない(はずの)ページでもこの現象が起きます

ほんとうにページを構成するドキュメントの読み込みがおわった、ということを検出するにはどうすればよいのでしょうか

よろしくお願いいたします。

※関連する質問
https://teratail.com/questions/15652
C# WebBrowserコントロール webBrowser1_DocumentCompletedが三回呼ばれる

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

自分がやったのは宣伝がないサイトだったので違うと思いますが、情報のチェックの参考になるかもしれませんので書いておきます

C#

1// 遷移完了イベント:中身の読み込みはこのタイミングで始まるっぽいので処理済みフラグを折っておく 2private void WebBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e) 3{ 4 // フラグの初期化 5 フラグ = false; 6} 7 8// 読み込み中のイベントでWebBrowser.Urlがnullでなくなったら読み込みが開始されているらしい? 9// 逆を言うとnullなら読み込みが開始されてないっぽいのでNavigatedではなくここでnullなら【フラグを折るのでも良いかもしれない 10private void WebBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e) 11{ 12 if (WebBrowser.Url != null) 13 { 14 処理関数(); 15 } 16} 17 18// 読み込みが完全に完了した場合なんだけど実はとっくの昔に読み込みが完了して中のJSが処理を始めちゃっているタイミングでもあったりします 19// なので場合によっては既にここで介入しても既に手遅れの場合があります 20void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 21{ 22 処理関数(); 23} 24 25// 実際にやりたい処理なんだけど、自分の場合は一回だけしか実行したくなかったのでフラグのチェックを入れています 26// また、WebBrowser.Document.Bodyがnullだとドキュメントの読み込みが完了していない為、DOMにアクセスしようとすると実行時エラーが発生します 27private void starJavaScriptHook() 28{ 29 30 // 既に入れ替えを行っている場合は何もしない 31 if (フラグ) 32 { 33 return; 34 } 35 36 // bodyタグ内部の実体が用意されたら読み込み完了なので処理を実行 37 if(WebBrowser.Document.Body != null) 38 { 39 //ほんまにやりたいこと 40 } 41 42 // 処理済みフラグを立てる 43 フラグ = true; 44} 45

投稿2015/12/12 06:21

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのページが読み込んでいるファイルのすべてのレスポンスヘッダを見てみたところ、Navigatingの発生回数と(ヘッダで)Locationが生じている回数が一致しました

いくつものサイトで確認したわけではないですが、おそらくこれが原因なのではないかな・・・と考えております
(Locationが発生しているのはそのほとんどが広告関連のjsファイル)

ただ、プログラム中で広告に対するリダイレクトなのかどうかの判断はほぼ不可能に近い(AdBlockのように広告を検出するような技術も暇もない)と思うので、この辺は何とか妥協点を探しているところです

投稿2015/11/02 07:42

ElecDove

総合スコア254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

まだちゃんとした検証が終わってないのですが、Navigatingイベントも監視してみたところ、ひとつのページを読み込むのにこいつが何度も発生していました

リダイレクトが生じていたり、というのが原因かなと思っているのですが、まだその辺はちゃんと追いかけきれてないです(ちなみにYahooMailなんかだとガンガンイベントが生じます)

また新たな疑問が生じたら質問させていただきたいと思います

回答くださった皆様ありがとうございました

投稿2015/10/28 09:07

ElecDove

総合スコア254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

読み込もうとするページのソースは確認してみましたか?
例えば遅延読み込みされるようになっていたり..

投稿2015/10/24 21:01

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2015/10/28 09:05

特にそのような問題はありませんでした
guest

0

senderのReadStateがcompletedかで判断できます。

投稿2015/10/24 06:49

wakuwaku

総合スコア386

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2015/10/24 09:26

回答ありがとうございます Completedも複数回発生するので困っております 言葉足らずで申し訳ありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問