基于chosen插件實(shí)現(xiàn)人員選擇樹搜索自動(dòng)篩選功能
要實(shí)現(xiàn)的功能截圖:
要求:
1、點(diǎn)擊輸入框可以根據(jù)拼音自動(dòng)篩選數(shù)據(jù),并且標(biāo)記已經(jīng)選擇的數(shù)據(jù),沒有結(jié)果的時(shí)候提示,相應(yīng)的更新左邊樹狀態(tài)
2、勾選樹右側(cè)樹的復(fù)選框左側(cè)出現(xiàn)相應(yīng)的內(nèi)容
我用到的插件
vue+chosen+ztree
vue:組件化的MVVM庫(kù)
chosen:單選列表和多選列表增強(qiáng)
ztree:基于jquery的樹插件
分析
chosen插件已經(jīng)可以實(shí)現(xiàn)1中的大部分效果,我們只需要預(yù)先獲取數(shù)據(jù),實(shí)現(xiàn)左右兩側(cè)一 一對(duì)應(yīng),最后點(diǎn)擊發(fā)送獲取最終的數(shù)據(jù)集合ID
具體實(shí)現(xiàn)
chosen需要的html結(jié)構(gòu)
//只需要提供包含數(shù)據(jù)的select標(biāo)簽即可,該select默認(rèn)隱藏,chosen依據(jù)該數(shù)據(jù)構(gòu)建新的html結(jié)構(gòu) <select name="dept" style="width:150px;" id="dept" class="dept_select" multiple="multiple"> <option value="部門1">部門1</option> <option value="部門2">部門2</option> <option value="部門3">部門3</option> </select> //chosen初始化 $(function(){ $('.dept_select').chosen({ no_results_text:'沒有結(jié)果', allow_single_deselect:true }); });
這樣要求1中的大部分效果就實(shí)現(xiàn)了,因?yàn)槲覀兊臄?shù)據(jù)是從后臺(tái)獲取的,因此我們需要從后臺(tái)獲取select的option的值,這里采用vue解析數(shù)據(jù),相應(yīng)的html結(jié)構(gòu)和js為:
//基于vue解析的html結(jié)構(gòu) <select data-placeholder="選擇發(fā)件人" class="chosen-select form-control" tabindex="-1" multiple="multiple"> <template v-for='key in zmailTree'> <option v-for='item in key.userList' value='{{item.id}}'>{{item.name}}</option> </template> </select> //vue實(shí)例 var zmailForm=new Vue({ el:'#zmail-form', ready:function(){ var that=this; var getToken=$.cookie('dcValidate'); $.ajax({ type:'get', async:false, url:'后臺(tái)數(shù)據(jù)接口地址', dataType: "json", success: function(msg){ that.$set('zmailTree', msg); } }); }, data:{ zmailTree:[] } }); //通過(guò)vue獲取后臺(tái)數(shù)據(jù),將json數(shù)據(jù)賦值給zmailTree這個(gè)數(shù)組,它是含有層級(jí)結(jié)構(gòu)的,我們不需要輸出層級(jí)結(jié)構(gòu),只需要輸出里面的人員就行了,但是實(shí)踐中發(fā)現(xiàn)一個(gè)人問(wèn)題,數(shù)據(jù)解析了,鼠標(biāo)點(diǎn)擊輸入框出現(xiàn)的下拉菜單中并沒有出現(xiàn)我們剛才解析出來(lái)的數(shù)據(jù),我們需要VUE的這個(gè)方法Vue.nextTick,延遲回調(diào)chosen初始化代碼: //延遲初始化chosen Vue.nextTick(function () { $('#zmail-select').chosen({ no_results_text: '沒有找到該結(jié)果',// 當(dāng)檢索時(shí)沒有找到匹配項(xiàng)時(shí)顯示的提示文本 search_contains: true //從任意位置開始檢索 }); });
然后出現(xiàn)了下面的效果:
接下來(lái)我們要做的就是選擇人員右邊相應(yīng)的人員選中,chosen提供了一個(gè)change方法,該方法當(dāng)選擇的值發(fā)生改變時(shí)觸發(fā),有這個(gè)方法我們就很容易根據(jù)select值的變化來(lái)觸發(fā)事件
$('select.chosen-select').on('change', function(){ // 用戶改變了選擇,快快處理 });
我們同樣要寫到Vue.nextTick中
//延遲初始化chosen Vue.nextTick(function () { $('#zmail-select').chosen({ no_results_text: '沒有找到該結(jié)果',// 當(dāng)檢索時(shí)沒有找到匹配項(xiàng)時(shí)顯示的提示文本 search_contains: true //從任意位置開始檢索 }); $('#zmail-select').on('change', function(){ //用戶改變了值之后作如下處理 var treeObj = $.fn.zTree.getZTreeObj("zmail-tree"); treeObj.expandAll(true);//展開所有樹節(jié)點(diǎn) treeObj.checkAllNodes(false);//清空所有樹節(jié)點(diǎn) $("#zmail-select option:selected").each(function(i,obj){ var node = treeObj.getNodeByParam("id", obj.value, null); treeObj.checkNode(node, true, true); }); }); }); //輸入框的值只要發(fā)生了改變我們就獲取樹的目標(biāo)id,展開所有子節(jié)點(diǎn),并且清空樹的所有選中狀態(tài),因?yàn)檩斎肟蛑械闹挡恢挂粋€(gè)因此我們要做一個(gè)循環(huán),使用ztree的方法getNodeByParam(根據(jù)給定的參數(shù)查找節(jié)點(diǎn))和checkNode(控制對(duì)應(yīng)節(jié)點(diǎn)的選中或者非選中操作)
到這選取輸入框數(shù)值讓右側(cè)樹種對(duì)應(yīng)的人員選中就實(shí)現(xiàn)了,下面來(lái)實(shí)現(xiàn)勾選右側(cè)樹中的人員來(lái)改變輸入框中的數(shù)據(jù)
//樹的html結(jié)構(gòu),不要忘記寫ztree這個(gè)class,否則不顯示數(shù)據(jù) <ul class="ztree" id="zmail-tree"> </ul> //樹初始化代碼js //人員樹基本設(shè)置 var zmailTreeSet={ view:{ dblClickExpand:false }, async:{ enable:true, type:'get', url:'服務(wù)器數(shù)據(jù)地址', }, data:{ simpleData:{ enable:true, idKey:'id', pIdKey:'parentId' }, key:{ children:'userList' } }, check:{ enable:true, chkboxType:{'Y':'s','N':'s'} }, callback:{ onCheck:zmailCheck } }; function zmailCheck(){ //這里處理輸入框的數(shù)據(jù) } //初始化人員樹 $.fn.zTree.init($('#zmail-tree'),zmailTreeSet);
實(shí)現(xiàn)的思路:
(1)首先獲取點(diǎn)擊復(fù)選框的節(jié)點(diǎn),
var zmaObj = $.fn.zTree.getZTreeObj(treeId);//getZTreeObj插件方法,獲取目標(biāo)ID var zmaNodes = zmaObj.getCheckedNodes(true);//getCheckedNodes獲取選中的所有節(jié)點(diǎn),此處為集合
(2)其次清空select中的選中狀態(tài),將其恢復(fù)到初始狀態(tài),
$("#zmail-select option").each(function(j,obj){ obj.selected=''; });
(3)根據(jù)勾選的節(jié)點(diǎn)數(shù)量循環(huán)使select中的相應(yīng)option選中,此處判斷的關(guān)鍵是數(shù)據(jù)id
for(var i = 0;i < zmaNodes.length; i++){ if(typeof(zmaNodes[i].userList) == 'undefined'){//如果該節(jié)點(diǎn)的userList屬性為空說(shuō)明不是父節(jié)點(diǎn),存取它的值,如果不為空則跳過(guò) //不寫判斷,直接使用勾選的樹的數(shù)據(jù)的ID來(lái)進(jìn)行選擇,使其屬性select改為selected $("#zmail-select option[value="+zmaNodes[i].id+"]")[0].selected='selected'; } }
(4)更新select option列表
//循環(huán)外更新select列表 $("#zmail-select").trigger('chosen:updated');
以上所述是小編給大家介紹的基于chosen插件實(shí)現(xiàn)人員選擇樹搜索自動(dòng)篩選功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
javascript代碼優(yōu)化的8點(diǎn)總結(jié)
本篇文章給大家分享了關(guān)于javascript代碼優(yōu)化的8點(diǎn)總結(jié),希望我們整理的內(nèi)容能夠幫助到大家。2018-01-01微信小程序?qū)崿F(xiàn)左側(cè)滑欄過(guò)程解析
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)左側(cè)滑欄過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08JS截取字符串 subStr()、substring()、slice() 方法示例詳解
這篇文章主要介紹了JS截取字符串 subStr()、substring()、slice() 方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01layui遞歸實(shí)現(xiàn)動(dòng)態(tài)左側(cè)菜單
這篇文章主要為大家詳細(xì)介紹了layui遞歸實(shí)現(xiàn)動(dòng)態(tài)左側(cè)菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07JS動(dòng)態(tài)生成年份和月份實(shí)例代碼
本文給大家分享兩段代碼來(lái)通過(guò)js動(dòng)態(tài)生成年份和月份功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-02-02微信小程序?qū)崿F(xiàn)一個(gè)簡(jiǎn)單swiper代碼實(shí)例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)一個(gè)簡(jiǎn)單swiper代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12用原生 JS 實(shí)現(xiàn) innerHTML 功能實(shí)例詳解
這篇文章主要介紹了用原生 JS 實(shí)現(xiàn) innerHTML 功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04