1. 程式人生 > >JS元件系列——分享自己封裝的Bootstrap樹形元件:jqTree

JS元件系列——分享自己封裝的Bootstrap樹形元件:jqTree

 前言:之前的一篇介紹了下如何封裝自己的元件,這篇再次來體驗下自己封裝元件的樂趣。看過博主部落格的園友應該記得之前分享過一篇樹形選單的使用JS元件系列——Bootstrap 樹控制元件使用經驗分享,這篇裡面第一個Jquery Tree,只是用簡單樣式和js去實現了效果,沒有給出一個系統的封裝,這篇博主就來試試在此樣式的基礎上封裝一個稍微完整點的樹形元件。

一、元件效果預覽

其實效果和之前的那個差不多,博主只是在之前的基礎上加了一個選中的背景色。

全部收起

展開

全部展開

二、程式碼示例

其實效果很簡單,重點來看看程式碼是如何實現封裝的。還是老規矩,將已經實現的程式碼貼出來,然後再來一步一步講解。

(function ($) {
    //使用js的嚴格模式
    'use strict';

    $.fn.jqtree = function (options) {
        //合併預設引數和使用者傳過來的引數
        options = $.extend({}, $.fn.jqtree.defaults, options || {});

        var that = $(this);
        var strHtml = "";
        //如果使用者傳了data的值,則直接使用data,否則傳送ajax請求去取data
        if
(options.data) { strHtml = initTree(options.data); that.html(strHtml); initClickNode(); } else { //在傳送請求之前執行事件 options.onBeforeLoad.call(that, options.param); if (!options.url) return;
//傳送遠端請求獲得data $.getJSON(options.url, options.param, function (data) { strHtml = initTree(data); that.html(strHtml); initClickNode(); //請求完成之後執行事件 options.onLoadSuccess.call(that, data); }); } //註冊節點的點選事件 function initClickNode() { $('.tree li').addClass('parent_li').find(' > span').attr('title', '收起'); $('.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', '展開').find(' > i').addClass('icon-plus-sign').removeClass('icon-minus-sign'); } else { children.show('fast'); $(this).attr('title', '收起').find(' > i').addClass('icon-minus-sign').removeClass('icon-plus-sign'); } $('.tree li[class="parent_li"]').find("span").css("background-color", "transparent"); $(this).css("background-color", "#428bca"); options.onClickNode.call($(this), $(this)); }); }; //遞迴拼接html構造樹形子節點 function initTree(data) { var strHtml = ""; for (var i = 0; i < data.length; i++) { var arrChild = data[i].nodes; var strHtmlUL = ""; var strIconStyle = "icon-leaf"; if (arrChild && arrChild.length > 0) { strHtmlUL = "<ul>"; strHtmlUL += initTree(arrChild) + "</ul>"; strIconStyle = "icon-minus-sign"; } strHtml += "<li id=\"li_" + data[i].id + "\"><span id=\"span_" + data[i].id + "\"><i class=\"" + strIconStyle + "\"></i>" + data[i].text + "</span>" + strHtmlUL + "</li>"; } return strHtml; }; }; //預設引數 $.fn.jqtree.defaults = { url: null, param: null, data: null, onBeforeLoad: function (param) { }, onLoadSuccess: function (data) { }, onClickNode: function (selector) { } }; })(jQuery);

1、封裝說明,來簡單看看以上程式碼

(1)使用 (function ($) {})(jQuery) 這種匿名函式宣告並立刻執行的方式的作用是向jquery物件裡面增加一個自定義的方法,如果對這種寫法不懂的可以看看上篇說明JS元件系列——封裝自己的JS元件,你也可以。這樣封裝以後,我們可以直接通過 $("#id").jqtree({}); 這種寫法來初始化該樹形元件。

(2)定義預設引數後,使用者可以只傳自己需要傳遞的引數,對於不需要的引數,直接使用預設值就好。這也就是為什麼很多bootstrap元件都有一個預設引數列表這麼一個東東的原因。

(3)封裝後的元件同時支援兩種傳遞資料的方式,如果使用者直接傳遞了data引數,就直接使用data引數初始化,否則,就同url傳送ajax請求去後臺取資料。

(4)如果是url方式取資料,使用者可以在元件載入前和載入完成後自定義事件處理方法。對應的是上面的onBeforeLoad和onLoadSuccess。onLoadSuccess事件的引數對應著ajax請求的data資料。有時需要在元件載入完成之後做一些特殊處理,可以在這個方法裡面寫。

(5)可以自定義節點的click事件處理方法,對應的是上面的onClickNode。引數傳遞的是當前點選節點的jquery物件。

2、元件呼叫

說了這麼多,那麼該如何使用呢?

首先我們html只需要一個空的ul標籤

<div class="tree well">
    <ul id="ul_tree">
    </ul>
</div>

上面說了,元件可以同時支援兩種呼叫方式:

1)直接傳Json陣列;

var testdata = [{
    id: '1',
    text: '系統設定',
    nodes: [{
        id: '11',
        text: '編碼管理',
        nodes: [{
            id: '111',
            text: '自動管理',
            nodes: [{
                id: '1111',
                text: '手動管理',
                nodes: [{
                    id: '11111',
                    text: '底層管理',
                }]
            }]
        }]
    }]
}, {
    id: '2',
    text: '基礎資料',
    nodes: [{
        id: '21',
        text: '基礎特徵'
    }, {
        id: '22',
        text: '特徵管理'
    }]
}];

$(function () {
    $("#ul_tree").jqtree({
        data: testdata,
        param: { },
        onBeforeLoad: function (param) {
        },
        onLoadSuccess: function (data) {  
        },
        onClickNode: function (selector) {
        }
    });
});

2)通過URL遠端獲取資料:

後臺C#請求方法,構造上面data格式的資料型別。

    public class Tree
    {
        public string id { get; set; }
        public string text { get; set; }
        public object nodes { get; set; }
    }
     //返回tree的節點資料
        public JsonResult GetTreeData()
        {
            var lstRes = GetNode(1);
            return Json(lstRes, JsonRequestBehavior.AllowGet);
        }

        public List<Tree> GetNode(int iNum)
        {
            var lstRes = new List<Tree>();
            if (iNum > 5)
            {
                return lstRes;
            }
            for (var i = 1; i < 3; i++)
            {
                var oNode = new Tree { id = Guid.NewGuid().ToString(), text = iNum + "級節點" + i };
                var lstRes2 = GetNode(iNum + 1);
                oNode.nodes = lstRes2;
                lstRes.Add(oNode);
            }
            return lstRes;
        }

前端呼叫

$(function () {
    $("#ul_tree").jqtree({
        url: "/Home/GetTreeData",
        param: { },
        onBeforeLoad: function (param) {
        },
        onLoadSuccess: function (data) {
        },
        onClickNode: function (selector) {
        }
    });
});

onLoadSuccess事件除錯看看

onClickNode事件除錯看看,selector對應著當前的點選的節點的jquery物件。

三、小結

以上就是對jquery tree的一個簡單封裝,今天剛剛完成的第一個版本,可能效果不太好,但基本的功能有了,後面還有待優化。歡迎園友們拍磚!

相關推薦

JS元件系列——分享自己封裝Bootstrap樹形元件jqTree

 前言:之前的一篇介紹了下如何封裝自己的元件,這篇再次來體驗下自己封裝元件的樂趣。看過博主部落格的園友應該記得之前分享過一篇樹形選單的使用JS元件系列——Bootstrap 樹控制元件使用經驗分享,這篇裡面第一個Jquery Tree,只是用簡單樣式和js去實現了效果,沒有給出一個系統的封裝,這篇博主就來試試

JS元件系列——自己動手封裝bootstrap-treegrid元件

前言:最近產品需要設計一套相對完整的組織架構的解決方案,由於組織架構涉及到層級關係,在表格裡面展示層級關係,自然就要用到所謂的treegrid。可惜的是,一些輕量級的表格元件本身並沒有自帶樹形表格的功能,比如bootstrapTable就沒有這個功能,怎麼辦呢?如果是jqgrid、easyUI的表格,tree

JS元件系列——BootstrapTable 行內編輯解決方案x-editable

前言:之前介紹bootstrapTable元件的時候有提到它的行內編輯功能,只不過為了展示功能,將此一筆帶過了,罪過罪過!最近專案裡面還是打算將行內編輯用起來,於是再次研究了下x-editable元件,遇到過一些坑,再此做個採坑記錄吧!想要了解bootstrapTable的園友可以移步 JS元件系列——表格元

JS元件系列——基於Bootstrap Ace模板的選單和Tab頁效果分享(你值得擁有)

前言:最近園子裡多了許多談語言、談環境、談逼格(格局)的文章,看看笑笑過後,殊不知其實都是然並卵。提升自己的技術才是王道。之前博主分享過多篇bootstrap元件的文章,引起了很多園友的關注和支援,看樣子這種風格還是受到很多園友青睞的。本著不辜負園友們的支援的原則,應群友們的要求,今天來分享下專案中使用Ace

JS元件系列——封裝自己JS元件,你也可以

前言:之前分享了那麼多bootstrap元件的使用經驗,這篇博主打算研究下JS元件的擴充套件和封裝,我們來感受下JQuery為我們提供$.Extend的神奇,看看我們怎麼自定義自己的元件,比如我們想擴充套件一個$("#id").MyJsControl({})做我們自己的元件,我們該如何去做呢,別急,我們慢慢來

JS元件系列——Bootstrap 樹控制元件使用經驗分享

前言:很多時候我們在專案中需要用到樹,有些樹僅僅是展示層級關係,有些樹是為了展示和編輯層級關係,還有些樹是為了選中項然後其他地方呼叫選中項。不管怎麼樣,樹控制元件都是很多專案裡面不可或缺的元件之一。今天,博主打算結合自己的使用經歷和網上找到的一些不錯的樹控制元件在這裡做一個分享,希望能幫大家找到最合適的控制元

JS元件系列——兩種bootstrap multiselect元件大比拼[轉載]

轉載原文地址:https://www.cnblogs.com/landeanfen/p/5013452.html 前言:今天繼續來看看bootstrap的另一個元件:multiselect。記得在專案開始之前,博主專案組幾個同事就使用哪些js元件展開過討論,其中就說到了select元件,

JS元件系列——表格元件神器bootstrap table(三終結篇,最後的乾貨福利)

前言:前面介紹了兩篇關於bootstrap table的基礎用法,這章我們繼續來看看它比較常用的一些功能,來個終結篇吧,毛爺爺告訴我們做事要有始有終~~bootstrap table這東西要想所有功能覆蓋似乎不太現實,博主挑選了一些自認為比較常用的功能在此分享給各位園友。原始

JS元件系列——表格元件神器bootstrap table

前言:之前一直在忙著各種什麼效果,殊不知最基礎的Bootstrap Table用法都沒有涉及,罪過,罪過。今天補起來吧。上午博主由零開始自己從頭到尾使用了一遍Bootstrap Table ,遇到不少使用方面的問題,也做了一部分筆記,在此分享出來供需要使用的園友參考。還記得前

JS元件系列——表格元件神器bootstrap table(二父子表和行列調序)

前言:上篇 JS元件系列——表格元件神器:bootstrap table 簡單介紹了下Bootstrap Table的基礎用法,沒想到討論還挺熱烈的。有園友在評論中提到了父子表的用法,今天就結合Bootstrap table的父子表和行列調序的用法再來介紹下它稍微高階點的用法

JS元件系列——又一款MVVM元件Vue(二構建自己的Vue元件

前言:轉眼距離上篇 JS元件系列——又一款MVVM元件:Vue(一:30分鐘搞定前端增刪改查) 已有好幾個月了,今天打算將它撿起來,發現好久不用,Vue相關技術點都生疏不少。經過這幾個月的時間,Vue的發展也是異常迅猛,不過這好像和博主都沒什麼太大的關係,博主還是老老實實研究自己的技術吧。技術之路還很長,且行

JS元件系列——自己動手擴充套件BootstrapTable的 凍結列 功能徹底解決高度問題

前言:一年前,博主分享過一篇關於bootstrapTable元件凍結列的解決方案  JS元件系列——Bootstrap Table 凍結列功能IE瀏覽器相容性問題解決方案 ,通過該篇,確實可以實現bootstrapTable的凍結列效果,並且可以相容ie瀏覽器。這一年的時間,不斷有園友以及群裡面的朋友問過我關

JS元件系列——自己動手擴充套件BootstrapTable的treegrid功能

前言:上篇  JS元件系列——自己動手封裝bootstrap-treegrid元件 博主自己動手封裝了下treegrid的功能,但畢竟那個元件只是一個單獨針對樹形表格做的,適用性還比較有限。關注博主的園友應該知道,博主的部落格裡面寫了很多bootstrapTable的擴充套件,今天打算在直接在bootstra

JS元件系列——不容錯過的兩款Bootstrap Icon圖示選擇元件

前言:最近好多朋友在群裡面聊到bootstrap icon圖示的問題,比如最常見的選單管理,每個選單肯定需要一個對應的選單圖示,要是有一個視覺化的圖示選擇元件就好了,最好是直接選擇圖示,就能得到對應的class樣式。於是乎各種百度,皇天不負有心人,最後被博主找到了,感覺效果還不錯,並且支援自定義的圖示,今天就

JS元件系列——再推薦一款好用的bootstrap-select元件,親測還不錯

前言:之前分享過兩篇bootstrap下拉框的元件:JS元件系列——兩種bootstrap multiselect元件大比拼  和 JS元件系列——Bootstrap Select2元件使用小結 ,收到很多園友的關注和提問,最後總結這兩篇裡面的下拉框元件都存在一些大大小小的問題,比如兩種bootstrap m

JS元件系列——Bootstrap Table 表格行拖拽

前言:之前一直在研究DDD相關知識,好久沒更新JS系列文章了。這兩天做了一個簡單的業務需求,覺得效果還可以,今天在這裡分享給大家,歡迎拍磚~~ 一、業務需求及實現效果 專案涉及到訂單模組,那天突然接到一個需求,說是兩種不同狀態的訂單之間要實現插單的效果,頁面上呈現方式是:左右兩個Table,左邊Table

JS元件系列——Bootstrap右鍵選單解決方案ContextMenu

前言:有段時間沒發表隨筆了,過個年人都變得懶了。新年剛來上班,今天正好得空,將去年遺留的兩個小元件總結記錄下。有朋友跟我說:你的bootstrap元件要能夠形成一個可以滿足一般專案需求的系列元件,才有真正的實用價值。想想說得在理。這不今天來總結下bootstrap的一個小元件的應用。好了,不說廢話,進入正題吧

JS元件系列——Bootstrap元件福利篇幾款好用的元件推薦

前言:之前分享過很多bootstrap常用元件,包括表格、表單驗證、檔案上傳、複選下拉框、彈出框等。這段時間,博主又收藏了一些好用的元件(有些在專案中已經用起來了),經過兩天的時間,已經整理出了一部分,本著“好東西要與人分享”的原則,今天還是來點福利,將博主收藏的東西分享出來,供需要的園友參考。元件大部分都是

JS元件系列——在ABP中封裝BootstrapTable

 前言:關於ABP框架,博主關注差不多有兩年了吧,一直遲遲沒有嘗試。一方面博主覺得像這種複雜的開發框架肯定有它的過人之處,系統的穩定性和健壯性比一般的開源框架肯定強很多,可是另一方面每每想到它繁瑣的封裝和複雜的開發流程就望而卻步,就這樣遲遲沒有行動。最近在專案裡面用到了ABP框架,沒辦法,只有硬著頭皮上了。經

JS元件系列——兩種bootstrap multiselect元件大比拼

前言:今天繼續來看看bootstrap的另一個元件:multiselect。記得在專案開始之前,博主專案組幾個同事就使用哪些js元件展開過討論,其中就說到了select元件,由於專案的整體風格使用的bootstrap風格,所以在選用select元件的時候優先考慮和bootstrap結合使用的。其中就找到了兩個