jstree 使用-层次-搜索

本文档展示了如何使用jstree插件构建有层次的树形结构,并提供了具体的实现代码示例。通过该插件可以方便地为网页添加树形菜单功能,支持自定义搜索功能,帮助用户快速定位所需节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


jstree 中文帮助文档:http://blog.youkuaiyun.com/qq_24472595/article/details/70053863#search

创建后的没有层次的树如下

树的源码和树的结构如下:

 @At
    @Ok("json")
    @RequiresPermissions("o2omarket.ProcurementCar")
    public Object tree(@Param("pid") String pid) {
//      List<Cms_channel> list = cmsChannelService.query(Cnd.where("parentId", "=", Strings.sBlank(pid)).asc("location").asc("path"));
    	List<Shop> list = null;
    	if (pid != null && pid.toLowerCase().indexOf("shopsearch") != -1) {
    		if (pid.split(",") != null && pid.split(",").length > 1){
	    		SqlExpressionGroup e1 = Cnd.exps("fdShopName", "LIKE", "%" + pid.split(",")[1]+"%").and("1", "=", "1");
	    		list = shopService.query(Cnd.where(e1));
    		}
    		else 
    			list = shopService.query(Cnd.where("1","=","1"));
    	} 
    	else 
    		list = shopService.query(Cnd.where("1","=","1"));
        List<Map<String, Object>> tree = new ArrayList<>();
        for (Shop shop : list) {
            Map<String, Object> obj = new HashMap<>();
            obj.put("id", shop.getFdShopId());
            obj.put("text", shop.getFdShopName());
            tree.add(obj);
        }
        return tree;
    }    
<%
layout("/layouts/platform.html"){
%>
<script src="${base!}/assets/plugins/ueditor/ueditor.config.js"></script>
<script src="${base!}/assets/plugins/ueditor/ueditor.all.min.js"></script>
<header class="header navbar bg-white shadow">
    <div class="btn-group tool-button">
        <a id="fh" class="btn btn-primary navbar-btn" href="${base}/platform/o2omarket/procurementCar" data-pjax><i class="ti-angle-left"></i> 返回</a>
    </div>
    <div class="pull-right">
        <div class="btn-group tool-button">
            <button class="btn btn-primary navbar-btn" type="button" id="save"> 保存</button>
        </div>
    </div>
</header>

<div class="content-wrap">
    <div class="wrapper" style="min-height:500px;height: 100%;">
        <form id="addForm" role="form" class="form-horizontal parsley-form" data-parsley-validate
              action="${base}/platform/o2omarket/procurementCar/addDo" method="post">

                        <div class="col-lg-12">
                            <div class="form-group has-feedback">
                                <label for="storeId" class="col-sm-2 control-label">商家</label>

                                <div class="col-sm-8">
                                    <div class="input-group">
                                        <input id="storeId" type="text" class="form-control" placeholder="请选择商家" disabled
                                               value="<%if(!isEmpty(channel)){%>${channel.name}<%}%>" />

			                             		<span class="input-group-btn">
			                             			<button type="button" class="btn btn-primary" data-toggle="modal"
                                                            data-target="#dialogSelect"><i class="ti-plus"></i>选择
                                                    </button>
			                             		</span>
                                    </div>
                                    <input type="hidden" name="storeId" value="<%if(!isEmpty(channel)){%>${channel.id}<%}%>">
                                </div>
                            </div>
                        	
                        	<div class="form-group">
                            <label for="type" class="col-sm-2 control-label">车型</label>

                            <div class="col-sm-2">
                                <select class="form-control" name="vehicleTypeId" id="vehicleTypeId" onchange="getTypeName()">
                                    <option value="1" selected = "selected">轻型货车</option>
                                    <option value="2">中型货车</option>
                                    <option value="3">重型货车</option>
                                </select>
                            </div>
                            <input id="vehicleTypeName" name="vehicleTypeName" type="hidden">
                            
                        	</div>
                            <div class="form-group">
                                <label for="indicatorsName" class="col-sm-2 control-label">车牌</label>

                                <div class="col-sm-4">
                                    <input type="text" id="licensePlate" class="form-control" name="licensePlate" data-parsley-required="true"
                                           value="" placeholder="车牌号码">
                                </div>
                            </div>
                        	
                            <input type="hidden" name="regUserId" value="${userId!}">
                           <!--  <div class="form-group">
                                <label for="at" class="col-sm-2 control-label">时间</label>

                                <div class="col-sm-8 input-group date form_datetime " style="padding-left: 16px;padding-right: 16px;" data-date="1979-09-16T05:25:07Z" data-date-format="dd MM yyyy - HH:ii p" data-link-field="createAt">
                                    <input type="text" size="16" readonly class="form-control" value="${@date.getDateTime()}" data-parsley-required="true">
                                    <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
                                    <span class="input-group-addon"><span class="glyphicon glyphicon-th"></span></span>
                                </div>
                                <input type="hidden" id="createAt" name="createAt" value="${@date.getDateTime()}" />
                            </div> -->
                            <div class="form-group">
                                <label for="content" class="col-sm-2 control-label">备注</label>

                                <div class="col-sm-8">
                                    <textarea id="note" name="note" style="width:100%;height:200px;"></textarea>
                                </div>
                            </div>
                        </div>
        </form>
    </div>
</div>
<div id="dialogSelect" class="modal fade bs-modal-sm" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4 class="modal-title">选择商家</h4>
                <!-- Here add by William at 2018年3月1日11:15:26 ,where click "add shop" button,add searching function -->
				<div>
					<input id="searchShopId" type="text" class="form-control"
						placeholder="请要搜索的商家名称" /> 
						<span class="input-group-btn" style="padding:10px 0px">
							<button id="searchShopBt" type="button" class="btn btn-primary" >
								查询
							</button>
						</span>
				</div>
				
				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">取
						消</button>
					<button type="button" class="btn btn-primary" onclick="select()">确认选择</button>
				</div>
			</div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-xs-12">
                        <div id="jsTree" class="demo"></div>
                    </div>
                </div>
            </div>
            <div class="modal-footer" id="bootom_bts">
                <button type="button" class="btn btn-default" data-dismiss="modal">取 消</button>
                <button type="button" class="btn btn-primary" onclick="select()">确认选择</button>
            </div>
        </div>
    </div>
</div>
<script language="JavaScript">
	/* Here add by William at 2018年3月1日11:15:26 ,where click "add shop" button,add searching function */
 	$(document).ready(function() {
 		searching();
	});
	
	function searching() {
		$("#searchShopBt").click(function() {
			var tree = $("#jsTree");
			tree.jstree({ 'core': { data: null } });
			tree.jstree({ 'plugins': [ "wholerow", "json_data" ] });
			var inputVal = $("#searchShopId").val();
			//shopSearch , id 进行搜索
			var url = (inputVal === null || inputVal === undefined || inputVal === '') ? "${base}/platform/o2omarket/procurementCar/tree": "${base}/platform/o2omarket/procurementCar/tree?pid=" + ("shopSearch," + inputVal);
			$.get(url,function(data,status){
				//数据为空的话,提示没有这些搜索记录
				if ((data === null || data === undefined || data === '') || (data instanceof Array && data.length == 0)) {
					Toast.error("["+inputVal + "],搜索不到记录");
					return;
				}
				//记录数少的话,隐藏底部确认按钮
				if (data.length < 20) $('#bootom_bts').css({"display":"none"});
				else $('#bootom_bts').css({"display":"block"});
				tree.jstree(true).settings.core.data = data;
				tree.jstree(true).refresh();
			});
		});
	}
	/* Here add by William at 2018年3月1日11:15:26 ,where click "add shop" button,add searching function */
	

	function clearFile() {
		$("#img").html("");
		$("#queue").html("");
		$("#fileUrl").val("");
	}
	function initTreeView() {
		$("#jsTree").jstree(
			{
			plugins : [ "wholerow", "json_data" ],
			core : {
				data : {
					dataType : "json",
					url : function(node) {
						return node.id === "#" ? "${base}/platform/o2omarket/procurementCar/tree"
								: "${base}/platform/o2omarket/procurementCar/tree?pid="
										+ node.id
					}
				},
				multiple : false
			}
			}).on("dblclick.jstree", function(node) {
				select();
			});
	}
	//选择父菜单
	function select() {
		var tree = $.jstree.reference("#jsTree");
		var node = tree.get_selected(true);
		$("#addForm #storeId").val(node[0].text);
		$("#addForm input[name='storeId']").val(node[0].id);
		$("#dialogSelect").modal("hide");
	}
	var ue;
	$(document).ready(function() {
		setTimeout(function() {
			ue = new baidu.editor.ui.Editor();
			ue.render('note');
		}, 500);
		myForm.init();
		$('.form_datetime').datetimepicker({
			language : 'zh-CN',
			format : 'yyyy-mm-dd hh:ii:ss',
			weekStart : 1,
			todayBtn : 1,
			autoclose : 1,
			todayHighlight : 1,
			startView : 2,
			forceParse : 0,
			showMeridian : 1
		});
		initTreeView();
		$("#save").on("click", function() {
			$("#footer_content").val(ue.getContent());
			$('#addForm').submit();
		});
		$('#addForm').ajaxForm({
			dataType : 'json',
			beforeSubmit : function(arr, form, options) {
				sublime.showLoadingbar($(".main-content"));
			},
			success : function(data, statusText, xhr, form) {
				if (data.code == 0) {
					Toast.success(data.msg);
					$("#fh").trigger("click");
				} else {
					Toast.error(data.msg);
				}
				sublime.closeLoadingbar($(".main-content"));
			}
		});

	});
	function getTypeName() {
		var vehicleTypeName = $('#vehicleTypeId option:selected').text();//选中的文本
		$("#vehicleTypeName").val(vehicleTypeName);
	}
</script>


<%}%>




创建有层次的树如下:


<% layout("/layouts/platform.html"){ %>
<script src="${base!}/assets/plugins/ueditor/ueditor.config.js"></script>
<script src="${base!}/assets/plugins/ueditor/ueditor.all.min.js"></script>
<header class="header navbar bg-white shadow">
	<div class="btn-group tool-button">
		<a id="fh" class="btn btn-primary navbar-btn"
			href="${base}/platform/o2omarket/monthWarranty" data-pjax><i
			class="ti-angle-left"></i> 返回</a>
	</div>
	<div class="pull-right">
		<div class="btn-group tool-button">
			<button class="btn btn-primary navbar-btn" type="button" id="save">
				保存</button>
		</div>
	</div>
</header>

<div class="content-wrap">
	<div class="wrapper" style="min-height: 500px; height: 100%;">
		<form id="addForm" role="form" class="form-horizontal parsley-form"
			data-parsley-validate
			action="${base}/platform/o2omarket/monthWarranty/addDo" method="post">

			<div class="col-lg-12">
				<div class="form-group has-feedback">
					<label for="storeId" class="col-sm-2 control-label">商家</label>

					<div class="col-sm-8">
						<div class="input-group">
							<input id="storeId" type="text" class="form-control"
								placeholder="请选择商家" disabled value="" /> <span
								class="input-group-btn">
								<button type="button" class="btn btn-primary"
									data-toggle="modal" data-target="#dialogSelect">
									<i class="ti-plus"></i>选择
								</button>
							</span>
						</div>
						<input type="hidden" name="storeId" value="">
					</div>
				</div>

				<div class="form-group">
					<label for="indicatorsName" class="col-sm-2 control-label">车型品牌</label>

					<div class="col-sm-4">
						<input type="text" id="vehicleBrand" class="form-control"
							name="vehicleBrand" data-parsley-required="true" value=""
							placeholder="车品牌">
					</div>
				</div>
				<div class="form-group">
					<label for="indicatorsName" class="col-sm-2 control-label">车牌</label>

					<div class="col-sm-4">
						<input type="text" id="licensePlate" class="form-control"
							name="licensePlate" data-parsley-required="true" value=""
							placeholder="车牌号码">
					</div>
				</div>

				<input type="hidden" name="regUserId" value="${userId!}">
				<div class="form-group">
					<label for="at" class="col-sm-2 control-label">开始时间</label>

					<div class="col-sm-8 input-group date form_datetime "
						style="padding-left: 16px; padding-right: 16px;"
						data-date="1979-09" data-date-format="yyyy-mm"
						data-link-field="startDate">
						<input type="text" size="16" readonly class="form-control"
							value="${@date.getDate()}" data-parsley-required="true">
						<span class="input-group-addon"><span
							class="glyphicon glyphicon-remove"></span></span> <span
							class="input-group-addon"><span
							class="glyphicon glyphicon-th"></span></span>
					</div>
					<input type="hidden" id="startDate" name="startDate"
						value="${@date.getDate()}" />
				</div>

				<div class="form-group">
					<label for="type" class="col-sm-2 control-label">月数</label>
					<div class="col-sm-2">
						<select class="form-control" name="months" id="months">
							<option value="1">1个月</option>
							<option value="2">2个月</option>
							<option value="3">3个月</option>
							<option value="4">4个月</option>
							<option value="5">5个月</option>
							<option value="6">6个月</option>
							<option value="7">7个月</option>
							<option value="8">8个月</option>
							<option value="9">9个月</option>
							<option value="10">10个月</option>
							<option value="11">11个月</option>
							<option value="12">12个月</option>
						</select>
					</div>
				</div>

				<div class="form-group">
					<label for="content" class="col-sm-2 control-label">备注</label>

					<div class="col-sm-8">
						<textarea id="note" name="note"
							style="width: 100%; height: 200px;"></textarea>
					</div>
				</div>
			</div>
		</form>
	</div>
</div>
<div id="dialogSelect" class="modal fade bs-modal-sm" tabindex="-1"
	role="dialog" aria-hidden="true">
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal"
					aria-hidden="true">×</button>
				<h4 class="modal-title">选择商家</h4>
				<!-- Here add by William at 2018年3月1日11:15:26 ,where click "add shop" button,add searching function -->
				<div>
					<input id="searchShopId" type="text" class="form-control"
						placeholder="请要搜索的商家名称" /> 
						<span class="input-group-btn" style="padding:10px 0px">
							<button id="searchShopBt" type="button" class="btn btn-primary" >
								查询
							</button>
						</span>
				</div>
				
				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">取
						消</button>
					<button type="button" class="btn btn-primary" onclick="select()">确认选择</button>
				</div>
			</div>
			<div class="modal-body">
				<div class="row">
					<div class="col-xs-12">
						<div id="jsTree" class="demo"></div>
					</div>
				</div>
			</div>
			<div class="modal-footer"  id="bootom_bts">
				<button type="button" class="btn btn-default" data-dismiss="modal">取
					消</button>
				<button type="button" class="btn btn-primary" onclick="select()">确认选择</button>
			</div>
		</div>
	</div>
</div>
<script language="JavaScript">
	/* Here add by William at 2018年3月1日11:15:26 ,where click "add shop" button,add searching function */
		$(document).ready(function() {
			searching();
	});
	
	function searching() {
		$("#searchShopBt").click(function() {
			var tree = $("#jsTree");
			tree.jstree({ 'core': { data: null } });
			tree.jstree({ 'plugins': [ "wholerow", "json_data" ] });
			var inputVal = $("#searchShopId").val();
			//shopSearch , id 进行搜索
			var url = (inputVal === null || inputVal === undefined || inputVal === '') ? "${base}/platform/o2omarket/monthWarranty/tree?pid=-99": "${base}/platform/o2omarket/monthWarranty/tree?pid=" + ("shopSearch," + inputVal)+"&site=''";
			$.get(url,function(data,status){
				//数据为空的话,提示没有这些搜索记录
				if ((data === null || data === undefined || data === '') || (data instanceof Array && data.length == 0)) {
					Toast.error("["+inputVal + "],搜索不到记录");
					return;
				}
				//记录数少的话,隐藏底部确认按钮
				if (data.length < 20) $('#bootom_bts').css({"display":"none"});
				else $('#bootom_bts').css({"display":"block"});
				tree.jstree(true).settings.core.data = data;
				tree.jstree(true).refresh();
			});
		});
	}
	/* Here add by William at 2018年3月1日11:15:26 ,where click "add shop" button,add searching function */
	function clearFile() {
		$("#img").html("");
		$("#queue").html("");
		$("#fileUrl").val("");
	}
	function initTreeView() {
		$("#jsTree")
				.jstree(
						{
							plugins : [ "wholerow", "json_data" ],
							core : {
								data : {
									dataType : "json",
									url : function(node) {
										//alert(JSON.stringify(node));
										var txt_site="";//$("#txt_site").val();
										return node.id === "#" ? "${base}/platform/o2omarket/monthWarranty/tree"
												: "${base}/platform/o2omarket/monthWarranty/tree?pid="
														+ node.id+"&site="+txt_site;
									}
								},
								multiple : false
							}
						}).on("dblclick.jstree", function(node) {
					select();
				});
	}
	//选择父菜单
	function select() {
		var tree = $.jstree.reference("#jsTree");
		var node = tree.get_selected(true);
		$("#addForm #storeId").val(node[0].text);
		$("#addForm input[name='storeId']").val(node[0].id);
		$("#dialogSelect").modal("hide");
	}
	var ue;
	$(document).ready(function() {
		setTimeout(function() {
			ue = new baidu.editor.ui.Editor();
			ue.render('note');
		}, 500);
		myForm.init();
		$('.form_datetime').datetimepicker({
			language : 'zh-CN',
			format : 'yyyy-mm',
			weekStart : 1,
			todayBtn : 1,
			autoclose : 1,
			todayHighlight : 1,
			startView : 4,
			minView : 3,
			forceParse : 1,
			showMeridian : 1
		});
		initTreeView();
		$("#save").on("click", function() {
			$("#footer_content").val(ue.getContent());
			$('#addForm').submit();
		});
		$('#addForm').ajaxForm({
			dataType : 'json',
			beforeSubmit : function(arr, form, options) {
				sublime.showLoadingbar($(".main-content"));
			},
			success : function(data, statusText, xhr, form) {
				if (data.code == 0) {
					Toast.success(data.msg);
					$("#fh").trigger("click");
				} else {
					Toast.error(data.msg);
				}
				sublime.closeLoadingbar($(".main-content"));
			}
		});
		$("#txt_site").change(function(){
			//var txt_site=$("#txt_site").val();
			$('#jsTree').jstree(true).search($('#txt_site').val()); 
			});
	});
</script>


<%}%>
@At
	@Ok("json")
	@RequiresPermissions("o2omarket.monthWarranty")
	public Object tree(@Param("pid") String pid ,@Param("site") String site) {
		List<Map<String, Object>> tree = new ArrayList<>();
		// List<Cms_channel> list =
		// cmsChannelService.query(Cnd.where("parentId", "=",
		// Strings.sBlank(pid)).asc("location").asc("path"));
		// List<Shop> list = shopService.query(Cnd.where("1","=","1"));
		if (StringUtils.isBlank(pid)) {
			List<BU_Floor> list = bu_FloorService.query(Cnd.NEW().asc("fdFlooSort"));
			for (BU_Floor shop : list) {
				Map<String, Object> obj = new HashMap<>();
				obj.put("id",  shop.getFdFlooId());
				obj.put("text", shop.getFdFlooName());
			    obj.put("children", true);
				tree.add(obj);
			}
		} else {
			Cnd cnd = null;
			//-99无意义,仅为空字符串查询全部数据而已 modify by william
			if (!pid.equalsIgnoreCase("-99")) 
				cnd=Cnd.where("fdShopFloor", "=", pid);
			else 
				cnd=Cnd.where("1","=" ,"1");
			
			//cnd.desc("licensePlate");
			if(StringUtils.isNotBlank(site))
			{
				cnd=cnd.and("fdShopNum","like" ,"%"+site+"%");
			}
			/*List<View_MonthWarrantyShop> list = viewMonthWarrantyShopService
					.query(cnd.desc("licensePlate").asc("fdShopNum"));*/
			List<View_MonthWarrantyShop> list = null;
	    	if (pid != null && pid.toLowerCase().indexOf("shopsearch") != -1) {
	    		if (pid.split(",") != null && pid.split(",").length > 1 && !StringUtils.isEmpty(pid.split(",")[1])){
		    		SqlExpressionGroup e1 = Cnd.exps("fdShopName", "LIKE", "%" + pid.split(",")[1]+"%").and("1", "=", "1");
		    		list = viewMonthWarrantyShopService.query(Cnd.where(e1));
	    		}
	    		else 
	    			list = viewMonthWarrantyShopService.query(cnd.desc("licensePlate").asc("fdShopNum"));
	    	} 
	    	else 
	    		list = viewMonthWarrantyShopService.query(cnd.desc("licensePlate").asc("fdShopNum"));
	    	// modify by william
			for (View_MonthWarrantyShop shop : list) {
				Map<String, Object> obj = new HashMap<>();
				obj.put("id", shop.getFdShopId());
				obj.put("text", shop.getFdShopName()
						+ (StringUtils.isBlank(shop.getFdShopNum()) ? "" : ("(" + shop.getFdShopNum() + ")"))
						+ (StringUtils.isBlank(shop.getLicensePlate()) ? "" : ("[" + shop.getLicensePlate() + "]")));
				 obj.put("children", false);
				tree.add(obj);
			}
		}
		return tree;
	}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值