当前位置:编程学习 > C#/ASP.NET >>

C# WebBrowser使用InvokeScript执行网页里的JS函数,如何知道js函数执行完成?

C# WebBrowser使用InvokeScript执行网页里的JS函数,如何知道网页中的js函数执行完成? --------------------编程问答-------------------- 可以在html页面的script函数最后,加一个return(返回值),来判断有没有执行到底,或者是发生异常(用try...catch捕捉)。
上个最简单的模型。
 <script type="text/javascript">
        // Function Without Parameters
        function JavaScriptFunctionWithoutParameters() {
            outputID.innerHTML = "JavaScript function called!";
            return 10;
        }
    </script>

 <div id="outputID">
    </div>

private void Form1_Load(object sender, EventArgs e)
        {
            this.webBrowser1.Url = new Uri(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "test.html");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string result = this.webBrowser1.Document.InvokeScript("JavaScriptFunctionWithoutParameters").ToString();
            MessageBox.Show(result);
        }
--------------------编程问答-------------------- InvokeScript会block住到js函数返回,可以得到js函数返回值。 --------------------编程问答--------------------
引用 楼主 zl_c 的回复:
C# WebBrowser使用InvokeScript执行网页里的JS函数,如何知道网页中的js函数执行完成?


你怎么知道它不会等函数执行完? --------------------编程问答--------------------
引用 1 楼 guwei4037 的回复:
可以在html页面的script函数最后,加一个return(返回值),来判断有没有执行到底,或者是发生异常(用try...catch捕捉)。

有个前提是我不能改变网页和网页中JS当函数的内容。这个JS函数是没有返回值的。
这种情况下如何捕捉JS函数已经执行完毕的呢? --------------------编程问答-------------------- 其实我想知道是 webBrowser1_DocumentCompleted事件中,如何在网页中的onload事件后才执行下一步C#语句。
比如下例,我想得到bbb,而不是aaa:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script>
function fun1()
{
document.getElementById("text").innerHTML = "bbb";
}
</script>
</head>

<body onload="fun1()">
<div id="text">aaa</div>
</body>
</html>
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            String Text = webBrowser1.Document.GetElementById("text").InnerHtml.ToString();
        }
--------------------编程问答-------------------- 如果返回就是执行完毕了! --------------------编程问答--------------------

void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.InvokeScript("eval", new object[] {@"
var fun = document.body.onload;
fun();
document.body.onload = null;
"});
String Text = webBrowser1.Document.GetElementById("text").InnerHtml.ToString();
}
--------------------编程问答--------------------
引用 7 楼 jshi123 的回复:

void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.InvokeScript("eval", new object[] {@"
var fun = document.body.onload;
fun();
document.body.onload = null;
"});
String Text = webBrowser1.Document.GetElementById("text").InnerHtml.ToString();
}


onload的js函数是在网页中的,并不是由webbrowser的InvokeScript来执行. --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 这个是针对你的例子,达到同步顺序执行onload之后再继续的效果。
简单的处理方式是在DocumentComplete事件中等上几十毫秒就行了。 --------------------编程问答-------------------- 比如webbrowser中点了按钮或做了什么处理后,请问如何通知winform? --------------------编程问答-------------------- http://bbs.csdn.net/topics/390598868 参考这个
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,