Had a Windows Forms app using a WebBrowser control (.NET 4) to load a web page that communicated with the app. I had a call to InvokeScript()
to call a Javascri
OK - I get to answer my own question. Thanks in part to the answer by at How to call a jQuery function from .NET WebBrowser control using InvokeScript()?, I was able to change my call to the jQuery function to
string[] codeString = { String.Format(" {0}('{1}') ", @"$.city.venue.onVenueSelected", result.ToString()) };
this.myBrowser.Document.InvokeScript("eval", codeString);
Amazingly enough, this seems to be working.
In my case, the result variable is of type bool
(in case that matters to anyone).
For those that may not be aware, you can also use .execScript in pre-.NET versions of WB control and current/.NET versions of WB control. You can also choose the language of the script you want to execute, ie: "JScript" or "VBScript". Here is the one liner:
WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript"
Yeah, that is probably the quickest way to do that, because the 'invokescript' simply needs to be given a name of a global function. So after pushing the functions down deeper into some structures, and to still be able to call them via InvokeScript in a "more pretty" way, you would have to, for example, write a single GLOBAL wrapper (a 'dispatcher' would be a better name), similar to the:
function callme(what, args) {
var actualfunction = eval(what); // or any other way to parse the 'what' and get a function
return actualfunction(args);
}
and later call it:
from JS:
callme("$.city.venue.onVenueSelected", ..args..)
(but I truly dont know why you could want to call it from JS :))
and from CS:
browser.InvokeScript("callme", new string[]{ "$.city.venue.onVenueSelected", ..args.. })
this way, I think you would be able to pass objects as function arguments directly, without stringifying them
..but from my experience, in >80% of the cases, you just need to pass some simple numbers and strings or setup flags, so all that hassle is usually just a code bloat