Попытка установить / получить переменную JavaScript в ActiveX WebBrowser из C # - PullRequest
1 голос
/ 26 сентября 2008

У нас есть приложение для Windows, которое содержит элемент управления ActiveX WebBrowser. В рамках обычной работы этого приложения вносятся изменения в страницы, отображаемые элементом управления ActiveX WebBrowser. Часть этих изменений включает установку переменной JavaScript на веб-странице, загружаемой в ActiveX WebBrowser.

Нам нужно инициализировать эту переменную в 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>

Мы хотим получить доступ к переменной field и присвоить ей значение. В VB6 код для этого был довольно прост:

doc.Script.field = 'newValue'

Однако в C # нам пришлось прибегнуть к другим трюкам, например:

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

Смысл страницы в том, чтобы проверить, была ли наша переменная правильно назначена C #. Нажатие на кнопку должно дать любое новое значение, введенное C #. Например, нажав на кнопку на странице, мы получим предупреждение: «newValue».

Это работает в первый раз, но не работает, если мы перезагрузим страницу. При последующих вызовах мы не можем установить значение переменной field.

Кто-нибудь имел опыт работы с подобными операциями раньше?

Ответы [ 4 ]

7 голосов
/ 19 ноября 2009

Я думаю, что вы ищете метод eval() в Javascript. Вы можете назвать это из C # так:

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

Этот код оценивает "1 + 2" и возвращает "3". Я полагаю, что если бы вы положили в

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

вы бы присвоили этой переменной значение 3, если она будет видна глобально в файле.

2 голосов
/ 14 октября 2008

Если вы используете элемент управления webBrowser, вы можете назначить объект c # свойство objectForScripting http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx

после этого вы можете использовать window.external в вашем javascript для взаимодействия с вашим объектом c # из javascript

если по какой-то причине вы используете версию ActiveX, вы можете передать javascript: urls для программной установки вашей переменной, или вы можете синхронизировать ваш скрипт, используя веб-сервис / базу данных / файл или просто используя предложенный вами метод.

1 голос
/ 26 сентября 2008

Эти две статьи помогли нам найти решение нашей проблемы. Они обрисовывают основы того, что нужно знать:

Microsoft Web Browser Automation с использованием C #

Использование расширенных интерфейсов хостинга MSHTML

Итак, мы реализовали интерфейс DocHostUIHandler, и это позволило нам установить UIHandler, что позволило нам ссылаться на метод из Javascript.

0 голосов
/ 26 сентября 2008

Обычный метод, который мы используем, - добавить на страницу скрытое поле ввода текста (управляющая версия ASP.Net). Таким образом, вы можете легко установить его значение в коде C # и прочитать значение в клиентском JavaScript (и наоборот, конечно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...