天天看點

轉dhdhtmlxTreedhtmlxTree介紹

dhtmlxTree介紹

dhtmlxTree 是樹菜單,允許我們快速開發界面優美,基于Ajax的javascript庫.

她允許線上編輯,拖拽,三種狀态(全選、不選、半選),複選框等模式。同時在加載大資料量的時候,仍然

可以保持非常高效的速度。接下來,讓我們來體驗dhtmlxTree帶來的視覺沖擊吧

DEMO:http://www.dhtmlx.com/docs/products/dhtmlxTree/samples/

API:http://docs.dhtmlx.com/doku.php?id=dhtmlxtree:api_toc_alpha

先來張demo圖

<div id="index_tree" style="height: 100%;  100%; overflow: auto; display: block;" oncontextmenu="return false;"></div>
<script type="text/javascript">
    tree=new dhtmlXTreeObject("index_tree","100%","100%",0);
    tree.setImagePath("<%=request.getContextPath()%>/js/imgs/csh_dhx_skyblue/");
    tree.enableCheckBoxes(1);
    tree.enableThreeStateCheckboxes(true);
    tree.loadXML("<%=request.getContextPath()%>/alarmMenuTreeAction.do?function=getAlarmMenuTree&alarmId=${alarmId}&type=${type}");
    tree.setXMLAutoLoading("<%=request.getContextPath()%>/alarmMenuTreeAction.do?function=getAlarmMenuTree&alarmId=${alarmId}&type=${type}");
 </script>      

上面是自己寫的一個項目中的DEMO

看官方的調查發現,dhtmlxTree應該還可以支援其他服務端語言,感興趣的可以去官網看下.

下面簡單對一些sample進行了翻譯,歡迎拍磚

一、外觀
1.設定加減圖示展示狀态
    tree.showItemSign(tree.getSelectedItemId(), false);(false 隐藏  true 顯示)
2.設定樹的方向
    tree2.enableRTL(false);--預設false
3.設定節點高度
    enableMultiLineItems("300px");
4.設定節點樣式
    setItemStyle(tree.getSelectedItemId(),document.getElementById('tuds').value)
    <textarea id="tuds" rows="10" style="300px;">font-weight:bold;
    text-decoration:underline;
5.設定大小符号資訊

    tree.enableTreeImages("-Icons");//設定是否顯示圖示
    tree.enableTreeLines("-Lines");//設定是否顯示連接配接線
    tree.enableTextSigns("Cross Signs");//設定是否顯示交叉線(即橫線)

6.設定選中的節點的topoffset
    setItemTopOffset(tree.getSelectedItemId(),"60px")

7.設定皮膚
    tree.setSkin('dhx_skyblue');
    tree.setImagePath("http://www.cnblogs.com/codebase/imgs/");
    tree.setImagePath("http://www.cnblogs.com/codebase/imgs/csh_scbrblue/");
    tree.setImagePath("http://www.cnblogs.com/codebase/imgs/csh_yellowbooks/");

8.設定節點字型顔色
    setItemColor(tree.getSelectedItemId(), color1, color2);color1=color2

9.設定圖示
    tree.setItemImage2(tree.getSelectedItemId(),'leaf3.gif','leaf3.gif','leaf3.gif')

二、複選框/單選
    tree.enableCheckBoxes(1);//設定複選框
    tree.enableThreeStateCheckboxes(true);//允許半選狀态

1.擷取選中的節點
    tree.getAllChecked()--不包括父節點
2.擷取未選中的節點
    tree.getAllUnchecked()
3.擷取選中的節點,包括半選狀态的
    tree.getAllCheckedBranches()
4.擷取部分選中的節點對象(半選狀态的節點)
    tree.getAllPartiallyChecked()
1+2=3 

5.單選框
    tree.enableCheckBoxes(1);
    enableRadioButtons('db',true)--db是節點ID true則設定成單選框
      
    setCheck(tree.getSelectedItemId(),true)--選中
    setCheck(tree.getSelectedItemId(),false)--不選
    showItemCheckbox(tree.getSelectedItemId(),false)--設定該節點為複選框
    disableCheckbox(tree.getSelectedItemId(),true)--去除複選框
    disableCheckbox(tree.getSelectedItemId(),false)--複選框失效
    disableCheckbox(tree.getSelectedItemId(),true)--恢複
    setSubChecked(tree.getSelectedItemId(),true)--設定節點下面的子節點全部選中
    setSubChecked(tree.getSelectedItemId(),false)--設定節點下面的子節點全部不選中
三、事件
    
    右擊事件
        menu = new dhtmlXMenuObject();
        menu.setIconsPath("../common/images/");
        menu.renderAsContextMenu();
        menu.attachEvent("onClick", onButtonClick);
        menu.loadXML("../common/_context.xml");
        menu.renderAsContextMenu();
        menu.attachEvent("onClick", onButtonClick);
        tree.enableContextMenu(menu);

    
    拖拽事件
        tree.enableDragAndDrop(true);
        

        觸發單擊事件前的事件
        tree.attachEvent("onBeforeContextMenu", function(itemId) {
            if (tree.hasChildren(itemId) > 0) {
            menu.hideItem('outher');
            } else {
            menu.showItem('outher');
            }
            return true;
        });

加載前/後事件
    tree.setOnLoadingStart(func_a);
    tree.setOnLoadingEnd(func_b);
    
右擊事件
    tree.setOnRightClickHandler(_rclick);
輕按兩下事件
    setOnDblClickHandler

    tree.setOnOpenHandler(tonopen);
    tree.attachEvent("onOpenEnd", function(nodeId, event) {
        
    });      

另附常用method,僅供參考

構造函數
dhtmlXTreeObject(htmlObject, width, height, rootId)//rootId 虛拟根節點,在界面上不會顯示,一般取值0

replace IMG tag with background images - solve problem with IE image caching , not works for IE6 SP1
enableIEImageFix(mode)
析構函數
destructor()
實作繼承
clone()
節點構造函數
dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode)// mode - do not show images
從xml字元串加載樹
loadXMLString(xmlString,afterCall)//afterCall - function which will be called after xml loading
從xml檔案加載樹
loadXML(file,afterCall)
建立子節點,前三個參數為必須的
insertNewItem(parentId,itemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs)
insertNewChild(parentId,itemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs)

節點展開與收縮:[1-close 2-open]
_HideShow(itemObject,mode)
擷取節點狀态:0 - 沒有子節點, -1 - 節點合攏, 1 - 節點展開
_getOpenState(node)
getOpenState(itemId)
擷取選中的節點Id
getSelectedItemId()
選中節點
_selectItem(node,e)
擷取節點的index
getIndexById(itemId)
設定滑鼠右鍵點選事件
setOnRightClickHandler(func)
設定滑鼠點選事件
setOnClickHandler(func)
設定節點狀态改變事件
setOnSelectStateChange(func)
設定允許動态加載xml檔案(異步加載)
setXMLAutoLoading(filePath)
設定checkbox點選事件
setOnCheckHandler(func)
設定節點展開/合攏事件
setOnOpenHandler(func)
設定節點開始展/合攏開事件
setOnOpenStartHandler(func)
設定節點展開/合攏結束事件
setOnOpenEndHandler(func)
設定節點輕按兩下事件
setOnDblClickHandler(func)
展開節點及下面所有子節點
_xopenAll(node)
//增加了不傳遞itemId的判斷(1494)
openAllItems(itemId)//不傳遞itemId參數則合攏根節點
根據id擷取節點
_globalIdStorageFind(itemId)
合攏節點及其下所有子節點
_xcloseAll(node)
//修改了原來邏輯的一個錯誤(1521)
closeAllItems(itemId)//不傳遞itemId參數則合攏根節點
為節點增加使用者自定義的資料
//修正一個錯誤(1548)
setUserData(itemId,name,value)
擷取使用者自定義的資料
getUserData(itemId,name)
擷取節點顔色
getItemColor(itemId)
設定節點顔色
setItemColor(itemId,defaultColor,selectedColor)
擷取節點名稱--(with HTML formatting, if any)
getItemText(itemId)
擷取父節點id
getParentId(itemId)
更改節點id
changeItemId(itemId,newItemId)
标記被剪切的節點
doCut()
粘貼被剪切的節點到新的父節點下
doPaste(itemId)
清空被剪切的節點
clearCut()
移動節點
_moveNode(itemObject,targetObject)
允許三種狀态的複選框(全選、不選、部分選中)
enableThreeStateCheckboxes(mode)// 1 - on, 0 - off;
設定滑鼠懸浮事件
setOnMouseInHandler(func)
設定滑鼠移走事件
setOnMouseOutHandler(func)
設定是否允許顯示樹圖檔
enableTreeImages=function(mode)//1 - on, 0 - off
設定是否允許固定模式(對于顯示複選框的界面美觀一些,但沒有水準滾動條)
enableFixedMode(mode)// - 1 - on, 0 - off
是否顯示複選框
enableCheckBoxes(mode, hidden)//mode 0/1 hidden 0/1
設定節點圖檔
setStdImages(image1,image2,image3)//a0 - image for node without childrens a1 - image for closed node a2 - image for opened node
設定是否顯示樹線
enableTreeLines(mode)
設定圖檔
setImageArrays(arrayName,image1,image2,image3,image4,image5)//image1 - line crossed image image2 - image with top line image3 - image with bottom line image4 - image without line image5 - single root image
展開目前節點(一節)
_openItem(node)
openItem(itemId)
合攏目前節點(一節)
closeItem(itemId)
擷取節點的層節數
getLevel(itemId)
設定節點是否允許被合攏
setItemCloseable(itemId,flag)//flag 0/1
對于展開節點傳回子節點數量,對于未加載子節點的節點(異步加載)傳回true
hasChildren(itemId)
擷取節點下的子節點數
_getLeafCount(itemNode)
設定節點名稱
setItemText(itemId,newLabel,newTooltip)
擷取節點tip
getItemTooltip(itemId)
重新整理節點
refreshItem(itemId)
設定節點圖檔
setItemImage2(itemId, image1,image2,image3)//image1 - node without childrens image image2 - closed node image image3 - open node image
設定節點圖檔
setItemImage(itemId,image1,image2)//image1 - node without childrens image or closed node image (if image2 specified) image2 - open node image (optional) 
擷取節點下所有子節點id以逗号分割
getSubItems(itemId)
getAllSubItems(itemId)
擷取節點的所有子節點
_getAllScraggyItems(node)
擷取選中節點的名稱--(with HTML formatting, if any)
getSelectedItemText()
設定節點的選中狀态
setCheck(itemId,state)//state - checkbox state (0/1/unsure)
設定節點及所有子節點的選中狀态
setSubChecked(itemId,state)
擷取節點的選中狀态 return: node state (0 - unchecked,1 - checked, 2 - third state)
isItemChecked(itemId)
删除節點的所有子節點
deleteChildItems(itemId)
删除節點
deleteItem(itemId,selectParent) //selectParent - If true parent of deleted item get selection, else no selected items leaving in tree.
在節點下建立一個節點,前三個參數是必須的
insertNewNext(itemId,newItemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs)
根據index擷取節點下子節點的id
getChildItemIdByIndex(itemId,index)//itemId 節點id
設定拖動事件
setDragHandler(func)
設定是否允許拖拽
//mode - enabled/disabled [ can be true/false/temporary_disabled - last value mean that tree can be D-n-D can be switched to true later ]
//rmode - enabled/disabled drag and drop on super root
enableDragAndDrop(mode,rmode)
設定是否允許IE緩存
preventIECashing=function(mode)//mode - enable/disable random seed ( disabled by default )
設定是否允許選中節點名稱高亮顯示
enableHighlighting(mode)//mode - 1 - on, 0 - off
是否允許圖檔可點選和拖拽(clickable and dragable)
enableActiveImages(mode)// mode - 1 - on, 0 - off
設定節點獲得焦點
focusItem(itemId)
擷取所有無子節點的節點id
getAllChildless()
getAllLeafs()
擷取所有有子節點的節點id
getAllItemsWithKids()
擷取所有被選中節點id,不包括第三中狀态的節點(部分選中的節點)
getAllChecked()
擷取所有被選中節點id,包括第三中狀态的節點(部分選中的節點)
getAllCheckedBranches()
擷取節點下所有未選中的節點id,不傳遞itemId表示從根節點開始查找
getAllUnchecked(itemId)
擷取所有部分選中的節點id(因部分子節點選中而被選中的節點)
getAllPartiallyChecked()
設定節點樣式
setItemStyle(itemId,style_string)
設定是否允許拖拽圖檔
enableImageDrag(mode)
set function called when tree item draged over another item
setOnDragIn(func)
設定拖拽是是否允許自動滾動
enableDragAndDropScrolling(mode)


補充說明:加載樹時,必須確定所有節點的id不重複,否則控件會為重複id自動生成一個随機數(原id+"_"+目前日期)。
增加了一個dhtmlXTreeExtend.js對原類進行擴充,增加了getAllCheckedLeaf(),getAllUcCheckedLeaf()兩個函數
修改了1個bug:
1 增加沒有選中節點時執行展開/收縮標明節點時報沒有parentId的bug
dhtmlXTreeObject.prototype.setSubChecked=function(itemId,state){
if(itemId)
{
var sNode=this._globalIdStorageFind(itemId);
this._setSubChecked(state,sNode);
this._correctCheckStates(sNode.parentObject);
}
}




1 增加了未傳遞itemId參數時預設從根節點展開
dhtmlXTreeObject.prototype.openAllItems=function(itemId)
{
if (itemId==window.undefined) itemId=this.rootId;
var temp=this._globalIdStorageFind(itemId);
if (!temp) return 0;
this._xopenAll(temp);
};