2010-02-14 62 views
3

背景:我必須下載帶有資源的網頁才能離線查看,但作爲這部分,我必須「重寫」鏈接的URL HTML網頁,所以他們的工作。這更好的是標準鏈接類型,但是我現在意識到有一些鏈接是由javascript動態創建的。如何在C#中評估Javascript? (需要獲取網頁的所有鏈接,包括java-script生成的鏈接)

問題:我可以使用什麼方法(甚至是現有的庫)來轉錄帶有動態生成的鏈接(從JavaScript)到具有正常非動態鏈接的網頁的網頁。 (如話,我可以做的URL重寫我需要做的)

注:

  • 這是幾乎一樣,如果我需要有一個JavaScript解釋器庫,我通過頁面的HTML,然後它可能吐出生成的java代碼?然後我可以根據需要重寫鏈接(結果不會使用JavaScript動態方法)。
  • 上下文是C#WinForms(3.5)應用程序。

感謝

PS。一些例子:

<script type="text/javascript"> 
     <!-- 
      document.write("<a href=\"/home.asp\" onMouseOver=\"MM_swapImage('tab_home','','/_includes/images/tab_home_.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\"/includes/images/tab_home.gif\" alt=\"Home\" name=\"tab_home\" width=\"45\" height=\"18\" border=\"0\" id=\"tab_home\"><\/a>"); 

      if (window.document.location.pathname.indexOf("mysite.asp") != "-1") { 
       document.write("<a href=\"/mysite.asp\" onMouseOver=\"MM_swapImage('tab_my_site','','/_includes/images/tab_my_site_.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\"/_includes/images/tab_my_site_.gif\" alt=\"My Site\" name=\"tab_my_site\" width=\"76\" height=\"18\" border=\"0\" id=\"tab_my_site\"><\/a>"); 
      } 
      else { 
       document.write("<a href=\"/mysite.asp\" onMouseOver=\"MM_swapImage('tab_my_site','','/_includes/images/tab_my_site_.gif',1)\" onMouseOut=\"MM_swapImgRestore()\"><img src=\"/_includes/images/tab_my_site.gif\" alt=\"My Site\" name=\"tab_my_site\" width=\"76\" height=\"18\" border=\"0\" id=\"tab_my_site\"><\/a>"); 
      } 

<script type="text/javascript"> 
    var fo = new FlashObject("/homepage/ia/flash/hero/banner.swf?q=1", "hero", "642", "250", "8", "#ffffff"); 
    fo.addParam("wmode", "transparent"); 
    fo.addParam("allowScriptAccess", "always"); 
    fo.addParam("base", "/homepage/ia/flash/hero/"); 
    fo.write("flashContent"); 
</script> 

<td width="1%"> 
    <a href="javascript:checksubmit(this);" 
     onmouseover="MM_swapImage('but_srch_go','','/_includes/images/but_srch_go_.gif',1)"  
     onmouseout="MM_swapImgRestore()">   
     <img src="http://localhost:3000/sites/http://qheps.health.qld.gov.au/_includes/images/but_srch_go.gif" alt="Go" name="but_srch_go" width="57" height="40" border="0"> 
    </a> 
</td> 

回答

2

如果你不使用WebBrowser控件,你可能能夠使用JScriptEvaluate方法JScript.NET但機會你需要評估的不僅僅是一個簡單的表達式。 WebBrowser控件當然是更簡單的路線。

如果您使用的是WebBrowser控件,可以很容易地從C#中調用「eval」方法。

/// <summary> 
/// Handles the Navigated event of the browser control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="T:WebBrowserNavigatedEventArgs"/> instance containing the 
/// event data.</param> 
private void browser_Navigated(object sender, WebBrowserNavigatedEventArgs e) 
{ 

    string codeToEval = "window.alert('blah')"; 

    if (browser.Document != null) { 

     object window = browser.Document.Window.DomWindow; 
     if (window != null) { 

      Type windowType = window.GetType(); 
      BindingFlags flags = BindingFlags.InvokeMethod | BindingFlags.Instance; 
      string[] args = { codeToEval, "JScript" }; 

      windowType.InvokeMember("[DispID=1165]", flags, null, window, args); 

     } // if 

    } // if 

} 

還有第三種選擇。您可以隨時下載HTML頁面,而無需在向用戶呈現HTML的代碼中重寫URL,您可以捕獲鏈接上的點擊並取消導航,而是導航到相應的「離線」鏈接。

+0

謝謝 - 我會研究這一點。那麼我是否可以使用這個控件而不必在表單中顯示呢?因爲它是針對不應該顯示給用戶的發動機罩下的例程。 – Greg

+0

除了線程問題之外,是的,您可以使用WebBrowser控件,該控件完全自動化並隱藏,而不會向用戶顯示任何內容。它當然會比純HTTP請求慢,因爲它會經過DOM,渲染引擎和腳本引擎(這正是你想要的)。我想你也可以在沒有WebBrowser的情況下嘗試MSHTML對象模型。這兩個選項都需要你有一個STA線程,並且可能是一個消息循環,所以請確保在Winforms主線程中完成你的工作。 – Josh

+0

嗯......只是執行jvascript本身呢?我將擁有頁面HTML +其他JS文件/文本頁面引用。事實上,你會認爲JavaScript引擎/庫只需要執行基本的字符串操作? – Greg

相關問題