我正在使用axWebBrowser,我需要使脚本工作,当列表框的选定项目更改时,该脚本才能工作。
在默认的webBrowser控件中,有一个类似的方法;
WebBrowserEx1.Document.InvokeScript("script")
但是在axWebBrowser中,我无法使用任何脚本!并且没有关于此控件的文档。
有人知道吗?
最佳答案
答案较晚,但希望仍然可以对某人有所帮助。使用WebBrowser ActiveX控件时,有多种方法可以调用脚本。相同的技术也可以用于WebForm浏览器控件的WinForms版本(通过webBrowser.HtmlDocument.DomDocument)和WPF版本(通过webBrowser.Document):
void CallScript(SHDocVw.WebBrowser axWebBrowser)
{
//
// Using C# dynamics, which maps to COM's IDispatch::GetIDsOfNames,
// IDispatch::Invoke
//
dynamic htmlDocument = axWebBrowser.Document;
dynamic htmlWindow = htmlDocument.parentWindow;
// make sure the web page has at least one <script> tag for eval to work
htmlDocument.body.appendChild(htmlDocument.createElement("script"));
// can call any DOM window method
htmlWindow.alert("hello from web page!");
// call a global JavaScript function, e.g.:
// <script>function TestFunc(arg) { alert(arg); }</script>
htmlWindow.TestFunc("Hello again!");
// call any JavaScript via "eval"
var result = (bool)htmlWindow.eval("(function() { return confirm('Continue?'); })()");
MessageBox.Show(result.ToString());
//
// Using .NET reflection:
//
object htmlWindowObject = GetProperty(axWebBrowser.Document, "parentWindow");
// call a global JavaScript function
InvokeScript(htmlWindowObject, "TestFunc", "Hello again!");
// call any JavaScript via "eval"
result = (bool)InvokeScript(htmlWindowObject, "eval", "(function() { return confirm('Continue?'); })()");
MessageBox.Show(result.ToString());
}
static object GetProperty(object callee, string property)
{
return callee.GetType().InvokeMember(property,
BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.Public,
null, callee, new Object[] { });
}
static object InvokeScript(object callee, string method, params object[] args)
{
return callee.GetType().InvokeMember(method,
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
null, callee, args);
}
要使JavaScript的
<script>
起作用,必须至少有一个eval
标记,可以如上所示进行注入。另外,可以使用
webBrowser.Document.InvokeScript("setTimer", new[] { "window.external.notifyScript()", "1" })
或webBrowser.Navigate("javascript:(window.external.notifyScript(), void(0))")
之类的方法异步初始化JavaScript引擎。关于c# - 如何在MSHTML中调用脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15273311/