Baru-baru ini, kerana kerja saya memerlukan komponen kotak drop-down pokok, selepas menyemak maklumat, secara amnya terdapat dua cara untuk melaksanakannya. Satu ialah menggunakan zTree untuk melaksanakannya; yang lain ialah menggunakan easyUI untuk melaksanakannya. Oleh kerana bahagian hadapan syarikat tidak direka bentuk menggunakan easyUI, saya memilih zTree untuk melaksanakan pepohon lungsur turun.
Format data ringkas (iaitu format Json mudah) digunakan di sini, serupa dengan Json berikut:
var zNodes =[ {id:1, pId:0, name:"北京"}, {id:2, pId:0, name:"天津"}, {id:3, pId:0, name:"上海"}, {id:6, pId:0, name:"重庆"}, {id:4, pId:0, name:"河北省", open:true, nocheck:true}, {id:41, pId:4, name:"石家庄"}, {id:42, pId:4, name:"保定"}, {id:43, pId:4, name:"邯郸"}, {id:44, pId:4, name:"承德"}, {id:5, pId:0, name:"广东省", open:true, nocheck:true}, {id:51, pId:5, name:"广州"}, {id:52, pId:5, name:"深圳"}, {id:53, pId:5, name:"东莞"}, {id:54, pId:5, name:"佛山"}, {id:6, pId:0, name:"福建省", open:true, nocheck:true}, {id:61, pId:6, name:"福州"}, {id:62, pId:6, name:"厦门"}, {id:63, pId:6, name:"泉州"}, {id:64, pId:6, name:"三明"} ];
Di sini kita memerlukan kacang entiti untuk merangkum data ditemui yang sepadan, seperti berikut:
public class ZtreeNode { // id private String id; // 父id private String pId; // 显示名称 private String name; // 是否打开 (这里默认是不打开的,如果需要打开,设为true) // private boolean open ; // 能否选择 (设置节点是否能够选择,默认都能选择,设为true对应的节点不能选择) // private boolean nocheck ; /**getter and setter*/ }
Apa yang perlu diperhatikan di sini ialah huruf kedua dalam pId adalah huruf besar Jika ia ditulis dalam huruf kecil, ia tidak boleh dibina menjadi struktur pokok, dan semuanya adalah nod akar.
Kemudian, data yang diambil daripada pangkalan data ditukar kepada kacang yang diperlukan oleh ztree yang sepadan, dan kemudian ditukar kepada Json yang sepadan Kodnya adalah seperti berikut:
// 获取商品分类树 返回json public String getGoodsCategoryTreeJson() { List<GoodsCategory> allGoodsCategoryList = goodsCategoryService.getGoodsCategoryTreeJson() ; List<ZtreeNode> ztreelist = new ArrayList<ZtreeNode>(); for(GoodsCategory gcty : allGoodsCategoryList){ ZtreeNode treenade = new ZtreeNode(); treenade.setId(gcty.getId()); treenade.setpId(gcty.getParent()==null?"":gcty.getParent().getId()); treenade.setName(gcty.getName()); ztreelist.add(treenade); } return ajax(ztreelist); }
Tukar senarai kepada kaedah Json yang sepadan, seperti berikut:
Kit alat Json digunakan:
import org.springframework.base.util.JsonUtil; private static final String HEADER_ENCODING = "UTF-8"; private static final boolean HEADER_NO_CACHE = true; private static final String HEADER_TEXT_CONTENT_TYPE = "text/plain"; private static final String HEADER_JSON_CONTENT_TYPE = "text/plain"; // AJAX输出 protected String ajax(String content, String contentType) { try { HttpServletResponse response = initResponse(contentType); response.getWriter().write(content); response.getWriter().flush(); } catch (IOException e) { e.printStackTrace(); } return NONE; } // 根据文本内容输出AJAX protected String ajax(String text) { return ajax(text, HEADER_TEXT_CONTENT_TYPE); } // 根据操作状态输出AJAX protected String ajax(Status status) { HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE); Map<String, String> jsonMap = new HashMap<String, String>(); jsonMap.put(STATUS_PARAMETER_NAME, status.toString()); JsonUtil.toJson(response, jsonMap); return NONE; } // 根据操作状态、消息内容输出AJAX protected String ajax(Status status, String message) { HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE); Map<String, String> jsonMap = new HashMap<String, String>(); jsonMap.put(STATUS_PARAMETER_NAME, status.toString()); jsonMap.put(MESSAGE_PARAMETER_NAME, message); JsonUtil.toJson(response, jsonMap); return NONE; } // 根据Object输出AJAX protected String ajax(Object object) { HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE); JsonUtil.toJson(response, object); return NONE; } // 根据boolean状态输出AJAX protected String ajax(boolean booleanStatus) { HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE); Map<String, Object> jsonMap = new HashMap<String, Object>(); jsonMap.put(STATUS_PARAMETER_NAME, booleanStatus); JsonUtil.toJson(response, jsonMap); return NONE; } private HttpServletResponse initResponse(String contentType) { HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType(contentType + ";charset=" + HEADER_ENCODING); if (HEADER_NO_CACHE) { response.setDateHeader("Expires", 1L); response.addHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache, no-store, max-age=0"); } return response; }
Dengan cara ini, data yang diperlukan oleh kaunter penerimaan tetamu dikeluarkan dari perpustakaan dan dimasukkan ke dalam Json yang sepadan.
Langkah seterusnya ialah melaksanakan bahagian hadapan Js dan css yang perlu diimport oleh bahagian hadapan adalah seperti berikut:
<link rel="stylesheet" href="${base}/template/ztree/css/demo.css" type="text/css"> <link rel="stylesheet" href="${base}/template/ztree/css/zTreeStyle/zTreeStyle.css" type="text/css"> <script type="text/javascript" src="${base}/template/ztree/js/jquery.ztree.core.js"></script>
Hanya demo.css di sini ditambah oleh saya sendiri, yang lain dirumus secara rasmi demo.css diubah suai daripada css yang digunakan dalam demo rasmi, seperti berikut (terdapat gaya berlebihan di sini yang belum dipadamkan). >
div.content_wrap {width: 400px;} div.content_wrap div.left{float: left;} div.content_wrap div.right{float: right;width: 340px;} div.zTreeDemoBackground {text-align:left;} ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #fefefe;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;} ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;} ul.log.small {height:45px;} ul.log li {color: #666666;list-style: none;padding-left: 10px;} ul.log li.dark {background-color: #E3E3E3;} /* ruler */ div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer} div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer}
<div class="content_wrap"> <div class="zTreeDemoBackground left"> <input id="citySel" class="formText" type="text" onclick="showMenu(); return false;" readonly value="" style="width:150px;"/> <input id="treeids" type="hidden" name="goods.goodsCategory.id" > <input type="button" onclick="showMenu();" value="∨"> </div> </div> 8<div id="menuContent" class="menuContent" style="display:none; position: absolute;"> <ul id="treeDemo" class="ztree" style="margin-top:0;"></ul> </div>
Skrip yang sepadan adalah seperti berikut:
<SCRIPT type="text/javascript"> var setting = { view: { dblClickExpand: false }, data: { simpleData: { enable: true } }, callback: { onClick: onClick }, view: { // 不显示对应的图标 showIcon: false } }; function onClick(e, treeId, treeNode) { var zTree = $.fn.zTree.getZTreeObj("treeDemo"), nodes = zTree.getSelectedNodes(), v = ""; ids = ""; nodes.sort(function compare(a,b){return a.id-b.id;}); for (var i=0, l=nodes.length; i<l; i++) { v += nodes[i].name + ","; ids += nodes[i].id + ","; } if (v.length > 0 ) v = v.substring(0, v.length-1); var cityObj = $("#citySel"); cityObj.attr("value", v); // 将选中的id放到隐藏的文本域中 if (ids.length > 0 ) ids = ids.substring(0, ids.length-1); var treeids = $("#treeids"); treeids.attr("value", ids); } function showMenu() { var cityObj = $("#citySel"); var cityOffset = $("#citySel").offset(); $("#menuContent").css({left:cityOffset.left + "px", top:cityOffset.top + cityObj.outerHeight() + "px"}).slideDown("fast"); $("body").bind("mousedown", onBodyDown); } function hideMenu() { $("#menuContent").fadeOut("fast"); $("body").unbind("mousedown", onBodyDown); } function onBodyDown(event) { if (!(event.target.id == "menuBtn" || event.target.id == "menuContent" || $(event.target).parents("#menuContent").length>0)) { hideMenu(); } } var zNodes ; $(document).ready(function(){ // 加载数据 $.ajax({ async : false, cache:false, type: 'POST', dataType : 'json', url: '${base}/admin/goods!getGoodsCategoryTreeJson.action', error: function () { alert('请求失败'); }, success:function(data){ zNodes = data; } }); $.fn.zTree.init($("#treeDemo"), setting, zNodes); }); </SCRIPT>
Seperti yang ditunjukkan di bawah:
Jika anda perlu menulis semula data senarai juntai bawah yang sepadan dalam halaman pengubahsuaian, tambahkan skrip berikut:
<script type="text/javascript"> $(document).ready(function(){ if ("${goods.goodsCategory.id}"!="") { var treeObj = $.fn.zTree.getZTreeObj("treeDemo"); var node = treeObj.getNodeByParam("id", "${goods.goodsCategory.id}" , null); treeObj.selectNode(node,false , false); onClick(event,"${goods.goodsCategory.id}",node,true); } }); </script>