Как оценить Javascript в C #? (необходимо получить все ссылки для веб-страницы, включая сгенерированные java-скриптом) - PullRequest
3 голосов
/ 14 февраля 2010

Предыстория: я должен загружать веб-страницы с их ресурсами для просмотра в автономном режиме, однако как часть этого я должен «переписать» URL-адреса для ссылок с веб-страницей HTML, чтобы они работали. Это нормально для стандартных типов ссылок, однако теперь я понимаю, что есть некоторые ссылки, которые динамически создаются javascript.

Вопрос: Какой подход (или даже существующую библиотеку) я мог бы использовать для транскрибирования веб-страницы с динамически генерируемыми ссылками (из 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>

1 Ответ

2 голосов
/ 14 февраля 2010

Если вы не используете элемент управления WebBrowser, вы можете использовать метод JScriptEvaluate в JScript.NET, но, скорее всего, вам придется оценивать не просто простое выражение. Элемент управления WebBrowser, безусловно, является более простым маршрутом.

Если вы используете элемент управления WebBrowser, вы можете довольно легко вызвать метод "eval" из C #.

/// <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-страницы как есть, не переписывая URL-адреса, а затем в коде, который представляет HTML-код пользователю, вы можете перехватить щелчок по ссылке и отменить навигацию и вместо этого перейти к соответствующей ссылке «offline». *

...