算法 --- 遞歸實現多級樹展開結構

說明

  • 先根據數據渲染,然后再實現事件

渲染

  • 在項目中,經常會給出一個深度不確定的數組,數字結構如下:
data = [{name: 'a', child:[{name: 'a1'},{name: 'a2', child: [{name:'a21'}]}]},{name: 'b'}
]
  • 要求將數組渲染成對應的目錄結構, 結構如下:
<ul><li>a<ul><li>a1</li><li>a2<ul><li>a21</li></ul></li></ul></li><li>b</li>
</ul>
  • 思路,先對數組中的第一級數據顯示出來
$(function(){var str = '<ul>';for(var i=0; i< data.length; i++){str += `<li>${data[i].name}</li>`}str += '</ul>';$('.tree').html(str)
})

此時頁面結構如下:

在這里插入圖片描述

  • 下面嘗試將頁面結構渲染成如下
<div class="tree"><ul><li>a<ul><li>a1</li><li>a2</li></ul></li>	<li>b</li></ul>
</div>
  • 嘗試寫第二級元素.
// 首先判斷第一級是否含有第二級元素
if(data[i].child){var str = '<ul>';for(let var j =0; i<data.[i].child.length; j++){str += `<li>${data[i].child[j].name}</li>`}str += "</ul>";$('ul').html(str)
}
  • 可以發現.第二級的過程和第一級的過程是一樣的.因此嘗試使用遞歸如下:
$(function(){function f(data){var str = '<ul>'for(let i =0; i<data.length; i++){if(data[i].child){// 含有孩子元素, 應該渲染成 <ul><li>a<ul><li>a1</li></ul></li></ul>的結構str += `<li>${data[i].name}`str += f(data[i].child)str += "</li>"} else {str += `<li>${data[i].name}</li>`}}str += "</ul>"return str}$(".lists").html(f(data))
})

在這里插入圖片描述

  • 完成

添加事件

  • 有時候左邊的導航欄需要可以點擊…
  • 即,點擊左側的按鈕, 導航欄可以進行收縮…
    在這里插入圖片描述
  • 實現很簡單.
  • 在每個li下面添加一個span標簽,利用jQuery的隱式迭代規則,給每個span標簽添加一個點擊事件.當鼠標點擊上去的時候,判斷當前span元素的兄弟元素是否有子元素
  • 如果有就證明當前是可以展開的,否則不能展開
  • 如果可以展開,則獲取span中的內容.如果是-, 則將其變為+并隱藏它的兄弟元素,
  • 如果是+,則當前的span變為-,并顯示其兄弟元素.

你可能用到的API

  • 監聽類tree下所有span的點擊事件
  • 獲取當前被點擊的對象
#('.tree li span').click(function(){// 獲取當前被點擊的對象console.log($(this))
})
  • 獲取當前元素的兄弟元素ul
  • 判斷該兄弟元素(ul)是否為空
$(this).siblings('ul')
if(this.siblings('ul').length == 0){console.log('不能展開')
} else{console.log('可以展開');
}
  • 改變當前span中的內容
if($(this).html() == '-'){$(this).html('+')
} else {$(this).html('-')
}

總體代碼

  • 樣式代碼
ul li span {display: inline-block;width: 15px;height: 15px;color: red;margin-right: 10px;border: 1px solid #1890ff;line-height: 15px;text-align: center;vertical-align: middle;border-radius: 50%;cursor: default;
}li {list-style-type: none;
}li span:hover{cursor: pointer;
}
  • html代碼
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>無限級目錄樹</title><link rel="stylesheet" href="public/css/15.css" /><script type="text/javascript" src="public/js/jquery.min.js"></script></head><body><div class="tree"></div><script type="text/javascript" src="public/js/15.js"></script></body>
</html>
  • js代碼
data = [{name: 'a', child:[{name: 'a1'},{name: 'a2', child: [{name:'a21'}]},{name: 'a3', child: [{name: 'a31'},{name: 'a32'},{name: 'a33'},{name: 'a34', child: [{name: 'a341'},{name: 'a342'},{name: 'a343'},{name: 'a344'}]}]}]},{name: 'b'},{name: 'c'}
]
$(function() {function g(data) {var str = '<ul>'for (var i = 0; i < data.length; i++) {if (data[i].child) {str += `<li><span>-</span>${data[i].name}`str += g(data[i].child);str += "</li>"} else {str += `<li><span>-</span>${data[i].name}</li>`}}str += '</ul>'return str}// 渲染dom結構$('.tree').html(g(data))// 渲染完成后,給li下面的span添加點擊事件$('.tree li span').click(function(){if($(this).siblings('ul').length >0){console.log('可以展開')if($(this).html() == '-'){$(this).html('+')$(this).siblings('ul').hide()} else {$(this).html('-');$(this).siblings('ul').show();}} else {console.log('不能展開')}})})

參考

源代碼

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

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

相關文章

PYTHON自動化Day4-交換變量,字符串方法,拷貝,集合,文件,文件指針

一.判斷 # 非空即真、非0即真 # 不為空的話就是true&#xff0c;是空的話就是false # 只要不是0就是true&#xff0c;是0就是false# 布爾類型 # True False name input(請輸入你的名字&#xff1a;).strip() a [] #false d{} # false c 0 #false f tuple() #false e #fa…

Ajax-jsonp

一、什么是Jsonp jsonp(json with padding) 是一種“使用模式”&#xff0c;可以讓網頁從別的域名那獲取資料&#xff0c;即跨域讀取數據。 為什么會使用jsonp呢&#xff1f;因為同源策略&#xff08;數據來源一致&#xff09;&#xff0c;現在所有支持javascript 的瀏覽器都會…

javascript --- [讀書筆記] 回流與重繪 前端優化小結

1. 瀏覽器渲染原理 請說出: 從用戶在瀏覽器地址輸入網址,到看整個頁面,中間都發生了哪些事情? HTTP請求階段HTTP響應階段瀏覽器渲染階段 1.1 可能用到的知識 1.1.1 進程 Process、線程 Thread、 棧內存 Stack 進程: 就是開的每一個程序: QQ、網易云音樂、Typora、VSCode……

ARP協議,以及ARP欺騙

1.定義&#xff1a; 地址解析協議&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的所有主機&#xff0c;并接收返回消息&#xff0c;以此…

css --- [小結]讓盒子水平垂直居中的解決方案

描述 有如下模型,想辦法讓 <style>.box{width: 500px;height: 500px;background: skyblue;} </style> <div class"box"><div class"inner"></div> </div>想辦法讓inner在box中水平垂直居中 方案1: 使用絕對定位 讓…

數組洗牌 Fisher Yates

看播放器代碼時發現的這個洗牌算法&#xff0c;再網上查了一番 作用是把數組變成隨機序列&#xff0c;原理類似于從牌堆A中隨機抽牌放進牌堆B 代碼1&#xff1a; 返回一個由&#xff08;數組下標&#xff09;組成的數組 function random(length) {function shuffle (arr) {for…

一個不錯的MYSQL數據庫備份類,PHP版,一個文件,精簡版

1 <?php2 class DbManage {3 var $db; // 數據庫連接4 var $database; // 所用數據庫5 var $sqldir; // 數據庫備份文件夾6 // 換行符7 private $ds "\n";8 // 存儲SQL的變量9 public $sqlContent "";10 // 每條sql…

javascript --- 堆棧內存與閉包的作用

你可能會用到的 堆內存: 存儲引用類型值所在的空間棧內存: 存儲基本類型值和存儲代碼所在空間函數上下文: JS每一個函數在執行的時候都會創建一個執行上下文 1. 堆內存中的數字和字符串都是相等的 let a {}, b0, c0; a[b] marron; a[c] Mar console.log(a[b]) // Mar第一…

python_sting字符串的方法及注釋

string類型是python內置的類型&#xff0c;無需安裝 方法/屬性說明 capitalize() 把字符串的第一個字符改為大寫 casefold() 把整個字符串的所有字符改為小寫 center(width) 將字符串居中&#xff0c;并使用空格填充至長度width的新字符串 count(sub[,start[,end]]) …

作業3

import turtle turtle.bgcolor(red) turtle.color(yellow)turtle.fillcolor(yellow) turtle.begin_fill() for i in range(5):turtle.forward(100)turtle.right(144) turtle.end_fill() turtle.done()轉載于:https://www.cnblogs.com/zhangkef97/p/9016608.html

javascript --- [小練習]變量提升、優先級綜合

求下列函數輸出結果 function Foo() {getName function() {console.log(1)}return this } Foo.getName function() {console.log(2) } Foo.prototype.getName function() {console.log(3) } var getName function() {console.log(4) }function getName() {console.log(5) …

Confluence 6 自定義 Decorator 模板的宏和針對高級用戶

宏 頁面的某些部分使用的是 Velocity 宏進行創建的&#xff0c;包括導航欄。有關宏的創建&#xff0c;你可以參考頁面 Working With Decorator Macros 頁面中的內容。 針對高級用戶 velocity 目錄是 Confluence 首先進行模板搜索的查找路徑。你可以對 Confluence 的 velocity …

Matlab之rand(), randn(), randi()函數的使用方法

1. rand()函數用于生成取值在&#xff08;0~1&#xff09;之間均勻分布的偽隨機數。rand(n)&#xff1a;生成n*n的0~1之間的滿足均勻分布的偽隨機矩陣&#xff1b;rand(m,n)&#xff1a;生成m*n的偽隨機數&#xff1b;rand(m,n,double)&#xff1a;生成m*n的雙精度偽隨機數&am…

javascript --- [有趣的條件]雙等號的隱式調用和數據劫持

1 雙等號的隱式調用和數據劫持 求下面條件,在a為什么樣時,等號成立 if(a 1 && a 2 && a 3){console.log(等號成立) }1.1 雙等號的隱式轉換 首先得了解雙等號的隱式轉換規則 等式備注對象 字符串隱式調用 toString方法將對象轉換成字符串null undeifne…

分組查詢

1、簡單分組查詢 語法形式&#xff1a; select function() from table_name where condition group by field; 進行分組查詢時&#xff0c;分組所依據的字段上的值一定要有重復值&#xff0c;否則分組沒有任何意義。 2、實現統計功能分組查詢 關鍵字group by單獨使用時&#xf…

深入探討多模態模型和計算機視覺

近年來&#xff0c;機器學習領域在從圖像識別到自然語言處理的不同問題類型上取得了顯著進展。然而&#xff0c;這些模型中的大多數都對來自單一模態的數據進行操作&#xff0c;例如圖像、文本或語音。相比之下&#xff0c;現實世界的數據通常來自多種模態&#xff0c;例如圖像…

移動硬盤函數不正確要如何尋回資料

移動磁盤打不開函數不正確&#xff0c;是因為這個I盤的文件系統內部結構損壞導致的。要恢復里面的數據就必須要注意&#xff0c;這個盤不能格式化&#xff0c;否則數據會進一步損壞。具體的恢復方法看正文 工具/軟件&#xff1a;AuroraDataRecovery 步驟1&#xff1a;先百度搜索…

vue --- [全家桶]vue-router

1. Vue - router Vue Router是 Vue.js 官方的路由管理器它和Vue.js的核心深度集成,可以非常方便的用于SPA應用程序的開發 Vue Router包含的功能有: 支持HTML5歷史模式或hash模式支持嵌套路由支持路由參數支持編程式路由支持命名路由 <div id"app"><rout…

HashMap的四種訪問方式

第一種&#xff1a;通過Map.entrySet使用iterator遍歷key和value 1 public void visit_1(HashMap<String,Integer> hm){ 2 Iterator<Map.Entry<String,Integer>> it hm.entrySet().iterator(); 3 while(it.hasNext()){ 4 Map.Entry<String ,Integer> …

16.unix網絡編程一卷 unp.h

unix網絡編程 --ubuntu下建立編譯環境 1.安裝編譯器&#xff0c;安裝build-essential sudo apt-get install build-essential 2.下載本書的頭文件 下載unp13e&#xff1a; http://pix.cs.olemiss.edu/csci561/prg561.1.html 3.進入unp13e 查看readme&#xff0c;照下列提示操作…