怎样从托管代码访问HTML DOM
这篇文章将演示如何从silverlight程序以编程的形式在托管代码中访问html DOM,控件以及虚拟元素。直接的访问DOM可以让你具备了在客户端直接操纵页面元素的能力,而无需饶个大弯,与服务器进行交互。(这个大概就是开心大哥所说的客户端的内置Tiny Framework)
演示步骤:
1 处理XAML的Carvas加载事件
2 将html Dom 与事件挂钩。
3 访问Dom的一个属性。
4 在Dom中调用一个方法。
1 在silverlight程序中处理XAML事件
使用XAML Carvas Loaded事件来建立页面和托管类的联系。在XAML文件的Loaded属性中,要指名一个要在托管代码中调用的方法名,它将用来处理这个加载事件。下面的例子将Load事件赋值给负责处理该事件的onloaded 方法。
Canvas
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Samples.Silverlight.CS.BasicCanvas;assembly=HtmlDOM1.dll"
x:Name="rootCanvas" Height="500" Width="500" Loaded="OnLoaded"
Background="Red" ></Canvas>
在托管代码中添加一个在已经在刚才的XAML文件中指名的那个onloaded方法,这个方法能处理任何的初始化任务,创建、注册对象,附加事件处理器等等。
2 public void OnLoaded(object sender, EventArgs e)
为了在事件处理方法中能够访问Dom,创建一个私有的组件级别的HtmlDocument类对象,并把它赋值给当前页面的对象。
1. document = HtmlPage.Document;
处理Dom 元素 为了从托管代码中获取对页面元素的引用,你可以使用HTML document 对象的GetElementByID方法来获取,这个方法跟javascript的同名方法类似,也是传递一个页面的元素id给它,来获取元素的引用。例如:
HtmlElement btnEchoText = document.GetElementByID("btnEchoText");
附加一个事件处理器:为了给button附加上一个 onlick事件,你需要先编程来获取这个button的引用,然后使用如下代码对这个控件进行事件附加处理。
bool ec1 = btnEchoText.AttachEvent("onclick", new EventHandler<HtmlEventArgs>(this.OnEchoTextClicked));
写一个真正的事件处理方法,以下的方法定义告诉你如何去声明一个私有方法来处理附加在button上的事件。
private void OnEchoTextClicked(object sender, HtmlEventArgs e)
访问Dom 元素的某个属性
使用Dom对象的属性来访问那个对象。例如你可以使用HtmlPage 对象的属性来获取当前的页面的URI(Uniform Resource Identifier)。
string outputText = HtmlPage.DocumentUri.AbsolutePath + " - " + HtmlPage.CurrentBookmark;
将属性信息赋值给页面的另外一个元素,例如将他赋值给一个文本框。使用SetAttribute方法设置Dom元素的属性值。
document.GetElementByID("txtOutputProperties").SetAttribute("value", outputText);
调用在html Dom中的方法:
在你需要调用的那个关联方法里面获取控件的引用。
直接调用dom方法,例如下面的方法演示当点击了按钮后如何利用HtmlPage对象的navigate方法来将浏览器跳转到另外一个url中。
private void OnJump(object sender, EventArgs e)
{
HtmlPage.Navigate("http://www.msn.com");
}
不知道支持客户端CLR环境的类有多少,想必应该不多,比如肯定不会有对文件的操作,那silverlight就太恐怖了....不过我曾经幻想过它能够发起tcp连接,这样如果在架构一个非常健壮的客户端程序的时候,效率可能会高些。但是如果这样的话,会不会有黑客在silverlight代码里面发起对别的网站的频繁链接,导致目标网站崩溃呢???不过似乎这个担心不仅仅在silverlight程序上。废话一通了,不过大家还是拭目以待客户端CLR 的功能吧!(很遗憾的告诉大家,目前不支持类似flash的调用本地摄像头api来摄录或者拍大头贴,让部分视频类网站失望了。)