一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。

Silverlight中内置了对于HTML、客户端脚本等的支持,本文为如何在Silverlight 2与HTML DOM进行交互第一部分,访问和修改DOM元素。

访问DOM元素

我们先来看一个简单的示例,如何访问HTML DOM。最终完成的效果如下,我们将在界面放置两个div,分别为div1和div2,下面绿色的区域为Silverlight部分,在第一个文本框中输入div的id并点击显示,将在下面显示出对应div上的文本信息。

TerryLee_Silverlight2_0083

首先我们需要对测试页做一下修改,因为默认的Silverlight插件所占的高度是100%,修改为200px。

<div  style="height:200px">
    <asp:Silverlight ID="Xaml1" runat="server" 
    Source="~/ClientBin/TerryLee.SilverlightAccessingHtmlDom1.xap" 
    Version="2.0" Width="100%" Height="200px" />
</div>

同时放置两个div:

<div id="div1">这里是第一个div,id为div1</div>
<div id="div2">这里是第二个div,id为div2</div>

为了看起来明显起见,给它们定义简单的样式:

#div1
{
    background:#FCE2BC;
    border:solid 1px #FF9900;
    width:500px;
    height:50px;
    margin-bottom:20px;
}
#div2
{
    background:#BCC8FC;
    border:solid 1px #4769F9;
    width:500px;
    height:50px;
    margin-bottom:20px;    
}

实现Silverlight的界面布局,使用Canvas,给它的背景定义为浅绿色,XAML如下:

<Canvas Background="#D5FCDF">
    <TextBlock Text="Silverlight Accessing the HTML DOM" Foreground="Red"
               Canvas.Top="10" Canvas.Left="30" FontSize="18">
    </TextBlock>
    <WatermarkedTextBox x:Name="input" Watermark="请在这里输入"
                        Height="40" Width="300"
                        Canvas.Left="30" Canvas.Top="50">
    </WatermarkedTextBox>
    <WatermarkedTextBox x:Name="result" Watermark="这里显示结果"
                        Height="40" Width="300"
                        Canvas.Left="30" Canvas.Top="100">
    </WatermarkedTextBox>
    <Button x:Name="displayButton" Background="Red"
            Height="40" Width="100" Content="显 示"
            Canvas.Top="50" Canvas.Left="350"
            Click="displayButton_Click">
    </Button>
</Canvas>

实现对HTML DOM的访问。Silverlight 2在命名空间System.Windows.Browser下内置了很多对于HTML DOM访问和操作的支持,我们最常用的一个对象是HtmlElement,通过HtmlPage静态类可以获取到当前页面的文档模型,最后再调用GetElementsByTagName或者GetElementById方法。

HtmlElement element = HtmlPage.Document.GetElementById(this.input.Text);

这样我们就获取到了一个DOM元素,再使用它的GetAttribute可以获取到相关属性:

this.result.Text = element.GetAttribute("innerText");
完整的代码如下:
private void displayButton_Click(object sender, RoutedEventArgs e)
{
    HtmlElement element = HtmlPage.Document.GetElementById(this.input.Text);

    this.result.Text = element.GetAttribute("innerText");
}

运行后我们在第一个文本框中输入div1:

TerryLee_Silverlight2_0084

单击显示后,将在第二个文本框中显示出div1的文本内容:

TerryLee_Silverlight2_0085 

操作DOM元素

通过上面的示例我们已经知道了如何去访问HTML DOM,现在再看一下对HTML DOM进行操作,如我们如何改变DOM的内容等,还是使用上面的示例,稍作一下修改,在第一个文本框中输入DOM的id,在第二个文本框中输入要修改的内容。

TerryLee_Silverlight2_0086

其实这里非常简单,只要对代码做一下小的改动,使用SetAttribute方法就可以了,第一个参数指定属性名,第二个参数指定属性值。如:

private void displayButton_Click(object sender, RoutedEventArgs e)
{
    HtmlElement element = HtmlPage.Document.GetElementById(this.input.Text);

    element.SetAttribute("innerText",this.result.Text);
}
运行后,输入div2和一些内容,单击确定:

TerryLee_Silverlight2_0087 

修改DOM元素样式

除了上面提到的GetAttribute和SetAttribute这一组方法之外,HtmlElement还提供了一组GetStyleAttribute和SetStyleAttribute方法,用于获取和设置DOM的样式,如:

private void displayButton_Click(object sender, RoutedEventArgs e)
{
    HtmlElement element = HtmlPage.Document.GetElementById(this.input.Text);

    element.SetStyleAttribute("width",this.result.Text);
    element.SetStyleAttribute("height", this.result.Text);
}

运行后,输入div1和100,效果如下:

TerryLee_Silverlight2_0088 

结束语

本文介绍了如何在Silverlight 中访问DOM以及修改DOM的属性等,下一篇我将介绍如何改变DOM的结构,如添加和移除DOM元素以及为DOM元素注册事件等。

下一篇:一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Silverlight
posted @ 2008-03-11 17:59 TerryLee 阅读(7170) 评论(49)  编辑 收藏 网摘 所属分类: [03]  银光点亮世界

  回复  引用  查看    
#1楼 2008-03-11 18:11 | 阿布      
不错,支持一下
  回复  引用  查看    
#2楼 2008-03-11 18:17 | 小智      
I love silverlight!
  回复  引用  查看    
#3楼 [楼主]2008-03-11 18:20 | TerryLee      
@阿布
谢谢支持:)
  回复  引用  查看    
#4楼 [楼主]2008-03-11 18:20 | TerryLee      
@小智
:)
  回复  引用  查看    
#5楼 2008-03-11 18:35 | 生鱼片      
只有支持了
我看到15篇了
  回复  引用    
#6楼 2008-03-11 18:48 | zsensi [未注册用户]

我看的,都不够你写的快~!牛人,顶
  回复  引用  查看    
#7楼 [楼主]2008-03-11 18:59 | TerryLee      
@生鱼片
呵呵,不着急:)
  回复  引用  查看    
#8楼 [楼主]2008-03-11 18:59 | TerryLee      
@zsensi
谢谢支持,这几天有时间就多写点:)
  回复  引用  查看    
#9楼 2008-03-11 21:14 | airwolf2026      
小疑问?就是sl操作DOM元素,是不是要经过服务器?还是类似js直接在客户端操作?
看上面的代码是要经过服务器的?

ps:还没有去了解sl哈.
  回复  引用  查看    
#10楼 [楼主]2008-03-11 22:03 | TerryLee      
@airwolf2026
应该是直接在客户端操作
  回复  引用  查看    
#11楼 2008-03-12 09:37 | 阿布      
@TerryLee
我感觉不是直接操作好象,没注意。
我注意到页面中要加<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
是不是操作DOM是通过AJAX来的
  回复  引用  查看    
#12楼 [楼主]2008-03-12 09:55 | TerryLee      
@阿布
页面中加<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
是为了配合控件<asp:Silverlight>

如果放在HTML页,不是就没有<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>了吗?
  回复  引用    
#13楼 2008-03-19 19:23 | donetbird [未注册用户]
这个SetAttribute在Firefox中好像不管用,同样的代码在ie中可以设置div的innerText,而在FireFox中设置不了
  回复  引用    
#14楼 2008-03-20 17:19 | JeffreyChen [未注册用户]
顶!!!!!!!
  回复  引用  查看    
#15楼 [楼主]2008-03-20 18:19 | TerryLee      
@donetbird
Firefox中没有测试,回头我试试

你用innerHtml看看
  回复  引用  查看    
#16楼 [楼主]2008-03-20 18:20 | TerryLee      
@JeffreyChen
:)
  回复  引用    
#17楼 2008-06-11 14:56 | Helloword [未注册用户]
写的非常好,我收藏了,有空慢慢看。
继续写下去。
谢谢分享。。。
  回复  引用    
#18楼 2008-07-30 16:15 | botsing [未注册用户]
不知道楼主有没有遇到这种情况:用拼音输入法的时候在silverlight文本框中输入汉字,输入的东西都会加倍的,比如输入“你好”,在文本框中显示就是“你好你好”。
为什么会出现这种情况呢?
  回复  引用  查看    
#19楼 [楼主]2008-07-31 01:15 | TerryLee      
@botsing
在Beta 2有这个问题,用微软拼音没这个问题,其它的输入法都有,是Silverlight 2 Beta 2与输入法的兼容问题,估计在RTM后会解决。
  回复  引用    
#20楼 2008-07-31 10:50 | botsing [未注册用户]
在读取样式属性的时候,不能读取div标签的样式的吗?
每次读取出来都是null,而读取button的样式属性就没有问题
  回复  引用    
#21楼 2008-07-31 10:55 | botsing [未注册用户]
--引用--------------------------------------------------
botsing: 在读取样式属性的时候,不能读取div标签的样式的吗?
每次读取出来都是null,而读取button的样式属性就没有问题
--------------------------------------------------------
好像不是完全这样的,内联样式都是可以读的,不是内联样式读不出来
  回复  引用  查看    
#22楼 [楼主]2008-08-01 00:54 | TerryLee      
@botsing
读取样式使用class属性
  回复  引用    
#23楼 2008-08-24 23:32 | TM123456 [未注册用户]
你这是silverlight 2.0的教程?但是好象2.0没这控件啊.WatermarkedTextBox


我运行你的代码经常出现错误:
值不能为 null。
参数名: Text

HtmlElement element = HtmlPage.Document.GetElementById(this.input.Text);

this.result.Text = element.GetStyleAttribute("innerHtml");
这段出现的.期待您的回答,谢谢
  回复  引用    
#24楼 2008-08-24 23:35 | TM123456 [未注册用户]
上面敲错了sorry. this.result.Text = element.GetAttribute("innerText");

  回复  引用  查看    
#25楼 [楼主]2008-08-25 11:22 | TerryLee      
@TM123456
确切的说,在Silverlight 2 Beta 1中有WatermarkedTextBox控件,但是在Silverlight 2 Beta 2中又被移除了,因为微软会在最终版本中给TextBox加上一个Watermarked属性。
  回复  引用  查看    
#26楼 [楼主]2008-08-25 11:24 | TerryLee      
你先判断你的element是不是为空?有可能你所要获取的Element在Page中根本不存在。
  回复  引用    
#27楼 2008-08-25 13:18 | TM123456 [未注册用户]
你好,我电脑中的silverlight版本中没有WatermarkedTextBox(我查了相关资料,正如你所说的),于是我把您的代码中的WatermarkedTextBox控件换成了TextBox控件
//下面的您的代码都没有动过。
HtmlElement element = HtmlPage.Document.GetElementById(this.input.Text);

this.result.Text = element.GetStyleAttribute("innerHtml");
就提示为null,不知道哪里出错了,因为我机器上没帮助文档,不知道你能否给一个下载地址,我在网上找了帮助文档,很多都提示找不到网站,估计是微软把帮助文档换地方了?谢谢你上面的回复。
  回复  引用  查看    
#28楼 [楼主]2008-08-25 13:42 | TerryLee      
@TM123456
你看看this.input.Text输入的那个Element,在你的HTML中实际存在不?

这里是Silverlight 2 Beta 2在线文档:
http://msdn.microsoft.com/en-us/library/bb188743.aspx
  回复  引用    
#29楼 2008-08-25 13:50 | TM123456 [未注册用户]
实际是存在的(我现在在公司,代码是在家里做的。)我记得我输入的
this.input.Text="div1"
div1是html里面的1个层ID。谢谢你的帮助文档,虽然我E文垃圾,我相信肯定有用的。哈哈。谢谢回复。以后一直关注你,直到把你盯“毛”了。--四川话。
  回复  引用  查看    
#30楼 [楼主]2008-08-25 14:21 | TerryLee      
@TM123456
不用客气

现在Silverlight 2 Beta 2只有英文的文档:)
  回复  引用    
#31楼 2008-08-25 14:39 | TM123456 [未注册用户]
哎实在没招了,。。。为什么会是null,你说的我也想过,确实搞不定,想看下帮助文件。
  回复  引用    
#32楼 2008-11-04 14:05 | DL0710 [未注册用户]
TM123456
说的对,element不为空的时候,element.GetStyleAttribute("innerHtml")确实也是null
  回复  引用  查看    
#33楼 [楼主]2008-11-05 09:24 | TerryLee      
@DL0710
应该是element.GetAttribute("")而不是GetStyleAttribute("")!
  回复  引用  查看    
#34楼 [楼主]2008-11-05 09:24 | TerryLee      
@TM123456
使用element.GetAttribute("innerText")为空吗?
  回复  引用    
#35楼 2008-11-09 00:39 | 冻结 [未注册用户]
问下楼主,
SetProperty和SetAttribute
GetProperty和GetAttribute
有什么区别么?

我测试的:
element.GetAttribute("innerText")和element.GetProperty("innerText")完全等价,他俩区别是什么呢?
  回复  引用    
#36楼 2008-11-09 00:41 | 冻结 [未注册用户]
一个value是string类型,一个value是object类型,
除了这个还有什么区别?
  回复  引用  查看    
#37楼 [楼主]2008-11-09 12:14 | TerryLee      
@冻结
看以了解对于一个HTML DOM来说,它的Property和Attribute是什么?有些属性用这两个方法都可以获取,有些属性智能使用GetProperty()或者GetAttribute()
  回复  引用    
#38楼 2008-11-19 15:10 | cityvoice [未注册用户]
当前上下文中不存在名称HtmlPage,需要添加什么引用吗
  回复  引用  查看    
#39楼 [楼主]2008-11-19 23:40 | TerryLee      
@cityvoice
好像是System.Windows.Browser命名空间吧

教你一个小技巧:在代码中写完HtmlPage后,光标放在HtmlPage上(后),按下Shift + Alt + F10会自动添加相应的命名空间:)
  回复  引用    
#40楼 2008-11-20 16:50 | cityvoice [未注册用户]
--引用--------------------------------------------------
TerryLee: @cityvoice
好像是System.Windows.Browser命名空间吧

教你一个小技巧:在代码中写完HtmlPage后,光标放在HtmlPage上(后),按下Shift + Alt + F10会自动添加相应的命名空间:)
--------------------------------------------------------
多谢,我找到了,呵呵,我是用editplus编写cs文件的,没有妆vs2008,呵呵

  回复  引用    
#41楼 2008-11-20 16:58 | cityvoice [未注册用户]
我找到FF下调用innerHTML的方法了,sl的开发人员真让我无语
在FF下应该这么调用
GetProperty("innerHTML").ToString()
  回复  引用  查看    
#42楼 [楼主]2008-11-20 23:49 | TerryLee      
@cityvoice
写cs文件用EditPlus?:)

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-12 18:32 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:


相关搜索:
Silverlight

相关链接: