ztree獲取選中節(jié)點(diǎn)時(shí)不能進(jìn)入可視區(qū)域出現(xiàn)BUG如何解決
zTree 是一個(gè)依靠 jQuery 實(shí)現(xiàn)的多功能 “樹(shù)插件”。優(yōu)異的性能、靈活的配置、多種功能的組合是 zTree 最大優(yōu)點(diǎn)。
zTree 的特點(diǎn)編輯
● zTree v3.0 將核心代碼按照功能進(jìn)行了分割,不需要的代碼可以不用加載
● 采用了延遲加載技術(shù),上萬(wàn)節(jié)點(diǎn)輕松加載,即使在 IE6 下也能基本做到秒殺
● 兼容 IE、FireFox、Chrome、Opera、Safari 等瀏覽器
● 支持 JSON 數(shù)據(jù)
● 支持靜態(tài)和 Ajax 異步加載節(jié)點(diǎn)數(shù)據(jù)
● 支持任意更換皮膚 / 自定義圖標(biāo)(依靠css)
● 支持極其靈活的 checkbox 或 radio 選擇功能
● 提供多種事件響應(yīng)回調(diào)
● 靈活的編輯(增/刪/改/查)功能,可隨意拖拽節(jié)點(diǎn),還可以多節(jié)點(diǎn)拖拽喲
● 在一個(gè)頁(yè)面內(nèi)可同時(shí)生成多個(gè) Tree 實(shí)例
● 簡(jiǎn)單的參數(shù)配置實(shí)現(xiàn) 靈活多變的功能
zTree 的優(yōu)勢(shì)編輯
zTree 的作者利用業(yè)余時(shí)間不斷改進(jìn) zTree 功能,并且還能及時(shí)與用戶(hù)溝通,及時(shí)回復(fù)各種疑問(wèn),便于新用戶(hù)快速掌握。目前越來(lái)越多的用戶(hù)都使用 zTree 替換了系統(tǒng)中原有的 樹(shù)插件,這其中包括最近剛發(fā)布最新版本的QUI框架。
相關(guān)插件版本:
jquery.ztree.exedit-3.4.js
jquery.ztree.all-3.4.js
jquery-1.8.0.js
function onAsyncSuccess(event, treeId, treeNode, msg) {
curAsyncCount--;
if (curStatus == "expand") {
expandNodes(treeNode.children);
} else if (curStatus == "async") {
asyncNodes(treeNode.children);
}
if (curAsyncCount <= ) {
curStatus = "";
// 節(jié)點(diǎn)定位
if(devicesSelect.selectNodeId){
// 節(jié)點(diǎn)變成被選中狀態(tài)
var zTree = $.fn.zTree.getZTreeObj(zTreeId);
zTree.cancelSelectedNode();
$("#" + devicesSelect.selectNodeId + "_a").addClass("curSelectedNode");
$("#treeDiv").animate({scrollTop:$("#"+devicesSelect.selectNodeId).offset().top-},);//是ms,也可以用slow代替
devicesSelect.selectNodeId = "";
}
}
}
function expandNodes(nodes) {
if (!nodes) return;
curStatus = "expand";
var zTree = $.fn.zTree.getZTreeObj(zTreeId);
for (var i=, l=nodes.length; i<l; i++) {
if(ids.indexOf(nodes[i].id) != -){
if (nodes[i].isParent&&(ids.substring(,ids.indexOf(","))!=nodes[i].id)) {
if(nodes[i].typeName.indexOf("虛擬")=="-"){
zTree.expandNode(nodes[i], true, false, false);
} else if(nodes[i].type.indexOf(type)>"-"){
zTree.expandNode(nodes[i], true, false, false);
}
} else {
goAsync = true;
}
}
}
if(goAsync==true){
var id_ = ids.substring(,ids.indexOf(","));
var node = zTree.getNodeByParam("id",id_);
goAsync = false;
me.curStatus = "";
me.type = "";
me.selectNodeId = node.tId;
}
}
定位思路:
1、假設(shè)要定位節(jié)點(diǎn)A,該節(jié)點(diǎn)A的唯一標(biāo)識(shí)是objid
2、根據(jù)objid從db中獲取所有上級(jí)的objid,拼接并保存在ids變量。
3、在onAsyncSuccess方法中調(diào)用expandNodes,該方法中通過(guò)[if (nodes[i].isParent&&(ids.substring(0,ids.indexOf(","))!=nodes[i].id))]過(guò)濾,展開(kāi)id在ids里的節(jié)點(diǎn)。
4、通常情況看下,在展開(kāi)最后,依據(jù)objid通過(guò)【var node = zTree.getNodeByParam("id",id_);】獲取節(jié)點(diǎn)A對(duì)象,然后通過(guò)【zTree.selectNode(node);】選擇節(jié)點(diǎn)。
這種情況下,能夠定位并選擇目標(biāo)節(jié)點(diǎn),但是,當(dāng)與該節(jié)點(diǎn)有同一父節(jié)點(diǎn)的數(shù)據(jù)較多時(shí),節(jié)點(diǎn)A可能不會(huì)出現(xiàn)在可視區(qū)域內(nèi)。查找源碼,發(fā)現(xiàn)Ztree用的是【$("#" + node.tId).focus().blur();】方法實(shí)現(xiàn)定位。但很遺憾,有BUG。
于是,使用控制滾動(dòng)條的方式自己控制定位。實(shí)現(xiàn)方式如下:
1、刪除【zTree.selectNode(node);】,防止定位沖突
2、在onAsyncSuccess方法中,判定當(dāng)節(jié)點(diǎn)展開(kāi)完畢后,獲取節(jié)點(diǎn)A的偏移量,并將值賦給樹(shù)所在DIV的scrollTop屬性。
$("#treeDiv1").animate({scrollTop:$("#"+devicesSelect.selectNodeId).offset().top-300},1000);//1000是ms,也可以用slow代替
注:devicesSelect.selectNodeId為節(jié)點(diǎn)A的節(jié)點(diǎn)tid,通過(guò)【me.selectNodeId = node.tId】獲?。籺reeDiv1樹(shù)所在div的id屬性
3、取消之前選中節(jié)點(diǎn):zTree.cancelSelectedNode();
4、為節(jié)點(diǎn)A增加被選中狀態(tài)class:$("#" + devicesSelect.selectNodeId + "_a").addClass("curSelectedNode");
筆者淡淡的說(shuō):第2點(diǎn)我本來(lái)想用【$("#treeDiv1").scrollTop($("#"+devicesSelect.selectNodeId).offset().top-200);】這種方式的,雖然有效,但是同層節(jié)點(diǎn)過(guò)多時(shí)候,還是不能進(jìn)入可視區(qū)域,我深深的懷疑是因?yàn)檫@個(gè)時(shí)候樹(shù)還沒(méi)展開(kāi),所以我就用了動(dòng)畫(huà),無(wú)賴(lài)之舉。
筆者最后的話(huà):如果本文有任何錯(cuò)誤,敬請(qǐng)看官火辣指出,不勝感激涕零。。。。
以上內(nèi)容是本文給大家介紹ztree獲取選中節(jié)點(diǎn)時(shí)不能進(jìn)入可視區(qū)域出現(xiàn)BUG如何解決的全部敘述,希望大家喜歡。
- ztree獲取當(dāng)前選中節(jié)點(diǎn)子節(jié)點(diǎn)id集合的方法
- js樹(shù)插件zTree獲取所有選中節(jié)點(diǎn)數(shù)據(jù)的方法
- 后臺(tái)獲取ZTREE選中節(jié)點(diǎn)的方法
- zTree實(shí)現(xiàn)節(jié)點(diǎn)修改的實(shí)時(shí)刷新功能
- 在父頁(yè)面得到zTree已選中的節(jié)點(diǎn)的方法
- jQuery插件zTree實(shí)現(xiàn)刪除樹(shù)節(jié)點(diǎn)的方法示例
- zTree異步加載展開(kāi)第一級(jí)節(jié)點(diǎn)的實(shí)現(xiàn)方法
- jQuery插件zTree實(shí)現(xiàn)的基本樹(shù)與節(jié)點(diǎn)獲取操作示例
- jQuery插件zTree實(shí)現(xiàn)清空選中第一個(gè)節(jié)點(diǎn)所有子節(jié)點(diǎn)的方法
- zTree節(jié)點(diǎn)文字過(guò)多的處理方法
相關(guān)文章
jquery實(shí)現(xiàn)點(diǎn)擊彈出層效果的簡(jiǎn)單實(shí)例
本篇文章主要是對(duì)jquery實(shí)現(xiàn)點(diǎn)擊彈出層效果的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03
基于jQuery實(shí)現(xiàn)的雙11天貓拆紅包抽獎(jiǎng)效果
這篇文章主要介紹了基于jQuery實(shí)現(xiàn)的雙11天貓拆紅包抽獎(jiǎng)效果,在即將到來(lái)的雙十二活動(dòng)中大家也可以使用拆紅包抽獎(jiǎng)吸引消費(fèi)者,需要的朋友可以參考下2015-12-12
jquery下將選擇的checkbox的id組成字符串的方法
jquery下將選擇的checkbox的id組成字符串的方法,需要的朋友可以參考下。2010-11-11
jquery根據(jù)一個(gè)值來(lái)選中select下的option實(shí)例代碼
下面小編就為大家?guī)?lái)一篇jquery根據(jù)一個(gè)值來(lái)選中select下的option實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
JQuery使用數(shù)組遍歷跳出each循環(huán)
這篇文章主要介紹了JQuery使用數(shù)組遍歷跳出each循環(huán),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
jquery.serialize() 函數(shù)語(yǔ)法及簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇jquery.serialize() 函數(shù)語(yǔ)法及簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
jquery簡(jiǎn)單倒計(jì)時(shí)實(shí)現(xiàn)方法
這篇文章主要介紹了jquery簡(jiǎn)單倒計(jì)時(shí)實(shí)現(xiàn)方法,涉及jQuery定時(shí)函數(shù)操作及日期與實(shí)現(xiàn)的運(yùn)算技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
jQuery插件HighCharts繪制簡(jiǎn)單2D折線圖效果示例【附demo源碼】
這篇文章主要介紹了jQuery插件HighCharts繪制簡(jiǎn)單2D折線圖效果,結(jié)合完整實(shí)例形式分析了jQuery使用HighCharts插件繪制折線圖的實(shí)現(xiàn)步驟與相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-03-03
jQuery解析XML文件同時(shí)動(dòng)態(tài)增加js文件的方法
這篇文章主要介紹了jQuery解析XML文件同時(shí)動(dòng)態(tài)增加js文件的方法,涉及jQuery Ajax調(diào)用及返回函數(shù)中增加js文件的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06

