您好,登錄后才能下訂單哦!
在應(yīng)用程序中,我們經(jīng)常需要顯示或處理樹狀結(jié)構(gòu)的對象信息,比如部門信息和地區(qū)信息,樹是一種非常典型的數(shù)據(jù)結(jié)構(gòu),這些信息都可以用樹來表示。對于傳統(tǒng)的HTML頁面來說,完全依靠手動編碼來實(shí)現(xiàn)樹是比較困難的,因?yàn)樾枰獙懞芏嗟腏S代碼,對基于AJAX異步加載來說尤其如此,不但涉及AJAX數(shù)據(jù)異步加載,還需要考慮跨瀏覽器支持,處理起來非常麻煩,EXT中提供了現(xiàn)成的樹控件,通過這些控件,可以在B/S應(yīng)用中快速開發(fā)出包含樹形信息結(jié)構(gòu)的應(yīng)用。
本文就是詳細(xì)介紹樹形結(jié)構(gòu)的使用過程和實(shí)例。
樹控件由Ext.tree.TreePanel類定義,控件的名稱為TreePanel,TreePanel類繼承自Panel面板,在EXT中使用樹控件非常簡單,我們先來看一下代碼(包含配置信息)。
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>簡單的樹形</title>
<link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css"/>
<script type="text/javascript" src="../adapter/ext/ext-base.js"</script>
<script type="text/javascript" src="../ext-all.js"></script>
<script type="text/javascript"><!--
Ext.onReady(function(){
var tree=new Ext.tree.TreePanel({
el:'tree'
});
var root=new Ext.tree.TreeNode({text:'我是根'});
tree.setRootNode(root);
tree.render();
});
</script>
</head>
<body>
<div id="tree"></div>
</body>
</html>
這里的參數(shù)tree表示渲染的DOM的id.HTML中應(yīng)該要要有<div id="tree"></div>相對應(yīng),最后這棵樹就出現(xiàn)在這個div的位置上。
在獲得了樹形面板后,就必須要設(shè)置根,因?yàn)楸仨氂辛烁趴梢陨L枝節(jié),最后生成完整的樹,所以根是必須的。具體實(shí)現(xiàn)的效果如圖1所示。
圖1 只有根的樹
上面的實(shí)例代碼生成一棵沒有根的樹,下面的代碼就為樹添加枝和葉,代碼清單如下:
<script type="text/javascript">
Ext.onReady(function(){
var tree=new Ext.tree.TreePanel({
el:'tree',
autoHeight:true
});
var root=new Ext.tree.TreeNode({text:'區(qū)域信息'});
var node1=new Ext.tree.TreeNode({text:'湖南省'});
var node3=new Ext.tree.TreeNode({text:'廣東省'});
var node2=new Ext.tree.TreeNode({text:'廣州市'});
node3.appendChild(node2);
root.appendChild(node1);
root.appendChild(node3);
tree.setRootNode(root);
tree.render();
});
</script>
效果圖如圖2所示:
圖2 完整的樹控件
注意:我們一方面可以通過修改<div id="tree" style="height:300px;"></div>來設(shè)置div高度;同時也可以設(shè)置treePanel的autoHeight屬性為tree,則可以自動計(jì)算高度,否則展開的樹形控件看不到枝葉。
使用上面的錄入方式來獲取數(shù)據(jù)不僅麻煩,而且還容易出錯,Ext.tree.TreeLoader可以利用從后臺獲取的數(shù)據(jù)為我們組裝出一棵樹來,我們只需要提供數(shù)據(jù),讓treeLoader完成數(shù)據(jù)轉(zhuǎn)換和裝配節(jié)點(diǎn)的操作。
(1)我們要為TreePanel配置一個TreeLoader,如下面代碼所示:
var tree=new Ext.tree.TreePanel({
el:'tree',
loader:new Ext.tree.TreeLoader({dataUrl:'data.txt'}),
autoHeight:true
});
(2)這里的TreeLoader僅包含一個參數(shù){dataUrl:'data.txt'},這個dataUrl表示在樹完成渲染后從何處讀取數(shù)據(jù)。data.txt內(nèi)容如下:
[
{text:'not leaf'},
{text:'is leaf',leaf:true}
]
(3) 現(xiàn)在查看頁面依然只能看到根,沒有讀取數(shù)據(jù)并顯示到頁面上,因?yàn)槲覀兪褂玫腡reeNode不支持Ajax,我們需要將其改成AsyncTreeNode,這樣才可以實(shí)現(xiàn)我們想要的異步加載效果,如下面的代碼所示:
var root=new Ext.tree.AsyncTreeNode({text:'區(qū)域信息'});
注意:必須將root.expand(true,true)修改成root.expand()避免無限循環(huán)展開樹枝。
讀取本地JSON其實(shí)是一種是用使用TreeLoader的另類方法。因?yàn)橛袝r候樹形的數(shù)據(jù)并不多,為了獲取少量的數(shù)據(jù)而是用AJAX訪問后臺實(shí)在不劃算。首先為TreePanel設(shè)置一個參數(shù)為空的TreeLoader,如下面代碼所示:
var tree=new Ext.tree.TreePanel({
el:'tree',
loader:new Ext.tree.TreeLoader(),
autoHeight:true
});
然后,設(shè)置一個根節(jié)點(diǎn),并為這個根節(jié)點(diǎn)設(shè)置children屬性,如下面代碼所示:
var root=new Ext.tree.AsyncTreeNode({
text:'我是根',
children:[
{text:'Leaf No.1',leaf:true},
{text:'Leaf No.1',leaf:true}
]
});
tree.setRootNode(root);
這里需要注意幾點(diǎn):
(1) 必須設(shè)置TreeLoader,否則根節(jié)點(diǎn)會一直處于在讀取狀態(tài),無法獲得children中定義的子節(jié)點(diǎn)
(2) 根節(jié)點(diǎn)必須是AsyncTreeNode,如果是TreeNode,也無法生成子節(jié)點(diǎn)
(3) 子節(jié)點(diǎn)中的葉子節(jié)點(diǎn)必須都加上leaf:true,否則會一直顯示讀取狀態(tài)。
樹形彈出的右鍵菜單效果圖如圖3所示:
圖3 右鍵菜單效果
具體實(shí)現(xiàn)步驟如下:
(1) 制作自定義菜單,如下面的代碼所示:
var contextmenu=new Ext.menu.Menu({
id:'theContextMenu',
items:[{
text:'點(diǎn)擊',
handler:function(){
alert('我被點(diǎn)中了');
}
}]
});
(2) 綁定contextmenu時間,如下面代碼所示:
tree.on("contextmenu",function(node,e){
e.preventDefault();
node.select();
contextmenu.showAt(e.getXY());
});
實(shí)際上,每個樹形節(jié)點(diǎn)都有icon和iconCls屬性,他們負(fù)責(zé)制定節(jié)點(diǎn)的圖標(biāo),現(xiàn)在我們來修改樹種節(jié)點(diǎn)的圖標(biāo),無論是通過new手工創(chuàng)建的節(jié)點(diǎn),還是通過JSON讀取到的節(jié)點(diǎn),設(shè)置方式都是一樣,如下面代碼所示:
var root1=new Ext.tree.TreeNode({
text:'icon',
icon:'user_female.png'
});
下面的代碼可以讓對話框看起來像是從標(biāo)題上飛出來的:
tree.on("click",function(node){
Ext.Msg.show({
title:'提示',
msg:"你單擊了"+node,
animEl:node.ui.textNode
});
});
當(dāng)我們把鼠標(biāo)停留在某個節(jié)點(diǎn)的上方時,便會出現(xiàn)提示信息,為了實(shí)現(xiàn)這種效果,我們需要對提供的JSON數(shù)據(jù)做一些修改,在JSON中添加對應(yīng)的節(jié)點(diǎn)提示信息,我們給每個節(jié)點(diǎn)數(shù)據(jù)都加上qtip:'xxx'參數(shù),這個節(jié)點(diǎn)就可以顯示提示信息了。
不過,僅僅為JSON添加這個參數(shù)還不能在頁面上顯示提示信息,需要先在JS中對EXT的提示功能進(jìn)行初始化。
Ext.QuickTips.init();//開啟提示功能
上面這行代碼必須在其他功能加載前完成,建議寫在onReady函數(shù)的第一行。具體代碼如下:
<script type="text/javascript">
Ext.onReady(function(){
Ext.QuickTips.init();
var tree=new Ext.tree.TreePanel({
el:'tree',
loader:new Ext.tree.TreeLoader(),
autoHeight:true
});
var root=new Ext.tree.AsyncTreeNode({
text:'我是根',
children:[
{text:'Leaf No.1',qtip:'No1',leaf:true},
{text:'Leaf No.1',qtip:'No2',leaf:true}
]
});
var root1=new Ext.tree.TreeNode({
text:'icon',
icon:'user_female.png'
});
tree.setRootNode(root);
//root.expand(true,true);
var contextmenu=new Ext.menu.Menu({
id:'theContextMenu',
items:[{
text:'點(diǎn)擊',
handler:function(){
alert('我被點(diǎn)中了');
}
}]
});
tree.on("contextmenu",function(node,e){
e.preventDefault();
node.select();
contextmenu.showAt(e.getXY());
});
tree.on("click",function(node){
Ext.Msg.show({
title:'提示',
msg:"你單擊了"+node,
animEl:node.ui.textNode
});
});
tree.render();
});
</script>
雖然我們完全可以監(jiān)聽click事件,但是直接在節(jié)點(diǎn)樹形中設(shè)置超鏈接的地址也是一個好主意,這是很多人想實(shí)現(xiàn)的功能,具體的代碼如下:
var root=new Ext.tree.AsyncTreeNode({
text:'我是根',
children:[
{text:'新浪網(wǎng)',qtip:'新浪網(wǎng)',leaf:true,href:'http://www.sina.com.cn'},
{text:'百度中國',qtip:'搜索引擎',leaf:true,href:'http://www.baidu.cn',hrefTarget:'_blank'}
]
});
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。