Как вызвать функцию jQuery из элемента управления .NET WebBrowser с помощью InvokeScript ()? - PullRequest
8 голосов
/ 08 февраля 2012

Было приложение Windows Forms, использующее элемент управления WebBrowser (.NET 4) для загрузки веб-страницы, которая взаимодействовала с приложением. Мне позвонили по номеру InvokeScript(), чтобы однажды вызвать подпрограмму Javascript на веб-странице.

Теперь все было «обновлено», и теперь используется jQuery. Таким образом, вместо вызова OnVenueSelected() функции теперь есть некоторая $.city.venue.onVenueSelected: function(param) странность.

Простое изменение моего звонка с InvokeScript("OnVenueSelected", new object[] { params }) на InvokeScript("$.city.venue.onVenueSelected", new object[] { params }) не сработало. Я не получаю никаких видимых ошибок или исключений, но логика в вызове не вызывается.

Некоторое копание заставило меня попытаться использовать eval в качестве вызова и передать имя функции и параметры в качестве строки eval. Это тоже не сработало.

Есть ли известный способ вызова функции, встроенной в пару слоев магии jQuery?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 08 февраля 2012

ОК - я могу ответить на свой вопрос. Отчасти благодаря ответу на Как вызвать функцию jQuery из элемента управления .NET WebBrowser с помощью InvokeScript ()? , я смог изменить свой вызов функции jQuery на

string[] codeString = { String.Format(" {0}('{1}') ", @"$.city.venue.onVenueSelected", result.ToString()) };
this.myBrowser.Document.InvokeScript("eval", codeString);

Удивительно, но, похоже, это работает.

В моем случае переменная результата имеет тип bool (в случае, если это важно для любого).

2 голосов
/ 12 февраля 2012

Для тех, кто может не знать, вы также можете использовать .execScript в версиях управления WB до .NET и в текущих / .NET версиях управления WB. Вы также можете выбрать язык скрипта, который вы хотите выполнить, например: «JScript» или «VBScript». Вот один вкладыш:

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript"
1 голос
/ 10 февраля 2012

Да, это, вероятно, самый быстрый способ сделать это, потому что 'invokescript' просто нужно дать имя глобальной функции. Таким образом, после того, как функции углублены в некоторые структуры и все еще можно вызывать их через InvokeScript «более красиво», вам, например, придется написать одну обертку GLOBAL (диспетчер будет лучшее название), аналогично:

function callme(what, args) {
   var actualfunction = eval(what);   // or any other way to parse the 'what' and get a function
   return actualfunction(args);
}

и позже назовите это:

  • от JS:

    callme("$.city.venue.onVenueSelected", ..args..)
    

    (но я действительно не знаю, почему вы могли бы позвонить из JS:))

  • и из CS:

    browser.InvokeScript("callme", new string[]{ "$.city.venue.onVenueSelected", ..args.. })
    

таким образом, я думаю, вы могли бы передавать объекты как аргументы функции напрямую, без их строкового выражения

.. но, по моему опыту, в> 80% случаев вам просто нужно передать несколько простых чисел и строк или флагов настройки, так что все эти хлопоты, как правило, просто раздувание кода

...