2011-07-29 29 views
11

我想讀取一個JavaScript變量的值,該變量從窗體上的WebBrowser控件加載並調用。從Web瀏覽器控件讀取Javascript變量

實施例:

的index.html是指所謂的 'test.js' 在test.js JavaScript中,被創建並填充幾個變量。

index.html然後調用這個JS。

Index.html被加載並顯示到WebBrowser控件中。

我發現很多關於如何調用/調用駐留在Web瀏覽器控件中的函數的幫助。我如何輕鬆讀取變量值?

回答

-4

我認爲這確實是一個範圍問題。如果你有一個名爲test.js並在該文件中,你有這樣一行:

var myVariable; 

然後該變量與全球範圍內創建和訪問是從你的網頁的任意位置,也是任何其他JavaScript文件,你包括。如果在函數之外聲明一個像這樣的變量,它將使用全局作用域創建。

有一個想法。如果您無法在主頁面訪問您的變量,請確保您的頁面上的JavaScript嘗試使用它之前包含聲明它並分配值的腳本。您可能有執行問題的順序。

+0

因此,我的WebBrowser控件加載網頁後,如何從我的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窗體Web瀏覽器控件,這意味着將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()(它使用Document.InvokeScriptJuan's answer +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; 
}