Почему код, запланированный с помощью метода setTimeout в элементе управления WebBrowser, не вызывается - PullRequest
3 голосов
/ 05 июля 2011
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, он не вызывается. Зачем? Есть ли обходной путь?

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

Как указал пользователь @ controlflow , мне нужен цикл сообщений в моем приложении, чтобы заставить setTimeout работать.Помогает добавление следующей строки:

Application.Run(new Form { Controls = { browser }, WindowState = FormWindowState.Minimized, ShowInTaskbar = false });
2 голосов
/ 05 июля 2011

Не ставьте круглые скобки после 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. Попробуйте выписать визуализированную разметку и скрипт и запустить его на обычной веб-странице в браузере.

0 голосов
/ 05 июля 2011

Вы должны изменить следующую строку

browser.Document.InvokeScript("say_hello");

на

browser.Document.InvokeScript("say_hello()");

Это вызывает исключение JavaScript, и, вероятно, это причина того, что следующая команда не будет выполнена.

...