溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

zTree jQuery 樹插件的使用(實例講解)

發布時間:2020-10-02 22:36:44 來源:腳本之家 閱讀:185 作者:_只影向誰去 欄目:web開發

分享說明:

項目需要樹狀視圖形式展示后臺返回的數據;并實現點擊節點將節點信息添加到右側的ul中;待后續提交獲取使用;選擇了能夠實現異步加載節點信息的zTree插件,事實也證明這個插件足夠強大,能夠滿足幾乎所有需求;剛接觸時看了很多人的分享,結合官方api文檔,終于實現了功能,現將我學習的總結也分享出去.

效果介紹;除了zTree默認的效果;使用api增加了一些實用的操作;包括手風琴效果;點擊父節點展開效果;點擊節點文字關聯復選框效果;一級子節點數量展示效果.

外部引入資源

<link rel="stylesheet" href="./zTree_v3-master/css/zTreeStyle/zTreeStyle.css" rel="external nofollow" >
<script type="text/javascript" src="./jquery-1.9.1.js"></script>
<script type="text/javascript" src="./zTree_v3-master/js/jquery.ztree.all.min.js"></script>

html部分代碼

<div class="box">
    <ul id="treeDemo" class="ztree"></ul>
    <ul id="ulright">
      <li >已選擇</li>
    </ul>
  </div>

css代碼

ul,li,body{
    margin: 0;
    padding: 0;
  }
  .ztree li span.node_name {
    font-size: 16px;
  }
  .box{
    width: 500px;
    margin:10px auto;
    border:3px solid #ccc;
    padding: 20px;
    border-bottom: none;
  }
  #treeDemo{
    width: 200px;
    display: inline-block;
    background-color: #f1f1f1;
    min-height: 200px;
  }
  #ulright{
    width: 200px;
    margin-left: 50px;
    min-height: 200px;
    border:1px solid #ccc;
    display: inline-block;
    vertical-align: top;
    background-color: #eeeee8;
  }
  #ulright li{
    width: 100%;
    height: 30px;
    list-style: none;
    line-height: 30px;
    margin-bottom: 3px;
    background-color: #00b6ba;
    padding-left: 10px;
    box-sizing: border-box;

  }


  /**/
  .ztree li a.curSelectedNode{
    background-color: transparent;
    border:#00b6ba;
  }
  .ztree li span.node_name{
    font-size: 18px;
    line-height: 18px;
    color: #000;
  }
  .ztree li a{
    padding: 5px;
    vertical-align: middle;
  }
  .ztree li a:hover{
    text-decoration: none;
  }
  .ztree li span.button.chk{
    margin: 9px 3px;
  }

js代碼

//遞歸找到所有節點(非父節點)
function getAllChildrenNodes(treeNode,result){
   if (treeNode.isParent) {
    var childrenNodes = treeNode.children;
    if (childrenNodes) {
      for (var i = 0; i < childrenNodes.length; i++) {
        if(!childrenNodes[i].children){
          result.push(childrenNodes[i].name);
        }
        result = getAllChildrenNodes(childrenNodes[i], result);
      }
    }
  }
  return result;
}
var parames = 3;
//zTree的所有配置
var setting = {
  //zTree 的唯一標識,初始化后,等于 用戶定義的 zTree 容器的 id 屬性值。
  treeId:"",
  //zTree 容器的 jQuery 對象,主要功能:便于操作,內部參數,不可修改
  treeObj:null,
  //異步請求數據配置;當父節點沒有子節點時;點擊此父節點會觸發請求
  async:{
    //打開此功能
    enable: true,
    url:"./zTreeDemoV9.0SimpleFromV10.0.php",
    type:"post",
    //發送的父級id的字段定義;如修改,遵循格式autoParam: ["id=parentId"]
    autoParam: ["id"],
    //其他需要提交的參數["name","topic","key","ss"]轉換后格式為name=topic&key=ss
    otherParam:["json",parames || 1,"test","2"],
    dataType:"json",
    contentType: "application/x-www-form-urlencoded",
    //ajax請求后的數據預處理函數
    dataFilter: function(treeId,parentNode,responseData){
      for(var i=0;i<responseData.length;i++){
        responseData[i] = JSON.parse(responseData[i])
      }
      return responseData;
    }
  },
  //數據配置
  data: {
    simpleData: {
      enable: true,
      idKey: "id", //修改默認的ID為自己的id
      pIdKey: "pid", //修改默認父級ID為自己數據的父級id
      rootPId: 0 //根節點的父節點id
    }
  },
  //視圖配置
  view: {
    //是否顯示節點前的圖標
    showIcon: false,
    //節點上a標簽的樣式
    fontCss: {
    }
  },
  //選框配置
  check: {
    //啟用復選框
    enable: true,
    //chkStyle:"radio"
    //復選框父子級選擇聯動設置
    chkboxType: { "Y": "ps", "N": "ps" }
  },
  //事件配置
  callback: {
    //點擊復選框之前的事件
    beforeCheck:function(treeId, treeNode){//如果節點是父節點,并且勾選時沒有子節點,則不允許勾選;針對父節點沒有展開,則沒有異步加載子節點,此情況禁止點擊父節點全選子節點的操作
      if(treeNode.isParent && !treeNode.children){
        return false;
      }
    },
    //回調錯誤事件
    onAsyncError: function(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown){
      alert("初始化節點數據失敗,請稍后重試");
    },
    //回調成功事件
    onAsyncSuccess: function(event, treeId, treeNode, resData){
      var zTree = $.fn.zTree.getZTreeObj("treeDemo");
      console.log("數據加載成功");
      var count = (treeNode.children.length);
      //加載成功后;在節點后面顯示此父節點下有幾個一級子節點
      $(".ztree").find("a[title="+treeNode.name+"]").find("span[class='node_name']").html(treeNode.name+"<span>("+count+")</span>");
    },
    //父節點展開時的事件
    onExpand: function(event, treeId, treeNode){
      //zTree對象
      var zTree = $.fn.zTree.getZTreeObj("treeDemo");
      //獲取點擊的id
      var nowId = treeNode.id;
      //獲取所有節點
      var allNodes = zTree.getNodes();
      //獲取點擊節點的層級
      var level = treeNode.level;
      //定義過濾函數;獲取節點層級與點擊節點層級相同并且為父節點的節點
      function filter(node) {
        return (node.level == treeNode.level && node.isParent);
      }
      //獲得點擊節點同級的父節點的集合
      var sameLevelNodes = zTree.getNodesByFilter(filter);
      //遍歷同級節點集合
      for(var i=0;i<sameLevelNodes.length;i++){
        //將非被點擊父節點收起;實現手風琴效果
        if(sameLevelNodes[i].id != nowId){
          zTree.expandNode(sameLevelNodes[i], false, true, true);
        }
      }
    },
    //點擊事件
    onClick: function(e, treeId, treeNode, clickFlag) {
      //tree實例
      var zTree = $.fn.zTree.getZTreeObj("treeDemo");
      //點擊文字關聯復選框
      //如果不是父節點,則關聯,或者是父節點,但展開狀態位true是,也關聯;
      if(!treeNode.isParent || (treeNode.isParent && treeNode.open)){
        zTree.checkNode(treeNode, !treeNode.checked, true);//點擊文字關聯復選框
      }
      //點擊文字展開當前節點
      zTree.expandNode(treeNode, true, true, true);
      // zTree.reAsyncChildNodes(treeNode, "refresh");//強行異步加載(存在子節點也進行加載)
      //手風琴效果;直接調用onExpand
      zTree.setting.callback.onExpand(e, treeId, treeNode);

      //點擊節點名稱和勾選節點前面的復選框邏輯相同;
      //直接在onClick里面調用onCheck函數;并傳入所需參數
      zTree.setting.callback.onCheck(e, treeId, treeNode);
    },
    //點擊復選框事件
    onCheck: function(e, treeId, treeNode) {
      //獲取右側ul內所有li標簽;用于比較當前選擇復選框在右側是否一斤存在
      var rightLi = $("#ulright").find("li");
      //選中的是底層節點;
      if(!treeNode.isParent){
        //選中狀態,加入到右側
        if(treeNode.checked){
          //遍歷右側li,如果選中的已經存在;return
          for(var i=0;i<rightLi.length;i++){
            if($(rightLi[i]).attr("title") == treeNode.name){
              return;
            }
          }
          // 創建li 追加li
          var addLi = $("<li title="+treeNode.name+"><span></span>");
          addLi.find("span").text(treeNode.name);
          addLi.animate({
            width:"100%",
            height:"30"
          },400)
          addLi.appendTo($("#ulright"));
          //如果點擊的節點存在connect字段;判斷復選框狀態加入到右側ul或刪除
          if(treeNode.connect){
            //遍歷右側li,如果選中的已經存在;return
            for(var i=0;i<rightLi.length;i++){
              if($(rightLi[i]).attr("title") == treeNode.connect){
                return;
              }
            }
             // 創建li 追加li
            var addLi = $("<li title="+treeNode.connect+"><span></span>");
              addLi.find("span").text(treeNode.connect);
              addLi.animate({
                width:"100%",
                height:"30"
              },400)
            addLi.appendTo($("#ulright"));
          }
          //將被勾選的節點背景顏色更改
          $("#treeDemo").find("a[title="+treeNode.name+"]").css("backgroundColor","#00b6ba");
        //非選中狀態,刪除
        }else{
          //將右側的次節點對應的li刪除
          $("#ulright").find("li[title="+treeNode.name+"]").animate({
            width:"0%",
            height:"0"
          },400,function(){
            $("#ulright").find("li[title="+treeNode.name+"]").remove();
          })
          //取消此節點的背景顏色
          $("#treeDemo").find("a[title="+treeNode.name+"]").css("backgroundColor","");
        }
      //選中的是父節點;獲取所有子節點(非父節點),判斷復選框狀態加入到右側ul或刪除
      }else{
        //調用遞歸函數;獲取所有非父級子節點數組集合
        var addNodesArray = getAllChildrenNodes(treeNode,[]);
        //是選中狀態,加入到右側ul
        if(treeNode.checked){
          //定義存儲右側li的數組
          var rightLiArray = [];
          $("#ulright li").each(function(i,v){
            rightLiArray.push($(v).attr("title"))
          })
          rightLiArray = rightLiArray.slice(1);
          //遍歷勾選的數組集合
          for(var i=0;i<addNodesArray.length;i++){
            //判斷此節點是否在右側ul內;不存在則加入
            if(rightLiArray.indexOf(addNodesArray[i]) == -1){
              //創建li 追加li
              var addLi = $("<li title="+addNodesArray[i]+"><span>"+addNodesArray[i]+"</span>");
              addLi.animate({
                width:"100%",
                height:30
              },400)
              addLi.appendTo($("#ulright"));
            }
            //將節點背景顏色修改
            $("#treeDemo").find("a[title="+addNodesArray[i]+"]").css("backgroundColor","#00b6ba");
          }
        //是非選中狀態,刪除
        }else{
          //遍歷節點,執行刪除操作
          for(var i=0;i<addNodesArray.length;i++){
            $("#ulright").find("li[title="+addNodesArray[i]+"]").animate({
              width:"0%",
              height:0
            },function(){
              $(this).css("display","none");
              $(this).remove();
            })
            //還原背景顏色
            $("#treeDemo").find("a[title="+addNodesArray[i]+"]").css("backgroundColor","");
          }
        }
      }
    },
  }

};
//zTree的節點信息;可一次性全部加載;可試試異步請求
var zNodes = [{
      name: "數據表",//名稱
      id: 4,//id,子元素的pid
      isParent:true,//是否為父節點,默認為false
      pid:0//父節點id;data中的rootPId;
    },{
      name: "測試表",
      id: 1,
      isParent:true,
      pid:0
    },{
      name: "信息表",
      id: 2,
      isParent:true,
      pid:0
    },{
      name: "作廢表",
      id: 3,
      isParent:true,
      pid:0
    }];
$(document).ready(function() {
  //初始化zTree; zTree容器的jquery對象/ 配置/ 節點
  $.fn.zTree.init($("#treeDemo"), setting, zNodes);
});

后臺php代碼;本人純前端,后臺代碼只會簡單的寫寫;

<?php

$pId = $_POST['id'];

if($pId == 4){
  $array = array('{"name":"數據表_一","id":"1_1","pid":"0"}','{"name":"數據表_二","id":"1_2","pid":"0"}','{"name":"數據表_三","id":"1_3","pid":"0"}','{"name":"數據表_四","id":"1_4","pid":"0"}','{"name":"數據表_五","id":"1_5","pid":"0"}');
}else if($pId == 1){
  $array = array('{"name":"測試表_一","id":"2_1","pid":"1"}','{"name":"測試表_二","connect":"測試表_一","id":"2_2","pid":"1"}','{"name":"測試表_三","id":"2_3","pid":"1"}','{"name":"測試表_四","id":"2_4","pid":"1"}','{"name":"測試表_五","id":"2_5","pid":"1"}');
}else if($pId == 2){
  $array = array('{"name":"信息表_一","id":"3_1","pid":"3"}','{"name":"信息表_二","id":"3_2","pid":"3"}','{"name":"信息表_三","id":"3_3","pid":"3"}','{"name":"信息表_四","id":"3_4","pid":"3"}','{"name":"信息表_五","id":"3_5","pid":"3"}','{"name":"信息表_五_一","id":"3_5_1","pid":"3_5"}','{"name":"信息表_五_二","id":"3_5_2","pid":"3_5"}','{"name":"信息表_三_一","id":"3_3_1","pid":"3_3"}','{"name":"信息表_三_二","id":"3_3_2","pid":"3_3"}','{"name":"信息表_三_三","id":"3_3_3","pid":"3_3"}');
}else if($pId == 3){
  $array = array('{"name":"作廢表_一","id":"4_1","pid":"3"}','{"name":"作廢表_二","id":"4_2","pid":"3"}','{"name":"作廢表_三","id":"4_3","pid":"3"}');
}

echo json_encode($array);

js代碼大部分都有注釋;詳細api可在zTree官網查看 進入官方api文檔 代碼運行需在服務器環境下運行;

最終栗子效果圖

zTree jQuery 樹插件的使用(實例講解)

以上這篇zTree jQuery 樹插件的使用(實例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女