HTML-アウトについてすべてのフレームがロード?
質問
います。ネブラウザます。アウトについてwebページが完全にロード?
知りたいのブラウザが取得ります。(その瞬間の家に書き込み'行'そのステータスバーに...).
注記:
- のDocumentComplete/NavigateCompleteイベントが発生する複数回のためのウェブサイトを含む複数のフレームに。
- ブラウザの準備状態にしても解決しません。
- しかしチェックフレームの数のフレームの収集とそのサウンド回数を取得しまDocumentCompleteイベントが動作しない。
- ます。ブラウザ.IsBusyなります。いつもは'false'にな時チェックでは、文書の完全ハンドラです。
解決 4
ここでは、最終的に私のために働いていたものです。
public bool WebPageLoaded
{
get
{
if (this.WebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
return false;
if (this.HtmlDomDocument == null)
return false;
// iterate over all the Html elements. Find all frame elements and check their ready state
foreach (IHTMLDOMNode node in this.HtmlDomDocument.all)
{
IHTMLFrameBase2 frame = node as IHTMLFrameBase2;
if (frame != null)
{
if (!frame.readyState.Equals("complete", StringComparison.OrdinalIgnoreCase))
return false;
}
}
Debug.Print(this.Name + " - I think it's loaded");
return true;
}
}
私は、すべてのHTML要素上で実行し、すべてのフレームが利用可能チェックし、各ドキュメントの完全なイベントでは(私はそれを最適化することができます知っています)。各フレームのために私はその準備状態を確認してください。 それはかなり信頼性の高いですが、ちょうどjeffamaphoneのように私はすでにいくつかの内部リフレッシュをトリガサイトを見ていると述べました。 しかし、上記のコードは私のニーズを満たします。
編集:すべてのフレームは、その中にフレームを含めることができますので、私は、このコードは、再帰的にすべてのフレームの状態をチェックするように更新されるべきだと思う。
。他のヒント
私のアプローチを行うためのもの そして、ホームページの読み込み完 を含むフレームのようなこと:
using System.Windows.Forms;
protected delegate void Procedure();
private void executeAfterLoadingComplete(Procedure doNext) {
WebBrowserDocumentCompletedEventHandler handler = null;
handler = delegate(object o, WebBrowserDocumentCompletedEventArgs e)
{
ie.DocumentCompleted -= handler;
Timer timer = new Timer();
EventHandler checker = delegate(object o1, EventArgs e1)
{
if (WebBrowserReadyState.Complete == ie.ReadyState)
{
timer.Dispose();
doNext();
}
};
timer.Tick += checker;
timer.Interval = 200;
timer.Start();
};
ie.DocumentCompleted += handler;
}
からその他の方法を学べた"don-s
- いや曲がりのスプーン...;-)
- なのは難しくなってい精緻な構築をDocumentComplete、フレームHtmlWindow.ロードイベントがあります。ソリューションが脆弱な場合。
- 使用しない
System.Timers.Timer
の代わりにWindows.Forms.Timer
, 不思議の誤差は発生し始めることができる珍しい場所だよりタイマーラの異なるスレッドはアプリです。 - 思いった、状況に応じた使い分けタイマーなDocumentCompleteるかもしれないので、その火災前のページでも始める荷重-実行コードを来ます
ここで私は自分のアプリケーションで問題を解決し方法は次のとおりです。
private void wbPost_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url != wbPost.Url)
return;
/* Document now loaded */
}
ここに私のテストバージョンです。ただ、これはあなたのDocumentCompleted Event Handler
を作り、あなたが唯一の方法OnWebpageReallyLoaded()
にのかつての呼び出すことがしたいコードを配置します。事実上、このアプローチは、そのことをやって、ページが200msの間安定していたときに決定します。
// event handler for when a document (or frame) has completed its download
Timer m_pageHasntChangedTimer = null;
private void webBrowser_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e ) {
// dynamic pages will often be loaded in parts e.g. multiple frames
// need to check the page has remained static for a while before safely saying it is 'loaded'
// use a timer to do this
// destroy the old timer if it exists
if ( m_pageHasntChangedTimer != null ) {
m_pageHasntChangedTimer.Dispose();
}
// create a new timer which calls the 'OnWebpageReallyLoaded' method after 200ms
// if additional frame or content is downloads in the meantime, this timer will be destroyed
// and the process repeated
m_pageHasntChangedTimer = new Timer();
EventHandler checker = delegate( object o1, EventArgs e1 ) {
// only if the page has been stable for 200ms already
// check the official browser state flag, (euphemistically called) 'Ready'
// and call our 'OnWebpageReallyLoaded' method
if ( WebBrowserReadyState.Complete == webBrowser.ReadyState ) {
m_pageHasntChangedTimer.Dispose();
OnWebpageReallyLoaded();
}
};
m_pageHasntChangedTimer.Tick += checker;
m_pageHasntChangedTimer.Interval = 200;
m_pageHasntChangedTimer.Start();
}
OnWebpageReallyLoaded() {
/* place your harvester code here */
}
どのようにフレームが完了したときにフラグを設定し、フラグのC#の外観を持つように、各フレームではJavaScriptを使用してはどうですか?
私はあなたのための選択肢を持っていないが、ハンドラがまだ実行されているので、ドキュメントの完全なハンドラ中IsBusy
プロパティーであるtru
eがあるため、WebBrowser
コントロールは、まだ技術的には「忙しい」である場合、私は疑問に思う。
最も簡単な解決策は、IsBusy
フラグ(エラーの場合に最大実行時間に)リセットされるまで、100msごとかそこらを実行するループを有することであろう。もちろん、それはIsBusy
は、ページの読み込み中の任意の時点でfalse
するように設定されないことを前提としています。
完全ハンドラは、別のスレッドで実行される文書は、あなたが眠るとドキュメントの完全なスレッドからそれを覚ますためにあなたのメインスレッドを送信するためにロックを使用することができます。 IsBusy
フラグをチェックし、再ロックメインスレッドは、依然としてtrue
である。
私はそれがうまくいくか分からないが、そのようなあなたのフレームセットでJavaScript「のonload」イベントを追加しようとします:
function everythingIsLoaded() { alert("everything is loaded"); }
var frameset = document.getElementById("idOfYourFrameset");
if (frameset.addEventListener)
frameset.addEventListener('load',everythingIsLoaded,false);
else
frameset.attachEvent('onload',everythingIsLoaded);
あなたはjQueryのを使用することはできますか?そして、あなたは簡単にターゲットフレームのフレーム準備イベントを結合することができます。 href="https://stackoverflow.com/questions/205087/jquery-ready-in-a-dynamically-inserted-iframe">参照してください。このブログ記事でも、それについての議論を持っています。最後にhref="http://ideamill.synaptrixgroup.com/?page_id=18" rel="nofollow noreferrer">プラグインで使用することができの
アイデアは、あなたが使用してWebページ内のフレームの数を数えることです。 と、あなたは、iframeのreadyイベントが発射された回数をカウントします。$("iframe").size()
あなたは外側のWebページのBeforeNavigateとのDocumentCompleteイベントだけでなく、各フレームを取得します。あなたは、外側のウェブページのためのDocumentCompleteイベントを取得するときに設定が完了している知っています。あなたはのIWebBrowser2の管理equivilentを使用することができるはずです:: TopLevelContainer()がこれを決定するします。
ページは本当に永遠に行われているかどうかを知ることはありませんので、しかし、ウェブサイト自体は、より多くのフレームナビゲーションにそれが望んでいつでもトリガすることができ、注意してください。あなたができる最善のは、あなたが見るすべてのBeforeNavigatesのカウントを保持し、あなたがのDocumentCompleteを得るとき、カウントをデクリメントです。
編集:ここでは、管理ドキュメントです: TopLevelContainer 。
私はちょうどwebBrowser.StatusTextメソッドを使用します。それは「完了」言うときすべてがロードされます! または私は何かが足りないのですか?
IE.readyState = READYSTATE_COMPLETEが動作するはずのチェック、それはあなたのための信頼性の証明ではないですし、あなたは文字通り、あなたがIEまでループを行うことができ、「IEがそのステータスバーに 『完了』の書き込みの瞬間」を知りたい場合は.StatusTextは、 "完了" が含まれています。
あなたはWebBrowser.IsBusy
プロパティを試したことがありますか?