Llamando al método del object javascript usando WebBrowser.Document.InvokeScript

En mi aplicación WinForms necesito llamar a la function javascript desde mi control WebBrowser. Usé Document.InvokeScript y funciona perfectamente con funciones solo, por ejemplo

Document.InvokeScript("function"). 

Pero cuando quiero llamar a un método de object javascript, por ejemplo

 Document.InvokeScript("obj.method") 

no funciona ¿Hay alguna manera de hacerlo funcionar? O una solución diferente a este problema? ¡Sin cambiar nada en el código de JavaScript!

Gracias por adelantado 🙂

El ejemplo en la documentation NO incluye el paréntesis.

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

Tratar

 Document.InvokeMethod("obj.method"); 

Tenga en count que puede pasar arguments si usa el método HtmlDocument.InvokeScript (String, Object []) .

Editar

Parece que no eres el único con este problema: HtmlDocument.InvokeScript – Llamar a un método de un object . Puede hacer una "function Proxy" como sugiere el póster de ese enlace. Básicamente tienes una function que invoca la function de tu object. No es una solución ideal, pero definitivamente funcionará. Seguiré buscando para ver si esto es posible.

Otra publicación sobre el mismo problema: Usar WebBrowser.Document.InvokeScript () para jugar con JavaScript externo . Interesante solución propuesta por C. Groß en CodeProject:

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

Podrías convertirlo en un método de extensión en HtmlDocument y llamarlo para ejecutar tu function, solo usando esta nueva function includeías paréntesis, arguments, las nueve yardas totales en la cadena que pasas (dado que se pasa a una evaluación) .

Parece que HtmlDocument no admite methods de llamada en objects existentes. Solo funciones globales. 🙁

Lamentablemente, no puede llamar a los methods de objects de forma inmediata con WebBrowser.Document.InvokeScript.

La solución es proporcionar una function global en el lado de JavaScript que puede networkingirigir su llamada. En la forma más simple, esto se vería así:

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

En su código .NET, debería usar esto de la siguiente manera:

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

Como mencionas que no puedes cambiar nada a tu código JavaScript existente, tendrás que inyectar el método de JavaScript anterior de alguna forma. Afortunadamente, el control WebBrowser también puede hacerlo por usted llamando al método eval ():

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

Para una implementación más robusta y completa, vea las herramientas WebBrowser que escribí y el artículo que explica ScriptingBridge que específicamente busca resolver el problema que describe.