2008-09-25 71 views
1

我們有一個包含ActiveX WebBrowser控件的Windows應用程序。作爲此應用程序的常規操作的一部分,將對ActiveX WebBrowser控件顯示的頁面進行修改。部分修改涉及在正在加載到ActiveX WebBrowser的網頁中設置JavaScript變量。試圖在C#中的ActiveX WebBrowser中設置/獲取JavaScript變量#

我們需要在C#中初始化這個變量(最初,VB6代碼正在初始化該值)。此變量的值是一個COM可見的類對象。

但是,爲了簡單起見,我們將問題簡化爲設置字符串值。我們原來的頁面幀涉及之類,但同樣的問題發生在頁面這樣的:

<HTML> 
<HEAD> 
    <TITLE>Test</TITLE> 
    <SCRIPT type="text/javascript"> 
    var field = 'hello world'; 
    </SCRIPT> 
</HEAD> 
<BODY> 
    <input type="button" value="See field" onclick="javascript:alert(field);"/> 
</BODY> 
</HTML> 

我們要訪問的變量和值分配給它。在VB6此代碼是非常簡單的:

doc.Script.field = 'newValue' 

然而,在C#中我們不得不訴諸其他伎倆,就像這樣:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null); 

頁的一點是要測試是否我們的變量是由C#正確分配的。點擊按鈕應該產生任何由C#注入的新值。例如,點擊頁面中的按鈕,我們會看到一個提示:「newValue」。

這是第一次,但它不起作用,如果我們重新加載頁面。在隨後的調用中,我們無法設置變量field的值。

以前有沒有人有過這種類型的操作經驗?

回答

0

我們常用的方法是在頁面上添加一個隱藏文本輸入框(ASP.Net控件版本)。這樣,您可以輕鬆地在C#代碼隱藏中設置其值,並在客戶端JavaScript中讀取值(當然,反之亦然)。

2

如果你使用WebBrowser控件,您可以指定交流對象#向 objectForScripting財產 http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx

後,你可以在你的JavaScript中使用的window.external從JavaScript

與C#對象進行交互

如果您因爲某種原因使用了activeX版本,則可以通過javascript:url以編程方式設置您的變量,或者您可以使用webservice/database/file同步化腳本,或者只使用您建議的方法。

7

我認爲你要找的是在Javascript中的eval()方法。您可以從C#這樣稱呼它:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"}); 

該代碼將評估"1 + 2"並返回"3"。我會想象如果你要投入

InvokeScript("eval", new String[] {"varName = 3"}) 

如果在文件中全局可見,你將得到分配給3的變量。

相關問題