最近完成了乙個可以拖拽的非同步按需載入樹,顧名思義,這個樹,至少支援以下三個功能。
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));
這裡如果有子節點,不管多少,虛載入乙個名字為本人名字的節點,當然這個子節點在父節點展示時,自然會被乾掉,同時真正的節點載入進來,並同時判斷這一級節點是否有子節點,**如下:
functionbeforeexpand(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...