Appel de la méthode d’object javascript à l’aide de WebBrowser.Document.InvokeScript

Dans mon application WinForms, j’ai besoin d’appeler la fonction javascript depuis mon contrôle WebBrowser. J’ai utilisé Document.InvokeScript et cela fonctionne parfaitement avec les fonctions seules, par exemple

Document.InvokeScript("function"). 

Mais quand je veux appeler la méthode d’object javascript par exemple

 Document.InvokeScript("obj.method") 

ça ne marche pas. Y a-t-il un moyen de le faire fonctionner? Ou une solution différente à ce problème? Sans rien changer dans le code javascript!

Merci d’avance 🙂

L’exemple de la documentation n’inclut PAS la parenthèse.

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

Essayer

 Document.InvokeMethod("obj.method"); 

Notez que vous pouvez passer des arguments si vous utilisez la méthode HtmlDocument.InvokeScript (Ssortingng, Object []) .

modifier

On dirait que vous n’êtes pas le seul à avoir ce problème: HtmlDocument.InvokeScript – Appeler une méthode d’un object . Vous pouvez créer une “fonction proxy”, comme le suggère l’affiche de ce lien. En gros, vous avez une fonction qui appelle la fonction de votre object. Ce n’est pas une solution idéale, mais ça va certainement marcher. Je vais continuer à chercher si c’est possible.

Autre article sur le même problème: Utilisation de WebBrowser.Document.InvokeScript () pour manipuler le code JavaScript étranger . Solution intéressante proposée par C. Groß sur CodeProject:

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

Vous pouvez en faire une méthode d’extension sur HtmlDocument et l’appeler pour exécuter votre fonction. En utilisant uniquement cette nouvelle fonction, vous DEVRAIEZ inclure des parenthèses, des arguments, les neuf verges de la chaîne que vous transmettez (étant donné qu’elle est simplement passée à un eval) .

On dirait que HtmlDocument ne prend pas en charge les méthodes d’appel sur des objects existants. Seules les fonctions globales. 🙁

Malheureusement, vous ne pouvez pas appeler des méthodes d’object prêtes à l’emploi à l’aide de WebBrowser.Document.InvokeScript.

La solution consiste à fournir une fonction globale du côté JavaScript permettant de redirect votre appel. Dans sa forme la plus simpliste, ceci ressemblerait à ceci:

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

Dans votre code .NET, vous utiliseriez ceci comme suit:

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

Comme vous mentionnez que vous ne pouvez rien changer à votre code JavaScript existant, vous devrez injecter la méthode JavaScript ci-dessus dans certaines méthodes. Heureusement, le contrôle WebBrowser peut également le faire en appelant la méthode eval ():

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

Pour une implémentation plus robuste et complète, voir les outils WebBrowser que j'ai écrits et l'article expliquant ScriptingBridge, qui vise spécifiquement à résoudre le problème que vous décrivez.

  webBrowser.Document.InvokeScript("execScript", new object[] { "this.alert(123)", "JavaScript" }) 

pour toi supposé être comme ça

  webBrowser.Document.InvokeScript("execScript", new object[] { "obj.method()", "JavaScript" })