为啥不调用 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”?

如何让webbrowser控件支持Html5

为啥我的添加好友测试路由在 insomina 中通过了 200 OK,但是当我调用获取所有用户时它没有嵌套?

VB模拟鼠标点击webbrowser控件网页