InvokeScript无法正常工作

时间:2015-01-29 12:58:03

标签: c#

我正在使用WebBrowser来加载页面。完成后,我在该页面上调用ajax,但我的代码不等待ajax调用完成;这是代码:

Thread thread2 = new Thread(() =>
        {
            WebBrowser browser = new WebBrowser();
            browser.ScrollBarsEnabled = false;
            browser.ScriptErrorsSuppressed = true;

            browser.Navigate("http://localhost/testpdf.html");
            while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }
            var d = browser.Document.InvokeScript("$.ajax({type: 'GET', async:false,url: 'http://localhost/test2.html',complete: function (data) {                     $('body').html(d) } }); return $('body').html()"); //ajax
        });
        thread2.SetApartmentState(ApartmentState.STA);
        thread2.Start();
        thread2.Join();

d始终为空

1 个答案:

答案 0 :(得分:0)

当您调用InvokeScript时,它旨在执行已在页面的JavaScript中定义的函数。在您的情况下,您打算提供新的JavaScript,然后调用它。为了使其工作,您需要将JavaScript定义为页面中的函数,然后调用它,或使用内置函数(eval)为您执行代码。这称为“脚本注入”,是您要在此处使用的技术。在这种情况下请尝试eval,如下所示:

string scriptToRun = "$.ajax({type: 'GET', async:false,url: 'http://localhost/test2.html', success: function (data) { $('body').html(data); }, complete: function () {} }); $('body').html();"; //ajax
var d = browser.Document.InvokeScript("eval", new Object[] { scriptToRun});

请注意,我不会“返回”结果,而只是将其列为最后一个命令,因为这不是一个函数,而是一个要评估的脚本。另请注意,您希望在success调用中使用$.ajax处理程序,因为这是将获得结果的处理程序。查看jQuery ajax的文档,您会看到complete没有获得您期望的参数,但如果您想跟踪状态,可以包含complete处理程序。 / p>