乙個可以拖拽的非同步按需載入樹

2022-01-17 12:48:58 字數 1618 閱讀 6806

最近完成了乙個可以拖拽的非同步按需載入樹,顧名思義,這個樹,至少支援以下三個功能。

1,節點可以拖拽(專案需要,已設定為只允許同級節點拖拽)。

2,非同步載入(使用ajax載入資料,沒啥好說的)。

3,按需要載入(點選展開按鈕時,載入所需資料,不點選不載入,最小化的載入資料,最大化的支援大資料,哈哈)。

下面就這三個功能,分別貼出關鍵**。

一,節點可以拖拽需要新增的**。

1,先對樹型控制項的setting變數增加如下屬性,並新增dropprev,dropinner,dropnext方法,具體方法內容,後面demo中**右鍵。

edit: 

}

2,在callback屬性中載入如下**,並分別新建兩個方法beforedrag和beforedrop

callback:

至此拖拽功能基本實現,詳細**請自行扒下。

二:非同步載入(使用ajax載入資料,沒啥好說的),**略。

三:按需要載入(點選展開按鈕時,載入所需資料,不點選不載入)

1,在callback屬性中載入如下**,並新建方法beforeexpand,為什麼是beforeexpand而不是onexpand呢,是因為在這個樹中,預載入比載入完成後顯示效果好。

callback:

並且這裡有個小技巧:若節點存在子節點,就讓其前面以資料夾圖示顯示,方法如下。

public string getlist()

stringbuilder treesb = new stringbuilder("[");

var list = filetyperepository.getfiletypebyparentid(new guid(parentid));

這裡如果有子節點,不管多少,虛載入乙個名字為本人名字的節點,當然這個子節點在父節點展示時,自然會被乾掉,同時真正的節點載入進來,並同時判斷這一級節點是否有子節點,**如下:

function

beforeexpand(treeid, treenode)

}if(treenode.children)

}$.post("/ashx/filetype.ashx?action=getlist", , function

(txt) ;

addtreenode(treenode, newnode);

}}, "text");

return (treenode.expand !== false

); }

這裡判斷清除children用了兩次,不得已,因為只清除一次,有子節點的節點不會被清除,所以需要清除兩次,若是有人有更好的辦法,一次就清除,不吝賜教。

(找到問題的原因了,清除子節點的**應該改為:

var childcount =treenode.children.length;

for (i = 0; i < childcount; i++)

這段**有意思,呵呵。2月16號備註。

至此,乙個可以拖拽的非同步按需載入樹就基本完成,當然這個樹,還不只這點功能,比如右鍵增加、刪除節點,比如修改節點等等,都一一實現,更多效果,請檢視demo**:

如果覺得有用,請猛擊推薦,謝謝。

HTML DOM生成乙個可以拖拽的元素

假設我們想對下面這個元素進行拖拽 dragme class draggable drag mediv 修改css draggable 為了讓其可以被拖拽,我們需要處理三個事件 滑鼠的當前位置 let x 0 let y 0 找到要拖拽的元素 const ele document.getelement...

rn實現乙個view的拖拽

通過新增手勢事件 dx 和 dy 從觸控操作開始到現在的累積橫向 縱向路程 movex 和 movey 最近一次移動時的螢幕橫 縱座標 numberactivetouches 當前在螢幕上的有效觸控點的數量 stated 和之前一樣,用來識別手指的id vx 和 vy 當前橫向 縱向移動的速度 x0...

做乙個拖拽的小功能

做了乙個拖拽功能,感覺有點卡頓。思路比較簡單,滑塊拖動的時候限制邊界條件就好了,完整 如下 拖拽 title style divclass drag style head body div class div class divclass drag div div script window.onl...