Вызов метода объекта javascript с использованием WebBrowser.Document.InvokeScript - PullRequest
9 голосов
/ 06 сентября 2011

В моем приложении WinForms мне нужно вызвать функцию javascript из моего элемента управления WebBrowser. Я использовал Document.InvokeScript, и он прекрасно работает только с функциями, например,

Document.InvokeScript("function").

Но когда я хочу вызвать метод объекта javascript, например,

Document.InvokeScript("obj.method")

это не работает. Есть ли способ заставить его работать? Или другое решение этой проблемы? Без что-либо изменить в коде JavaScript!

Заранее спасибо:)

Ответы [ 3 ]

9 голосов
/ 06 сентября 2011

Пример в документации НЕ содержит скобки.

private void InvokeScript()
{
    if (webBrowser1.Document != null)
    {
        HtmlDocument doc = webBrowser1.Document;
        String str = doc.InvokeScript("test").ToString() ;
        Object jscriptObj = doc.InvokeScript("testJScriptObject");
        Object domOb = doc.InvokeScript("testElement");
    }
}

Попробуйте

Document.InvokeMethod("obj.method");

Обратите внимание, что вы можете передавать аргументы, если используете Метод HtmlDocument.InvokeScript (String, Object []) .

Редактировать

Похоже, что вы не единственный с этой проблемой: HtmlDocument.InvokeScript - Вызовметод объекта .Вы можете создать «прокси-функцию», как это показано на постере этой ссылки.По сути, у вас есть функция, которая вызывает функцию вашего объекта.Это не идеальное решение, но оно обязательно сработает.Я продолжу поиск, чтобы увидеть, возможно ли это.

Еще один пост по той же проблеме: Использование WebBrowser.Document.InvokeScript () для работы с чужим JavaScript .Интересное решение, предложенное К. Гроссом для CodeProject:

private string sendJS(string JScript) {
    object[] args = {JScript};
    return webBrowser1.Document.InvokeScript("eval",args).ToString();
}

Вы можете сделать это методом расширения в HtmlDocument и вызвать его для запуска своей функции, только используя эту новую функцию, которую вы БУДЕТЕ включать скобки, аргументы, вседевять ярдов в строке, которую вы передаете (поскольку она просто передается в eval).

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

2 голосов
/ 28 мая 2018
 webBrowser.Document.InvokeScript("execScript", new object[] { "this.alert(123)", "JavaScript" })

для вас должно быть так

 webBrowser.Document.InvokeScript("execScript", new object[] { "obj.method()", "JavaScript" })
2 голосов
/ 14 июля 2015

К сожалению, вы не можете вызывать методы объекта из коробки, используя WebBrowser.Document.InvokeScript.

Решение заключается в предоставлении глобальной функции на стороне JavaScript, которая может перенаправить ваш вызов. В наиболее упрощенной форме это будет выглядеть так:

function invoke(method, args) {

    // The root context is assumed to be the window object. The last part of the method parameter is the actual function name.
    var context = window;
    var namespace = method.split('.');
    var func = namespace.pop();

    // Resolve the context
    for (var i = 0; i < namespace.length; i++) {
        context = context[namespace[i]];
    }

    // Invoke the target function.
    result = context[func].apply(context, args);
}

В вашем .NET-коде вы должны использовать это следующим образом:

var parameters = new object[] { "obj.method", yourArgument };
var resultJson = WebBrowser.Document.InvokeScript("invoke", parameters);

Поскольку вы упоминаете, что вы ничего не можете изменить в своем существующем коде JavaScript, вам придется каким-то образом вставить вышеупомянутый метод JavaScript. К счастью, элемент управления WebBrowser также может помочь вам, вызвав метод eval ():

WebBrowser.Document.InvokeScript("eval", javaScriptString);

Для более надежной и полной реализации см. Инструменты WebBrowser , которые я написал, и статью, объясняющую ScriptingBridge , специально предназначенную для решения описанной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...