【200分】求解决webBrowser调用html页面JS

叫我三三 2012-05-31 11:23:42
我想用webBrowser向本地的html页面传值,结果出现了奇怪的问题。

代码如下:

下面是本地的html页面


<!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>
<title>显示</title>
<script src="jquery-1.5.2.min.js" type="text/javascript"></script>
<style type="text/css">
.BarNow
{
font-size:26px;
color:Blue;
}
</style>
<script language="javascript" type="text/javascript">
function ShowCode(source) {
$("#message").html(source);
}
</script>
</head>
<body>
<div id="message"></div>
</body>
</html>


用来订阅消息和发送信息的类


//订阅者
public interface Subscriber
{
void ShowMsg(string Msg);
}
public static class Message
{
static IList<Subscriber> Subscribers = new List<Subscriber>();

public static void Add(Subscriber sub)
{
Subscribers.Add(sub);
}
public static void Delete(Subscriber sub)
{
Subscribers.Remove(sub);
}
public static void AssignMessage(string Msg)
{
foreach (var sub in Subscribers)
{
sub.ShowMsg(Msg);
}
}
//调用Send发送消息给订阅者
public static void Send(string message)
{
AssignMessage(message);
}
}


订阅消息的窗体

[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public partial class Child : Form ,Subscriber
{
public Child(string name)
{
InitializeComponent();
test();
}
private void test()
{
webBrowser1.Navigate(HtmlPath+"Page.html");
webBrowser1.ObjectForScripting = this;
Message.Add(this);//订阅消息
}
//显示消息给html
public void ShowMsg(string Msg)
{
//检查消息是否接收到,得到接收的消息为;这是测试消息!
Label1.Text = Msg;
object[] objects = new object[10];
objects[0] = "<span class=\"BarNow\">" + Msg + "</span>";
webBrowser1.Document.InvokeScript("ShowCode", objects);
//通过订阅者的方式调用出现InvalidCastException异常。提示数字转换异常??
//通过button调用却是正常显示!!
}

private void Child_FormClosing(object sender, FormClosingEventArgs e)
{
Message.Delete(this);//取消订阅
Dispose();
}
//用窗体上button直接调用ShowMsg() 消息能正常显示消息
private void Button1_Click(object sender, EventArgs e)
{
//object[] objects = new object[1];
//objects[0] = "<span class=\"BarNow\">Adflsfjaslnlu</span>";
//webBrowser1.Document.InvokeScript("ShowCode", objects);
ShowMsg("这是测试消息!"); //直接用button调用成功。
}

父窗体的用打开所有子窗体,其中每个子窗体都是一个订阅者

foreach (string child in childs)
{
if (!string.IsNullOrEmpty(child))
{
Child childForm = new Child(child)
{
AccessibleName = child,
Text = child,
MdiParent = this ,
ShowInTaskbar=false,
ShowIcon=false
};
childForm.Show();
}
}


为什么,我用button直接调用就可以正常显示在html页面上,而通过订阅者模式却会出现异常呢?
...全文
303 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
叫我三三 2013-07-23
  • 打赏
  • 举报
回复
引用 6 楼 oXiRuRenSheng 的回复:
我想问下最后怎么解决的 求贴个代码
就是使用委托


public delegate void CallBackMsg(string Msg);
        #region 

        public CallBackMsg cbm;

        public form1()
        {
            InitializeComponent();
            cbm = SetMsg;

            webBrowser1.Navigate(Common.HtmlPath + "Page.htm");
            webBrowser1.ObjectForScripting = this;
        }
        

        private void SetMsg(string Msg)
        {
                webBrowser1.Document.InvokeScript("ShowMsg", new string[] { Msg });
        }
       
        #endregion
        public void ShowMsg(string Msg)
        {
            webBrowser1.Invoke(cbm, Msg);
        }
oXiRuRenSheng 2013-07-23
  • 打赏
  • 举报
回复
我想问下最后怎么解决的 求贴个代码
叫我三三 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
感觉可能是异步的问题
写在构造函数里的test()执行完成后.Html可能还没有加载完成.所以调用不成功
个人愚见
[/Quote]
不会的,html事先加载好的。我在用Child窗体上的button直接调用 ShowMsg()就没问题。
然后我在通过Send接口调用,还是会在webBrowser1.Document.InvokeScript("ShowCode", objects);
这一步出现异常。
__天涯寻梦 2012-05-31
  • 打赏
  • 举报
回复
如果是1楼说的原因,就注册窗体的 Shown 事件,在事件方法里调用 test() ,再注册 webBrowser1 的 DocumentCompleted 事件,在事件方法里执行 Message.Add(this);
txwtony 2012-05-31
  • 打赏
  • 举报
回复
感觉可能是异步的问题
写在构造函数里的test()执行完成后.Html可能还没有加载完成.所以调用不成功
个人愚见
叫我三三 2012-05-31
  • 打赏
  • 举报
回复
自己解决了~呼,webBrowser1.Document.InvokeScript("ShowCode", objects);
要用委托调用才行
ParanoidKing 2012-05-31
  • 打赏
  • 举报
回复
哪里调的Send?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧