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.

