Ответ 1
Вы можете сделать:
Document.InvokeScript("eval", new object[] { "my_var_name" });
Я пытаюсь прочитать значение переменной 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 для извлечения интерфейса автоматизации механизма 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 в аналогичным образом.
Я не думаю, что вы сможете просто получить значение своей переменной из своего 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 таким образом. Я сделал это с другими проектами. Надеюсь, это поможет.
Чтобы получить доступ к глобальным переменным 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;
}
Взгляните на класс HtmlWindow. Вы можете получить его экземпляр из WebBrowser.Document.Window
. Если переменные js имеют глобальную область видимости, они будут принадлежать объекту Window и должны быть доступны из WebBrowser.Document.Window.DomWindow
в С#.
Я думаю, что это действительно спорный вопрос. Если вы включаете файл с именем test.js, и в этом файле у вас есть эта строка:
var myVariable;
Затем эта переменная создается с глобальной областью и доступна из любой точки вашей страницы, а также в любых других файлах JavaScript, которые вы включаете. Если вы объявите такую переменную, вне функции, она будет создана с глобальной областью.
Одна мысль. Если вы не можете получить доступ к своей переменной на своей главной странице, убедитесь, что ваш script, который объявляет об этом и назначает значение, будет включен до того, как JavaScript на вашей странице попытается его использовать. У вас может быть проблема с исполнением.