JS組件系列——Bootstrap 樹控件使用經驗分享 - 懶得安分 - 博客園

前言:很多時候我們在項目中需要用到樹,有些樹僅僅是展示層級關系,有些樹是為了展示和編輯層級關系,還有些樹是為了選中項然后其他地方調用選中項。不管怎么樣,樹控件都是很多項目里面不可或缺的組件之一。今天,博主打算結合自己的使用經歷和網上找到的一些不錯的樹控件在這里做一個分享,希望能幫大家找到最合適的控件。還是那句話:控件沒有最好,只有最合適。

一、JQuery樹形控件

Jquery樹形控件是一款基于JQuery+bootstrap、完全通過js和樣式手寫出來的非常輕量級的控件,網上很多地方都能看到它的影子。它功能簡單、用戶體驗不錯。對于一些簡單的層級關系展示比較實用,但對于節點的增刪改實現起來就不容易了,如果非要做,可能需要自己去封裝。Demo及下載地址:http://www.jq22.com/jquery-info432

1、一睹初容

全部收起

展開一級

全部展開

2、代碼示例

此控件實現起來也非常簡單,只需要引用jQuery和bootstrap組件即可。

復制代碼

復制代碼

<link href="~/Content/Tree1/css/bootstrap.min.css" rel="stylesheet" /><link href="~/Content/Tree1/css/style.css" rel="stylesheet" /><script src="~/Scripts/jquery-1.10.2.js"></script><script type="text/javascript">$(function(){$('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title', 'Collapse this branch');$('.tree li.parent_li > span').on('click', function (e) {var children = $(this).parent('li.parent_li').find(' > ul > li');if (children.is(":visible")) {children.hide('fast');$(this).attr('title', 'Expand this branch').find(' > i').addClass('icon-plus-sign').removeClass('icon-minus-sign');} else {children.show('fast');$(this).attr('title', 'Collapse this branch').find(' > i').addClass('icon-minus-sign').removeClass('icon-plus-sign');}e.stopPropagation();});});</script>

復制代碼

復制代碼

復制代碼

復制代碼

<div class="tree well"><ul><li><span><i class="icon-folder-open"></i> 頂級節點1</span> <a href="">Goes somewhere</a><ul><li><span><i class="icon-minus-sign"></i> 一級節點1</span> <a href=""></a><ul><li><span><i class="icon-leaf"></i> 二級節點1_1</span> <a href=""></a></li></ul></li><li><span><i class="icon-minus-sign"></i> 一級節點2</span> <a href=""></a><ul><li><span><i class="icon-leaf"></i>二級節點2_1</span> <a href=""></a></li><li><span><i class="icon-minus-sign"></i> 二級節點2_2</span> <a href=""></a><ul><li><span><i class="icon-minus-sign"></i>三級節點2_1</span> <a href=""></a><ul><li><span><i class="icon-leaf"></i>四級節點2_1</span> <a href=""></a></li><li><span><i class="icon-leaf"></i> 四級節點2_2</span> <a href=""></a></li></ul></li><li><span><i class="icon-leaf"></i>三級節點2_2</span> <a href=""></a></li><li><span><i class="icon-leaf"></i> 三級節點2_3</span> <a href=""></a></li></ul></li><li><span><i class="icon-leaf"></i>二級節點2_3</span> <a href=""></a></li></ul></li></ul></li><li><span><i class="icon-folder-open"></i> 頂級節點2</span> <a href=""></a><ul><li><span><i class="icon-leaf"></i> 一級節點2_1</span> <a href=""></a></li></ul></li></ul></div>

復制代碼

復制代碼

這些代碼都是直接從網上down下來的,節點上面的圖標可以通過樣式修改,圖標樣式也是基于bootstrap的。如果需要動態添加節點,可以自己封裝組件去拼html,實現起來應該也比較簡單。由以上可知此組件的輕量級,如果你需要對節點作增刪改或者選擇等操作,不要急,下面的控件可能比較適用。

二、文件樹編輯插件Treed

這個組件是從網上找到的,最初演示,組內成員一致覺得效果很贊。因為它通過樹形展示,方便的提供了節點的增刪改。節點的伸縮效果也比較好。好了來看看。Demo以及下載地址:http://www.jq22.com/jquery-info401

1、初見Treed

默認展開一級

點擊左邊的“+”號和右邊的節點都會去展開子節點

多級展開

在左邊可以編輯節點名稱

按Enter鍵換行新增兄弟節點,同樣刪除換行就可以刪除節點。

按Enter鍵后再按下Tab鍵可以新增子節點

很強大有木有。審核元素可知它使用的是html5的svg標簽來實現的,所以對瀏覽器有一定的要求。

三、通用樹形控件——zTree

ztree是一個傳統的樹形組件,其強大的功能決定他在樹形控件界的地位。不管是樹形展示,還是編輯,又或者是節點單選和多選,它都提供了強大的功能API。但是,由于它界面效果不太好看,所以很多公司使用它的時候都會有一定的猶豫。所幸,至從出了扁平化風格后,ztree也做了一定的美化,比如它的Metro風格的組件和bootstrap風格就非常相像。今天就來結合Metro風格的ztree來介紹下這個組件的一些用法。Demo以及下載地址:http://www.jq22.com/jquery-info941

1、組件使用

此組件可直接通過Nuget去添加。

2、組件效果

節點全部收起

節點展開

節點選中,當然如果需要可以變成單選。

可以增刪改節點

點擊文本框出現樹

3、代碼示例

3.1 直接在界面顯示文本框

需要引用的js和css文件

    <script src="~/Scripts/jquery-1.10.2.js"></script><script src="~/Content/bootstrap/js/bootstrap.js"></script><link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" /><script src="~/Scripts/jquery.ztree.all-3.5.js"></script><link href="~/Content/zTree.theme.metro.css" rel="stylesheet" />

頁面html

   <div id="menuContent" class="menuContent" style="width:95%;border:1px solid rgb(170,170,170);z-index:10;"><ul id="treeDemo" class="ztree" style="margin-top:0; width:100%; height:auto;"></ul></div>

Js初始化

復制代碼

復制代碼

var setting = {view: {addHoverDom: addHoverDom,removeHoverDom: removeHoverDom,selectedMulti: false},check: {enable: true},data: {simpleData: {enable: true}},edit: {enable: false}
};var zNodes = [{ id: 1, pId: 0, name: "父節點1", open: true },{ id: 11, pId: 1, name: "父節點11" },{ id: 111, pId: 11, name: "葉子節點111" },{ id: 112, pId: 11, name: "葉子節點112" },{ id: 113, pId: 11, name: "葉子節點113" },{ id: 114, pId: 11, name: "葉子節點114" },{ id: 12, pId: 1, name: "父節點12" },{ id: 121, pId: 12, name: "葉子節點121" },{ id: 122, pId: 12, name: "葉子節點122" },{ id: 123, pId: 12, name: "葉子節點123" },{ id: 124, pId: 12, name: "葉子節點124" },{ id: 13, pId: 1, name: "父節點13", isParent: true },{ id: 2, pId: 0, name: "父節點2" },{ id: 21, pId: 2, name: "父節點21", open: true },{ id: 211, pId: 21, name: "葉子節點211" },{ id: 212, pId: 21, name: "葉子節點212" },{ id: 213, pId: 21, name: "葉子節點213" },{ id: 214, pId: 21, name: "葉子節點214" },{ id: 22, pId: 2, name: "父節點22" },{ id: 221, pId: 22, name: "葉子節點221" },{ id: 222, pId: 22, name: "葉子節點222" },{ id: 223, pId: 22, name: "葉子節點223" },{ id: 224, pId: 22, name: "葉子節點224" },{ id: 23, pId: 2, name: "父節點23" },{ id: 231, pId: 23, name: "葉子節點231" },{ id: 232, pId: 23, name: "葉子節點232" },{ id: 233, pId: 23, name: "葉子節點233" },{ id: 234, pId: 23, name: "葉子節點234" },{ id: 3, pId: 0, name: "父節點3", isParent: true }
];$(document).ready(function () {$.fn.zTree.init($("#treeDemo"), setting, zNodes);
});function addHoverDom(treeId, treeNode) {var sObj = $("#" + treeNode.tId + "_span");if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;var addStr = "<span class='button add' id='addBtn_" + treeNode.tId+ "' title='add node' onfocus='this.blur();'></span>";sObj.after(addStr);var btn = $("#addBtn_" + treeNode.tId);if (btn) btn.bind("click", function () {var zTree = $.fn.zTree.getZTreeObj("treeDemo");zTree.addNodes(treeNode, { id: (100 + newCount), pId: treeNode.id, name: "new node" + (newCount++) });return false;});
};
function removeHoverDom(treeId, treeNode) {$("#addBtn_" + treeNode.tId).unbind().remove();
};

復制代碼

復制代碼

3.2 默認隱藏,觸發某個事件的時候出現樹。這種場景在項目里面非常常見,一般用于選擇樹節點。所以博主把這個也單獨拿出來說下吧。

div默認是隱藏的。

       <input type="text" class="form-control" id="txt_ztree" placeholder="點擊文本框出現ztree" onclick="showMenu()" /><div id="menuContent2" class="menuContent" style="display:none;position: absolute;width:95%;border:1px solid rgb(170,170,170);z-index:10;"><ul id="treeDemo2" class="ztree" style="margin-top:0; width:160px; height:auto;"></ul></div>

在js里面初始化樹以及注冊showMenu()方法

復制代碼

復制代碼

var setting2 = {check: {enable: true,chkStyle: "radio",radioType: "all"},view: {dblClickExpand: false},data: {simpleData: {enable: true}},callback: {onClick: onClickNode,onCheck: onCheck}
};var zNodes = [{ id: 1, pId: 0, name: "父節點1", open: true },{ id: 11, pId: 1, name: "父節點11" },{ id: 111, pId: 11, name: "葉子節點111" },{ id: 112, pId: 11, name: "葉子節點112" },{ id: 113, pId: 11, name: "葉子節點113" },{ id: 114, pId: 11, name: "葉子節點114" },{ id: 12, pId: 1, name: "父節點12" },{ id: 121, pId: 12, name: "葉子節點121" },{ id: 122, pId: 12, name: "葉子節點122" },{ id: 123, pId: 12, name: "葉子節點123" },{ id: 124, pId: 12, name: "葉子節點124" },{ id: 13, pId: 1, name: "父節點13", isParent: true },{ id: 2, pId: 0, name: "父節點2" },{ id: 21, pId: 2, name: "父節點21", open: true },{ id: 211, pId: 21, name: "葉子節點211" },{ id: 212, pId: 21, name: "葉子節點212" },{ id: 213, pId: 21, name: "葉子節點213" },{ id: 214, pId: 21, name: "葉子節點214" },{ id: 22, pId: 2, name: "父節點22" },{ id: 221, pId: 22, name: "葉子節點221" },{ id: 222, pId: 22, name: "葉子節點222" },{ id: 223, pId: 22, name: "葉子節點223" },{ id: 224, pId: 22, name: "葉子節點224" },{ id: 23, pId: 2, name: "父節點23" },{ id: 231, pId: 23, name: "葉子節點231" },{ id: 232, pId: 23, name: "葉子節點232" },{ id: 233, pId: 23, name: "葉子節點233" },{ id: 234, pId: 23, name: "葉子節點234" },{ id: 3, pId: 0, name: "父節點3", isParent: true }
];//初始化
$(document).ready(function () {$.fn.zTree.init($("#treeDemo2"), setting2, zNodes);
});//顯示菜單
function showMenu() {$("#menuContent2").css({ left: "15px", top: "34px" }).slideDown("fast");$("body").bind("mousedown", onBodyDown);
}
//隱藏菜單
function hideMenu() {$("#menuContent2").fadeOut("fast");$("body").unbind("mousedown", onBodyDown);
}
function onBodyDown(event) {if (!(event.target.id == "menuBtn" || event.target.id == "menuContent2" || event.target.id == "txt_ztree" || $(event.target).parents("#menuContent2").length > 0)) {hideMenu();}
}//節點點擊事件
function onClickNode(e, treeId, treeNode) {var zTree = $.fn.zTree.getZTreeObj("treeDemo");zTree.checkNode(treeNode, !treeNode.checked, null, true);return false;
}//節點選擇事件
function onCheck(e, treeId, treeNode) {var zTree = $.fn.zTree.getZTreeObj("treeDemo"),nodes = zTree.getCheckedNodes(true),v = "";var parentid = "";var parentlevel = "";for (var i = 0, l = nodes.length; i < l; i++) {v += nodes[i].name + ",";parentid += nodes[i].id + ",";parentlevel += nodes[i].menu_level + ",";}if (v.length > 0) {v = v.substring(0, v.length - 1);parentid = parentid.substring(0, parentid.length - 1);parentlevel = parentlevel.substring(0, parentlevel.length - 1);}else {return;}hideMenu();
}

復制代碼

復制代碼

由于以上都是靜態數據,如果需要從后臺取數據動態加載樹節點,可以去后臺構造zNodes這種結構的數組即可。

四、總結

以上三種樹形組件,各有千秋,可以根據需求選用不同的組件。還是那句話,沒有最好,只有最合適,如果園友們有什么更好用的樹形組件,不妨推薦下,不勝感激。之前那篇被指有問題,在此重新發下。如果覺得本文對你有幫助,請幫忙推薦吧,博主會繼續努力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248902.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法第4章實踐報告

1.實踐題目&#xff1a;最小刪數問題 2.問題描述&#xff1a;給定n位正整數a&#xff0c;去掉其中任意k≤n 個數字后&#xff0c;剩下的數字按原次序排列組成一個新 的正整數。對于給定的n位正整數a和正整數 k&#xff0c;設計一個算法找出剩下數字組成的新數最 小的刪數方案。…

Vue 下拉刷新及無限加載組件 - 有你便是晴天 - 博客園

原文 https://github.com/wangdahoo/vue-scroller 主題 Vue.js Vue Scroller Vue Scroller is a foundational component ofVonic UI. In purpose of smooth scrolling, pull to refresh and infinite loading. Demo Change Logs v0.3.9 add getPosition method for scr…

用java編程實現集合的交、并、差和補運算

一、實驗目的 掌握集合的交、并、差和補運算&#xff0c;并且使用計算機編程實現。 二、實驗內容 通過編程實現求給定集合A和B的并集C&#xff08;CA∪B&#xff09;、交集C&#xff08;CA∩B&#xff09;、差集C&#xff08;CA-B&#xff09;、補集~CE-C的運算。 三、實驗要求…

node.js項目中常量的配置 - 個人文章 - SegmentFault 思否

在項目中&#xff0c;我們常將一些常量信息做成配置項&#xff0c;如&#xff0c;數據庫的鏈接配置&#xff0c;業務錯誤代碼配資等等。 我們通過兩種方式可以解決該問題。 系統環境變量的方式 配置文件的方式 下邊&#xff0c;將以這兩方面進行展開。 1. 系統環境變量 No…

MySQL create table語法中的key與index的區別

在create table的語句中&#xff0c;key和index混淆在一起&#xff0c;官方手冊中的解釋是這樣&#xff1a; KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemente…

藍橋杯 歷屆試題 九宮重排 (bfs+康托展開去重優化)

Description 如下面第一個圖的九宮格中&#xff0c;放著 1~8 的數字卡片&#xff0c;還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動&#xff0c;可以形成第二個圖所示的局面。我們把第一個圖的局面記為&#xff1a;12345678.把第二個圖的局面…

DIV或者DIV里面的圖片水平與垂直居中的方法 - 站住,別跑 - 博客園

DIV或者DIV里面的圖片水平與垂直居中的方法 <div class“box”><img /> </div> 水平居中的常用方式&#xff1a; text-align:center ——這可以實現子元素字體&#xff0c;圖片的水平居中。 margin:0 auto —— 這是針對塊元素的水平居中方法 垂直居中的常…

spring boot的多環境部署

需求&#xff1a;不同的環境有不同的開關屬性&#xff0c;比如開發系統&#xff0c;需要關閉短信&#xff0c;微信的通知功能。而演示環境&#xff0c;線上環境則需要打開這些配置。 那么&#xff0c;如何做到呢&#xff1f;---》在properties.application配置 需要在resources…

mybatis之動態SQL操作之查詢

1&#xff09; 查詢條件不確定&#xff0c;需要根據情況產生SQL語法&#xff0c;這種情況叫動態SQL /*** 持久層* author AdminTC*/ public class StudentDao {/*** 動態SQL--查詢*/public List<Student> dynaSQLwithSelect(String name,Double sal) throws Exception{S…

設置圖片元素上下垂直居中的7種css樣式_趙一鳴博客

設置圖片元素上下垂直居中的7種css樣式 閱讀(9548) 2018-07-15 14:13:34 圖片、文字左右居中很簡單&#xff0c;只需要以下代碼&#xff1a; 1 text-align:center; 文字上下居中也很簡單&#xff0c;假設外部div元素的高度是100px&#xff0c;那么&#xff1a; 1 line-heig…

zap+日志分級分文件+按時間切割日志整合demo

實現功能 info debug 級別的日志輸出到 /path/log/demo.log ????warn error .... 級別的日志輸出到 /path/log/demo_error.log ????日志自動按小時分割 最多保留7天的日志 依賴的第三方包github地址 https://github.com/uber-go/zap https://github.com/lestrrat-go/fi…

day36 Pyhton 網絡編程03

一.內容回顧 socket通常也稱作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一個通信鏈的句柄&#xff0c;應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。 socket起源于Unix&#xff0c;而Unix/Linux基本哲學之一就是“一切皆文件”…

在webpack中使用eslint配置(詳細教程)-js教程-PHP中文網

本篇文章主要介紹了webpack引入eslint配置詳解&#xff0c;現在分享給大家&#xff0c;也給大家做個參考。 webpack中eslint使用 首先&#xff0c;要使webpack支持eslint&#xff0c;就要要安裝 eslint-loader &#xff0c;命令如下: 1 npm install --save-dev eslint-loader 在…

創建一個屬于自己的博客

1、安裝 node.js wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz tar -xf node-v10.15.3-linux-x64.tar.xz -C /home/ 解壓到/home、目錄下 mv node-v10.15.3-linux-x64/ node vim /etc/profile #配置環境變量 export PATH/home/node/bin:$PATH export…

Redis是什么?

Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. redis是開源,BSD許可,高級的key-value存儲系統. 可以用來存儲字符串,哈希結構…

Vue中定義全局變量與常量的各種方式詳解_vue.js_腳本之家

前言 本文主要跟大家介紹了關于Vue定義全局變量與常量的相關內容&#xff0c;分享出來供大家參考學習&#xff0c;下面話不多說了&#xff0c;來一起看看詳細的介紹&#xff1a; 我想要定義一個變量, 在項目的任何地方都可以訪問到, 不需要每一次使用的時候, 都引入. 嘗試1:…

oracle 數據庫 鎖

首先你要知道表鎖住了是不是正常鎖&#xff1f;因為任何DML語句都會對表加鎖。 你要先查一下是那個會話那個sql鎖住了表&#xff0c;有可能這是正常業務需求&#xff0c;不建議隨便KILL session&#xff0c;如果這個鎖表是正常業務你把session kill掉了會影響業務的。建議先查原…

推薦21個頂級的Vue UI庫! – TalkingData‘s Blog

推薦21個頂級的Vue UI庫&#xff01; 最近&#xff0c;隨著“星球大戰”&#xff08;指 GitHub 的 Star 數量大比拼&#xff09;的爆發&#xff0c;Vue.js 在 GitHub 上的 Star 數超過了 React。雖然 NPM 的下載量仍然落后于 React&#xff0c;但 Vue.js 的受歡迎程度似乎在持續…

后綴數組水題兩道

BZOJ1031:倍長&#xff0c;建sa&#xff0c;跑一邊把sa值小于等于長度的后綴第n個字母輸出BZOJ4278:直接把串合并起來建一個sa就可以了&#xff0c;然后直接分組貪心 轉載于:https://www.cnblogs.com/dream-maker-yk/p/10068915.html

js獲取頁面的各種高度與寬度

document.body.scrollTop等屬性可以獲取頁面滾動距離等&#xff0c;但是此類屬性在xhtml標準網頁或者更簡單的說是帶<!DOCTYPE ..>標簽的頁面里得到的結果是0&#xff0c; 所以一般為了兼容性都這樣寫 document.documentElement.scrollTop || document.body.scrollTop;以…