C#发现之旅 - 高性能ASP.NET树状列表控件(中)
2010-09-30 21:03:16 来源:WEB开发网当用户展开一个节点而导致动态加载子节点时,其他的JavaSciprt代码会设置节点的XMLSource属性值到这个名为 “SkyTreeViewControlTempXML”的XML数据岛的src属性上。这会导致IE浏览器立即开始异步的加载XML文档,并根据其文档加载状态而多次触发“onreadystatechange”事件,从而调用JavaScript函数 “SkyTreeViewControlDynamicLoadChildNodes”,在这个JavaScript函数中,首先获得XML数据岛对象,然后判断其状态,若状态值不等于“complete”时,则文档还没有完成加载,从而退出等待下一次调用。
若XML数据岛完成加载后,获得父节点的文本元素,然后获得嵌入在HTML文档中另外一个名为“SkyTreeViewControlXSLT”的 XML数据岛,这个XML数据岛包含了XSLT文档。然后使用刚刚加载的XML文档,调用它的“transfromNode”函数执行XSLT转换,则转换结果就是显示子节点的HTML字符串。然后使用HTML元素的“insertAdjacentHTML”函数将生成的HTML字符串输出到HTML页面上。
成功的动态加载子节点后,JavaScript脚本还更新父节点的图标,使其表示为展开状态。
第二段HTML代码块
WEB控件输出完第一段HTML代码后,会根据需要输出第二段代码,第二段代码包含在客户端执行XSLT转换所需的XSLT模板代码以及初始化生成树状列表的HTML代码的JavaScript代码,其C#代码为
if( this.GenerateAtServer == false || this.DynamicLoadChildNodes )
{
// 若允许动态加载子节点而且不是在服务器段生成HTML代码
// 则输出动态加载子节点使用的JavaScript代码
if (!base.Page.ClientScript.IsStartupScriptRegistered(
this.GetType() ,
"SkyTreeViewControlXSLT"))
{
// 输出第二段HTML代码块
base.Page.ClientScript.RegisterStartupScript(
this.GetType() ,
"SkyTreeViewControlXSLT" ,
@"
<!-- 使用一个XML数据岛保存客户端动态生成HTML代码时使用的XSLT代码-->
<xml id='SkyTreeViewControlXSLT'>"
+ ReadXSLTString() // 此处从资源文件SkyTreeViewControl.xslt中获得XSLT代码
+ @"</xml>
<script language=javascript>
//--------------- 生成树状列表--------------------------------------
// 参数id 就是树状列表控件的编号
function RefreshSkyTreeViewControl( id )
{
var xml = document.getElementById( id + '_xml');
var xsl = document.getElementById( 'SkyTreeViewControlXSLT');
var container = document.getElementById( id + '_container' );
if( container == null )
{
alert('未找到目标');
return ;
}
if( container != null )
{
if( xml == null )
{
container.innerText = '缺失XML数据';
return ;
}
if( xsl == null )
{
container.innerText = '缺失XSLT数据';
return ;
}
var html = xml.XMLDocument.transformNode( xsl.XMLDocument );
container.innerHTML = html ;
}
}//function RefreshSkyTreeViewControl( id )
</script>"
);
}
}
更多精彩
赞助商链接