This JavaScript code snippet helps you to create treeview navigation with a search box. It gets JSON format data and renders a filterable treeview dynamically. Moreover, it displays base64-based icons for files and folders/directories.
How to Create JavaScript Treeview with Search
1. First of all, create the HTML structure for the treeview as follows:
<div class="container"> <div class='widget'> <input placeholder="filter..." id="filterInput" oninput="solve()" type="text"/> <div id="folders"></div> </div> </div>
2. After that, style the treeview navigation using the following CSS styles.
body { margin-top: 20px; background-color: #ECEFF1; } .widget { padding: 18px; background-color: #fff; box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12), 0 1px 4px rgba(0, 0, 0, 0.24); } .widget > input { display: block; width: 100%; min-height: 30px; margin-bottom: 20px; border: 0 none; border-bottom: 1px solid #ccc; outline: none; } .folder-container { margin: 10px; padding: 0 20px; margin: 0; } .folder-wrapper { margin: 0; padding: 0; list-style-type: none; } .file-item, .folder-item { margin-left: -16px; padding-left: 20px; list-style-type: none; } .file-item { background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAsUlEQVQ4T2NkgIKE2q4DMDZW+j+jAgPj//0LmssSkeUZEQZ0/1/QXArnoxuSUNPdwMDIEMDwn2HDgpbSBpg8aQYw/H/PwMCQwMDIMHFBc9kCkCGkGODAwMAAwiBd9TDXYhiQUNtdwPCfgR97ePy7uKClfENCLcK7RLsA2UC8BoADi4HhP44YObigpfTAsHfBgMcC3vwAzze0TAcUuKDrAMN/RlwJCNVcRoaPC5pLA0CCALOMnRHTr6OKAAAAAElFTkSuQmCC') no-repeat left center; } .folder-item { font-weight: bold; background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA6UlEQVQ4T62TvQ3CMBCF31OgDxPACGwATAAjeAOgSKpECgoCiRTABmYDNgA2yAawAUpNwiGHH0GBlATcuPH3vbPvTPy4+COPXKCCpY30sgORPIU6dLtF5FTeYgWgA2KtQ1fnQj8amQ2C81fJVcZ65sZUfhTr0GmrYN5iZjWLpIqwC0oLVjah8hd7WPUBsvQIwC4ieD9zFwgDELuyMCCHuwDcAliWFgg2jwoQgxxWEDzeICfZqSDoPa9QHjZpVq1B5UUnEIXa91GhSKKnrm3mQEqXngNyMNNqBKYD/QqSsQ6d1X8+U4X0F3IDjRRPOikDqHUAAAAASUVORK5CYII=') no-repeat left center; }
3. Finally, functionalize the treeview navigation with JavaScript.
const folders = { type: 'dir', name: 'app', children: [ { type: 'file', name: 'index.html' }, { type: 'dir', name: 'js', children: [ { type: 'file', name: 'main.js' }, { type: 'file', name: 'app.js' }, { type: 'file', name: 'misc.js' }, { type: 'dir', name: 'vendor', children: [ { type: 'file', name: 'jquery.js' }, { type: 'file', name: 'underscore.js' } ] } ] }, { type: 'dir', name: 'css', children: [ { type: 'file', name: 'reset.css' }, { type: 'file', name: 'main.css' } ] } ] }; function displayJsonTree( data) { var htmlRetStr = "<ul class='folder-container'>"; for (var key in data) { if (typeof(data[key])== 'object' && data[key] != null) { htmlRetStr += displayJsonTree( data[key] ); htmlRetStr += '</ul></li>'; } else if(data[key]=='dir'){ htmlRetStr += "<li class='folder-item'>" + data["name"]+"</li><li class='folder-wrapper'>"; } else if( key=='name' && data['type']!='dir' ){ htmlRetStr += "<li class='file-item'>" + data['name']+"</li>"; } } return( htmlRetStr ); } function filterJson(data,string) { arr = []; for (var key in data) if (typeof(data[key]) == 'object' && data[key] != null) { if (data['name'].indexOf(string) <= -1) { for (var i = 0; i < data.children.length; i++) { arr=arr.concat(filterJson(data.children[i], string)); } return arr; } } else { if (data['name'].indexOf(string) > -1) { arr = arr.concat(data); return arr; } } } document.getElementById("folders").innerHTML= displayJsonTree(folders); function solve() { var toSearch=document.getElementById('filterInput').value; if(toSearch.length==0){ document.getElementById("folders").innerHTML= displayJsonTree(folders); } else { var str = "Searching for: " + document.getElementById('filterInput').value + "\n"; document.getElementById("folders").innerHTML = str + displayJsonTree(filterJson(folders, document.getElementById('filterInput').value)); } }
That’s all! hopefully, you have successfully integrated this JavaScript treeview navigation into your project. If you have any questions or facing any issues, feel free to comment below.
Similar Code Snippets:
I code and create web elements for amazing people around the world. I like work with new people. New people new Experiences.
I truly enjoy what I’m doing, which makes me more passionate about web development and coding. I am always ready to do challenging tasks whether it is about creating a custom CMS from scratch or customizing an existing system.