2011-07-29 7 views
11

フォームのWebブラウザーコントロールから読み込まれ呼び出されるJavascript変数の値を読み取ろうとしています。WebブラウザコントロールからJavascript変数を読み取る

例:

index.htmlには、いくつかの変数が作成され、移植され、 'test.js' test.jsオンというJavaScriptを指します。

index.htmlこのJSを呼び出します。

WebブラウザーコントロールにIndex.htmlがロードされ、表示されます。

私は、Webブラウザコントロールにある関数を呼び出す/呼び出す方法について多くのヘルプを見つけました。どのようにして変数の値を簡単に読み取ることができますか?

答えて

-4

これは本当にスコープの問題だと思います。あなたはtest.jsというファイルを含めると、そのファイルにこの行がある場合:

var myVariable; 

をその変数はグローバルスコープで作成し、どこでもあなたのページでもそのあなたの他のJavaScriptファイル内からアクセスできます含める。そのような変数を関数の外で宣言すると、グローバルスコープで作成されます。

1つの考え。メインページで変数にアクセスできない場合は、ページ上のJavaScriptがその変数を使用する前に、宣言して値を割り当てるスクリプトが含まれていることを確認してください。あなたは実行の問題の順序を持​​つことができます。

+0

WebBrowserコントロールがWebページを読み込んだ後、どうすれば私のC#アプリケーションの内部からmyVariableにアクセスできますか? – AllStar11

+0

これはあなたが元に戻って元の質問を編集したいと思うかもしれない質問です。それはあまり明確ではありません。 –

1

私はあなたのJSから変数の値を得ることができるとは思わない、あなたのC#はjs varが存在する前でも実行されるからだ。私は自分のjs変数の値を取得することと同じ問題を自分自身が持っていて、私はそれを直接行うことができませんでした。あなたができることは、HtmlTextWriterメソッドを使って値を取得することです。これにより、変数値へのアクセスを提供するC#のレンダリングされたjs呼び出しを使用できます。例については

protected override void RenderContents(HtmlTextWriter writer) 
    { 
     EnsureChildControls(); 
     base.RenderContents(writer); 

writer.BeginRender(); 
     writer.RenderBeginTag(HtmlTextWriterTag.Script); 
     writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); 

     writer.Write("myJavaScriptVar = (\" + myC#Var + \")"); 
writer.RenderEndTag(); 

ないそれが動作することを100%、私はあなたがこの方法であなたのjsの変数にアクセスすることができます知っています。私は他のプロジェクトでこれを行っています。お役に立てれば。

0

HtmlWindow Classをご覧ください。 WebBrowser.Document.Windowからインスタンスを取得できます。あなたのjs変数がグローバルスコープを持っている場合、それらはWindowオブジェクトに属し、C#のWebBrowser.Document.Window.DomWindowからアクセス可能でなければなりません。

+1

これを実行した後、どのように変数にアクセスできますか? – AllStar11

2

IHTMLDocument :: Scriptを使用すると、スクリプトエンジンのオートメーションインターフェイスを取得できます。 C#でWindows Forms webbrowserコントロールを使用する場合は、HtmlDocument.DomDocumentプロパティをmshtml.IHTMLDocumentにキャストすることを意味します。 WPFの場合は、ドキュメントを直接キャストします。

グローバル変数はプロパティとしてグローバル変数に追加され、メソッドとしてグローバル関数がスクリプトエンジンに追加されます。 IE9まで、IDispatchインターフェイスを使用して、その名前を知っていれば、それらの関数/変数にアクセスすることができます。 HtmlDocument.InvokeScriptとWPFのWebBrowser.InvokeScriptはこれをうまく処理しますが、System.Reflection.BindingFlags.InvokeMethodの場合のみです。変数にアクセスするには、Invokeを呼び出すときにDISPATCH_PROPERTYGETを渡す必要があります。つまり、マネージコードでBindingFlags.GetPropertyを使用します。

手遅れのバインディングは楽しいものではありません。手間のかかる遅延バインディングを知りたい場合は、Binding for Office automation servers with Visual C# .NETをチェックしてください。

There is a problem in IE9 that the variables/functions are not accessible via IDispatchでも同様の方法でIDispatchExを介して変数/関数にアクセスすることができます。

+0

InvokeScriptは、グローバルJS変数(HTMLWindowカスタムプロパティ)を取得/設定する最も適切な方法です。別のスレッドで私のコメントを参照してください:http://stackoverflow.com/questions/11242482/c-sharp-get-variable-from-webbrowser-generated-by-javascript#comment18867034_11317873 – RReverser

7

あなたが行うことができます:

Document.InvokeScript("eval", new object[] { "my_var_name" }); 
1

をJavaScriptの変数をグローバルスコープにアクセスするには、私はGetGlobalVariable()と呼ばれるここに含まカスタムメソッドを使用していました。 (。それはJuan's answerからDocument.InvokeScriptを使用しています1)

のは、このようなグローバルスコープで作成したJavaScript変数を言ってみましょう:

var foo = "bar"; 
var person = {}; 
var person.name = "Bob"; 

次に、あなたがそうのようなC#GetGlobalVariable()方法を使用して、これらの値にアクセスすることができます。 (あなたは変数が移入された場合に、継続的にチェックするためにtimerを設定する必要があるかもしれません。)

var foo = GetGlobalVariable(webBrowser, "foo"); 
var name = GetGlobalVariable(webBrowser, "person.name"); 

ここGetGlobalVariable()方法があります。変数参照の各部分をチェックして例外を回避することに注意してください。

private object GetGlobalVariable(WebBrowser browser, string variable) 
{ 
    string[] variablePath = variable.Split('.'); 
    int i = 0; 
    object result = null; 
    string variableName = "window"; 
    while (i < variablePath.Length) 
    { 
     variableName = variableName + "." + variablePath[i]; 
     result = browser.Document.InvokeScript("eval", new object[] { variableName }); 
     if (result == null) 
     { 
      return result; 
     } 
     i++; 
    } 
    return result; 
} 
関連する問題