我正在使用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始终为空
答案 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>