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

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

Пример:

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Пример:

 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 таким образом. Я сделал это с другими проектами. Надеюсь, это поможет.

Ответ 4

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

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

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

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

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;
}

Ответ 5

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

Ответ 6

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

var myVariable;

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

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