Пытаюсь установить / получить переменную JavaScript в веб-браузере ActiveX из C#

StackOverflow https://stackoverflow.com/questions/136195

Вопрос

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

Нам нужно инициализировать эту переменную в C # (первоначально значение инициализировалось кодом VB6).Значение этой переменной является объектом класса COM-visible.

Однако для простоты мы свели проблему к заданию строкового значения.Наша исходная страница включает фреймы и тому подобное, но те же проблемы возникают и на странице, подобной этой:

<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 #.Так, например, нажав на кнопку на странице, мы получим предупреждение, показывающее:"Новое значение".

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

Был ли у кого-нибудь раньше опыт выполнения подобных операций?

Это было полезно?

Решение 3

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

Автоматизация веб-браузера Microsoft с использованием C#

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

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

Другие советы

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

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

Этот код будет оценивать "1 + 2" и вернуться "3".Я бы предположил, что если бы вы вставили

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top