當用戶展開一個節點而導致動態加載子節點時,其他的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>"
);
}
}