Чтение переменной Javascript из элемента управления веб-браузера

Я пытаюсь прочитать значение переменной Javascript, которая загружается и вызывается из элемента управления WebBrowser в моей форме.

Пример:

index.html ссылается на javascript под названием «test.js». На test.js создается и заполняется несколько переменных.

index.html затем вызывает вызов этого JS.

Index.html загружается и отображается в элементе управления WebBrowser.

Я нашел много информации о том, как вызывать / вызывать функции, которые находятся в веб-браузере. Как я могу легко прочитать значение переменной?

Вы можете сделать:

Document.InvokeScript("eval", new object[] { "my_var_name" }); 

Вы можете использовать IHTMLDocument :: Script для получения интерфейса автоматизации механизма сценариев. Если вы используете элемент управления веб-браузерами Windows Forms в C #, это означает, что свойство htmlDocument.DomDocument присвоено mshtml.IHTMLDocument. Для WPF вы передаете документ напрямую.

Глобальные переменные добавляются в механизм сценариев как свойства и глобальные функции как методы. До IE9 вы можете использовать интерфейс IDispatch для доступа к этим функциям / переменным, если знаете свои имена. HtmlDocument.InvokeScript и WebBrowser.InvokeScript WPF обертывают это красиво, но только для System.Reflection.BindingFlags.InvokeMethod. Для доступа к переменным вам необходимо передать DISPATCH_PROPERTYGET, когда вы вызываете Invoke, то есть используете BindingFlags.GetProperty в управляемом коде.

Ручная поздняя привязка не интересна. Если вы хотите знать, насколько кропотливым является последнее связывание, проверьте сервер Binding для Office на Visual C # .NET .

В IE9 есть проблема, что переменные / функции недоступны через IDispatch , но вы по-прежнему можете обращаться к переменным / функциям через IDispatchEx аналогичным образом.

Я не думаю, что вы сможете просто получить значение своей переменной из своего JS, потому что ваш C # будет работать до того, как ваш js var будет существовать. У меня была такая же проблема с получением значений моих переменных js, и я не смог сделать это напрямую. Вы можете использовать метод HtmlTextWriter для получения значений. Это позволит вам использовать JS-вызов C #, который даст вам доступ к вашим значениям переменных.

Например:

  protected override void RenderContents(HtmlTextWriter writer) { EnsureChildControls(); base.RenderContents(writer); writer.BeginRender(); writer.RenderBeginTag(HtmlTextWriterTag.Script); writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); writer.Write("myJavaScriptVar = (\" + myC#Var + \")"); writer.RenderEndTag(); 

Не 100%, что он будет работать, но я знаю, что вы можете получить доступ к своим переменным js таким образом. Я сделал это с другими проектами. Надеюсь это поможет.

Чтобы получить доступ к глобальным переменным JavaScript-переменным, я использовал настраиваемый метод, включенный здесь под названием GetGlobalVariable() . (Он использует Document.InvokeScript из ответа Хуана . +1)

Скажем, ваши переменные JavaScript, созданные в глобальной области, как это:

 var foo = "bar"; var person = {}; var person.name = "Bob"; 

Затем вы можете получить доступ к этим значениям с помощью метода C # GetGlobalVariable() . (Возможно, вам потребуется настроить таймер, чтобы постоянно проверять, заполнены ли переменные.)

 var foo = GetGlobalVariable(webBrowser, "foo"); var name = GetGlobalVariable(webBrowser, "person.name"); 

Вот метод GetGlobalVariable() . Обратите внимание, что он проверяет каждую часть ссылки на переменные, чтобы избежать исключения.

 private object GetGlobalVariable(WebBrowser browser, string variable) { string[] variablePath = variable.Split('.'); int i = 0; object result = null; string variableName = "window"; while (i < variablePath.Length) { variableName = variableName + "." + variablePath[i]; result = browser.Document.InvokeScript("eval", new object[] { variableName }); if (result == null) { return result; } i++; } return result; } 

Взгляните на class HtmlWindow . Вы можете получить экземпляр из WebBrowser.Document.Window . Если переменные js имеют глобальную область видимости, они будут принадлежать объекту Window и должны быть доступны из WebBrowser.Document.Window.DomWindow в C #.

Я думаю, что это действительно предметный вопрос. Если вы включаете файл с именем test.js, и в этом файле у вас есть эта строка:

 var myVariable; 

Затем эта переменная создается с глобальной областью и доступна из любой точки вашей страницы, а также в любых других файлах JavaScript, которые вы включаете. Если вы объявите такую ​​переменную, вне функции, она будет создана с глобальной областью.

Одна мысль. Если вы не можете получить доступ к своей переменной на своей главной странице, убедитесь, что ваш скрипт, объявляющий его и назначающий значение, включен до того, как JavaScript на вашей странице попытается его использовать. У вас может быть проблема с исполнением.

  • Как остановить кнопки Back и Refresh от повторной отправки моей формы?
  • Мне нужен Content-Type: application / octet-stream для загрузки файла?
  • Как установить прокси для управления Webbrowser без использования прокси-сервера SYSTEM / IE
  • Как открыть браузер по умолчанию в C #
  • Загрузите SWF в WebView
  • Как отключить окно «Оповещение безопасности» в элементе управления Webbrowser
  • Управление WebBrowser в новом streamе
  • Откройте внешние ссылки в браузере с веб-браузером Android
  • как изменить браузер по умолчанию с помощью c # или командного файла
  • Что делает «дружественный URL»?
  • Является ли jQuery $ .browser устаревшим?
  • Interesting Posts
    Давайте будем гением компьютера.