为啥不调用 WebBrowser 控件中通过 setTimeout 方法调度的代码
Posted
技术标签:
【中文标题】为啥不调用 WebBrowser 控件中通过 setTimeout 方法调度的代码【英文标题】:Why code scheduled via setTimeout method in WebBrowser control is not invoked为什么不调用 WebBrowser 控件中通过 setTimeout 方法调度的代码 【发布时间】:2011-09-29 01:02:29 【问题描述】:using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public static class Program
[STAThread]
public static void Main()
using (var browser = new WebBrowser())
browser.Navigate(string.Empty);
browser.Document.InvokeScript("execScript", new object[] "function set_obj(obj) window.obj = obj " );
browser.Document.InvokeScript("execScript", new object[] "function say_hello() window.obj.WriteLine('Hello world') " );
browser.Document.InvokeScript("set_obj", new object[] new Obj() );
browser.Document.InvokeScript("say_hello");
browser.Document.InvokeScript("setTimeout", new object[] "say_hello()", 100 );
Console.ReadKey();
[ComVisible(true)]
public sealed class Obj
public void WriteLine(string message)
Console.WriteLine(message);
方法 say_hello 的立即调用工作正常,但是当我使用 setTimeout 推迟它时,它不会被调用。为什么?有什么解决办法吗?
【问题讨论】:
我还尝试将函数而不是字符串作为参数传递给 setTimeout - 它没有帮助:browser.Document.InvokeScript("setTimeout", new object[] ((dynamic) browser .Document.Window.DomWindow).say_hello, 100 ); 【参考方案1】:正如用户@controlflow 指出的那样,我需要在我的应用程序中使用一个消息循环来使 setTimeout 工作。添加以下行会有所帮助:
Application.Run(new Form Controls = browser , WindowState = FormWindowState.Minimized, ShowInTaskbar = false );
【讨论】:
【参考方案2】:不要在 say_hello 后面加上括号,因为你不是想在那里调用它,而是将它作为委托传递给函数。所以试试:
browser.Document.InvokeScript("setTimeout", new object[] "say_hello", 100 );
另外,控制台中是否有任何错误?
更新:
试试:
browser.Document.InvokeScript("setTimeout(say_hello, 100);");
也可以试试:
browser.Document.InvokeScript("setTimeout", new object[] "say_hello", "100" );
无论是什么问题,都可能是某个地方吞下了 javascript 错误。尝试写出渲染的标记和脚本,并在浏览器的普通网页中运行它。
【讨论】:
省略括号不会改变任何东西。不,控制台上没有错误。【参考方案3】:您应该更改以下行
browser.Document.InvokeScript("say_hello");
到
browser.Document.InvokeScript("say_hello()");
它抛出一个javascript异常,可能是下一个命令不执行的原因。
【讨论】:
不应包含参数。见文档:msdn.microsoft.com/en-us/library/4b1a88bz.aspx以上是关于为啥不调用 WebBrowser 控件中通过 setTimeout 方法调度的代码的主要内容,如果未能解决你的问题,请参考以下文章
VisualStudio版本更新了这么多,为啥不把附带的webbrowser控件升级下,搞个支持chrome内核的?
此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?
对于 IE10,为啥 WebBrowser 控件的默认 quirks 模式是“Internet Explorer 5 quirks”?