java結合jQuery.ajax實現左右選單聯動重新整理列表內容
阿新 • • 發佈:2019-02-10
http://域名/一級選單ID-二級選單ID/用這樣的URL請求頁面,出現如圖所示內容;
該頁面包含四部分,頂部目錄+左側選單+右側選單+右下側資料列表;
左側選單包含一級選單和二級選單,點選某個一級選單時開啟對應的二級選單,同時右側也顯示二級選單;選中左側某個二級選單,右側對應的二級選單也被選中,點選右側二級選單,顯示對應的三級選單,預設選中三級選單的全部,點選某個三級選單,列表中展示對應選單下的資料;上述所有點選過程中,頂部目錄以及右側列表同時重新整理。。。感覺好繞口的樣子呢,不過我還是實現了它。。。就當是做點筆記吧!
頁面佈局:父頁面+iframe_menu+iframe_dataList
parent.jsp
<!-- 頭部省略 --> <script type="text/javascript"> function queryDataByID(type_id) { handleDiv(type_id); } </script> </head> <% // 處理URL中的引數(一級選單ID-二級選單ID) String id= (String)request.getAttribute("id"); String realid = ""; String[] ids ; if(id.contains("-")){ ids = id.split("-"); if(ids.length==2){ realid = ids[1]; }else if(ids.length==3){ realid = ids[2]; } }else{ realid = id; } %> <body class="tf"> <p class="wrapper key"> <a href="#">入口網站</a><span>></span> <a href="#">連結1</a><span>></span> <a href="#">連結2</a><span>></span> <a href="" id="mulufirst"></a><span>></span> <em id="mulusecond"></em><!--標示當前--> </p> <div class="wrapper clearfix"> <!--***************************************************************左側選單****************************************************************--> <div class="main_left"> <iframe onload="iframeMenuFun()" name="iframeMenu" src="/menu/fenlei/<%=id%>.html" height="950" width="250" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no" style="float:left;"></iframe> </div> <!--***************************************************************左側選單****************************************************************--> <div class="main_content"> <div class="mc_one" id="parentchild"></div> <!-- 新增橫向一級和二級選單 --> <div class="mc_one"> <ul class="mc_content"> <!--***************************************************************右側資料列表****************************************************************--> <iframe src="/listpart/<%=realid %>/1.html" align="top" id="iframepage" width="931" onload="SetWinHeight(this)" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" ></iframe> <!--***************************************************************右側資料列表****************************************************************--> </ul> </div> </div> </div> <script> function loadDatabyID(type_id){//根據三級id載入資料 document.getElementById("iframepage").src="/xf/listpart/"+type_id+"/1.html"; } function switchSanjiClass(o){ var oI=$(o).parent().find('a').index($(o)); $(o).parent().find('a').eq(oI).addClass('on').siblings().removeClass('on'); } function handleDiv(type_id){ var temp = type_id.replace("r","s"); $('.main_content #parentchild >div').each(function () {//遍歷處理隱藏的三級選單 if($(this).attr("id")==temp){ if ($(this).hasClass('Hide')) { $(this).removeClass('Hide'); $(this).addClass('xian'); } }else{ if ($(this).hasClass('xian')) { $(this).removeClass('xian'); $(this).addClass('Hide'); } } }); } function handleDivsan(erjiID) {//用來處理點選左側二級選單後 顯示橫向對應三級選單 var temp = "s" + erjiID; //根據二級id拼接成三級div的id 這是自己的約定 $('.main_content #parentchild >div').each(function () {//遍歷處理隱藏的三級選單 if($(this).attr("id")==temp){ if ($(this).hasClass('Hide')) { $(this).removeClass('Hide'); $(this).addClass('xian'); } }else{ if ($(this).hasClass('xian')) { $(this).removeClass('xian'); $(this).addClass('Hide'); } } }); temp = "r" + erjiID; $('.main_content #parentchild .clearfix li').each(function (){//遍歷處理橫向二級樣式 if($(this).attr("id")==temp){ $(this).addClass('on').siblings().removeClass('on'); } }); } function TabOne(){ var oTLi1=$('.main_content #parentchild .mc_tab li'); var oTUl1=$('.mc_one .mc_content'); oTLi1.click(function(){ var _this=$(this); var oI=oTLi1.index(_this); oTLi1.eq(oI).addClass('on').siblings().removeClass('on'); document.getElementById('mulusecond').innerHTML=$(this).text(); loadDatabyID($(this).attr("id").replace("r","")); var temp = $(this).attr("id").replace("r","s"); //根據二級id拼接成三級div的id 這是自己的約定 $('.main_content #parentchild >div').each(function () {//遍歷處理隱藏的三級選單 if($(this).attr("id")==temp){ if ($(this).hasClass('Hide')) { $(this).removeClass('Hide'); $(this).addClass('xian'); } }else{ if ($(this).hasClass('xian')) { $(this).removeClass('xian'); $(this).addClass('Hide'); } } }); }) </script> <script type="text/javascript"> function SetWinHeight(obj) { var win=obj; if (document.getElementById("iframepage")) { if (win && !window.opera) { if (win.contentDocument && win.contentDocument.body.offsetHeight) { win.height = win.contentDocument.body.offsetHeight + 25; } else if(win.Document && win.Document.body.scrollHeight) { win.height = win.Document.body.scrollHeight + 25; } } } } function IFrameReSizeWidth(obj) { var win=obj; if (document.getElementById("iframepage")) { if (win && !window.opera) { if (win.contentDocument && win.contentDocument.body.offsetWidth) { win.width = win.contentDocument.body.offsetWidth; } else if(win.Document && win.Document.body.scrollWidth) { win.width = win.Document.body.scrollWidth; } } } } } </script> </body> </html>
ServiceLeftMenu類用來處理左側選單請求
public List<MenuModel> getLeftMenu(HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html;charset=gbk"); response.setCharacterEncoding("gbk");// 防止彈出的資訊出現亂碼 // 設定查詢條件部分省略,menuInfo // 對ID進行分割處理 ids = new String[3]; if ("fenlei".equals(type)) { if (id.contains("-")) { ids = id.split("-"); } else { ids[0] = id; } } // 根據一級選單parent_id=0,獲取一級選單列表 List<MenuModel> list = new ArrayList<MenuModel>(); menuInfo.setTypeParentId("0"); list = MenuDAO.getMenuList(menuInfo); for (int i = 0; i < list.size(); i++) { MenuModel MenuModel = list.get(i); // 根據二級選單的parent_id=一級選單的ID,獲取二級選單列表, menuInfo.setTypeParentId(MenuModel.getTypeId()); // 將二級選單的列表作為一級選單的屬性保持,這樣二級選單與對應的一級選單繫結 list.get(i).setChilds(MenuDAO.getMenuList(menuInfo)) ; } // 將一級二級才當列表與前端的樣式一起拼接為字串返回到頁面 String strMenu = createMenuByList(list); request.setAttribute("strMenu", strMenu); return null; } private String createMenuByList(List<MenuModel> menulist){ StringBuffer strMenu = new StringBuffer(); strMenu.append("<p><img src='http://img.test.com/images/zhizhen.png' alt='' title=''/>選單</p>"); for (MenuModel MenuModel : menulist) { //分類頁遍歷一級選單 if("fenlei".equals(type)){ strMenu.append("<ul ><li id='"); strMenu.append(MenuModel.getTypeId()); if(MenuModel.getTypeId().equals(ids[0])){ strMenu.append("' class='nav_title'><em class='on'></em>"); strMenu.append(MenuModel.getTypeName()); strMenu.append("</li><li class='nav_details'><ul>"); }else{ strMenu.append("' class='nav_title'><em ></em>"); strMenu.append(MenuModel.getTypeName()); strMenu.append("</li><li class='nav_details dis'><ul>"); } int k = 0; //分類頁遍歷二級選單 for (MenuModel child : MenuModel.getChilds()) { if (ids[1] != null && !ids[1].equals("")) { if(child.getTypeId().equals(ids[1])){ strMenu.append("<li class='on' onclick='showSanji("+child.getTypeId()+")'><a class='clearfix'><span>"); }else{ strMenu.append("<li onclick='showSanji("+child.getTypeId()+")'><a class='clearfix'><span>"); } } else { if (k == 0 && ids[0].equals(MenuModel.getTypeId())) { strMenu.append("<li class='on' onclick='showSanji("+child.getTypeId()+")'><a class='clearfix'><span>"); k = 2; } else { strMenu.append("<li onclick='showSanji("+child.getTypeId()+")'><a class='clearfix'><span>"); } } strMenu.append(child.getTypeName()); strMenu.append("</span><em>></em></a></li>"); } strMenu.append("</ul></li></ul>"); } else { //.... } } return strMenu.toString(); }
leftmenu.jsp
<html>
<!-- 省略首部內容 -->
<head>
<script type="text/javascript">
$(document).ready(function(){
Vnavl();
//tab標籤
TabOne();
// 頂部目錄
creatMulu();
<%
String id = (String)request.getAttribute("idd");
String[] ids = new String[3];
if (id.contains("-")) {
ids = id.split("-");
} else {
ids[0] = id;
ids[1] = "0";
}
%>
getChild(<%=ids[0]%>,<%=ids[1]%>);//橫向選單預設開啟第一個
});
function creatMulu(){
//剛進入頁面根據樣式確定一級目錄的內容
$(".v_nav>ul .nav_title").each(function () {
if ($(this).find('em').hasClass('on')) {
window.parent.document.getElementById('mulufirst').innerHTML=$(this).text();
}
});
//剛進入頁面根據樣式確定二級目錄的內容
$('.nav_details>ul>li').each(function () {
if ($(this).hasClass('on')) {
window.parent.document.getElementById('mulusecond').innerHTML=$(this).text().replace(">","");
}
});
}
//左側選單效果
function Vnavl(){
var oUl=$('.v_nav>ul');
var oNavT=$(".v_nav>ul .nav_title");
var oLi=$('.nav_details>ul>li');
oNavT.click(function(){
var _this=$(this);
//alert($(this).text());
//alert($(this).attr("id"));
var oI=oNavT.index(_this);
oNavT.find('em').removeClass('on');
oUl.eq(oI).siblings().find('.nav_details').slideUp();
oUl.eq(oI).find('.nav_details').slideDown();
oNavT.eq(oI).find('em').addClass('on');
var yijiId = $(this).attr("id");
// alert($(this).attr("id"));
getChild($(this).attr("id"));
var count = 0;
oUl.eq(oI).find('.nav_details').find('ul').find('li').each(function () {
if(count==0){
$(this).addClass('on');
window.parent.document.getElementById("mulusecond").innerHTML=$(this).text().replace(">","");
parent.loadDatabyID(yijiId);
count = 1;
}
});
//動態修改一級目錄
window.parent.document.getElementById('mulufirst').innerHTML=$(this).text();
})
oLi.click(function(){
var _this=$(this);
var oI=oLi.index(_this);
oLi.removeClass('on');
oLi.eq(oI).addClass('on');
//動態修改二級級目錄
window.parent.document.getElementById('mulusecond').innerHTML=$(this).text().replace(">","");
})
}
function showSanji(erjiID){
parent.handleDivsan(erjiID);
parent.loadDatabyID(erjiID);
}
//根據一級選單ID獲得橫向二級選單和三級選單
function getChild(topid,secondid){
jQuery.ajax({
type: "post",
url: "/xf/makesecond.html",
data:{param:"child",optionValue:topid,seId:secondid},
success: function(data){
var tt = "";
var default_id = "";//記錄二級選單第一項id
var json = eval(data); //陣列
$.each(json, function (index) {
//迴圈獲取資料
default_id = json[index].firstErjiID;
tt = json[index].erjihtml;
});
window.parent.document.getElementById('parentchild').innerHTML=tt;
parent.queryDataByID(default_id);
parent.TabOne();
}
});
}
</script>
</head>
<body class="tf">
<div class="v_nav" >
<!-- 顯示左側選單 -->
<%=request.getAttribute("strMenu") %>
</div>
</body>
</html>
RightMenuService用來查詢右側選單,用json格式返回,通過顯示/隱藏樣式來控制三級選單的樣式
public List<MenuModel> getMenuRows(HttpServletRequest request, HttpServletResponse response) {
// 設定編碼
response.setContentType("text/html;charset=gb2312");
response.setCharacterEncoding("gb2312");
// 接受引數
String param = request.getParameter("param");
String optionValue = request.getParameter("optionValue");
String seId = request.getParameter("seId");
// 設定SQL查詢條件省略,menuInfo
// 查詢二級欄目
List<MenuModel> listErji = new ArrayList<MenuModel>();
// 查詢三級欄目
List<MenuModel> listSanji = new ArrayList<MenuModel>();
// 橫向二級選單
listErji.clear();
if("child".equals(param)){
menuInfo.setTypeId(optionValue);
menuInfo.setFlag("2");
listErji = MenuDAO.getMenuRowsList(menuInfo);
request.setAttribute("type_id", optionValue);
}
String data = "<ul class='clearfix mc_tab'>";
String firstErjiID = "";
int k = 0;
for (int i = 0; i < listErji.size(); i++) {
String id = "r"+listErji.get(i).getTypeId();
String name = listErji.get(i).getTypeName();
//if (i == 0) {
if(listErji.get(i).getTypeId().equals(seId)) {
firstErjiID = id;
data += "<li class='on' id="+id+">"+name+"</li>";
} else if (("0".equals(seId) && k == 0) || (null ==seId && k == 0)){
// 訪問一級分類或者點選一級分類時預設選擇第一個二級分類
k = 1;
data += "<li class='on' id="+id+">"+name+"</li>";
} else {
data += "<li id="+id+">"+name+"</li>";
}
}
data += "</ul>";
// 橫向三級選單
listSanji.clear();
for (int i = 0; i < listErji.size(); i++) {
menuInfo.setTypeId(listErji.get(i).getTypeId());
menuInfo.setFlag("3");
listSanji = MenuDAO.getMenuRowsList(menuInfo);
data +="<div id='s"+listErji.get(i).getTypeId()+"' class='Hide clearfix'><a class='on' onclick='loadDatabyID("+listErji.get(i).getTypeId()+");switchSanjiClass(this)'>全部</a>";
for (int j = 0; j < listSanji.size(); j++) {
data += "<a onclick='loadDatabyID("+listSanji.get(j).getTypeId()+");switchSanjiClass(this)'>"+listSanji.get(j).getTypeName()+"</a>";
}
data += "</div>";
}
//data返回的是json型別的資料
data = "[{\"firstErjiID\":\""+firstErjiID+"\",\"erjihtml\":\""+data+"\"}]";
try {
response.getWriter().write(data);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
大致步驟如上,有了新的思路可繼續完善哈
補充:實現選單目前有兩種思路,一是在後端拼接好字串直接返回,而是在後端返回一個json格式的資料,拼接過程在前端實現,這裡補充第二種方式~
//獲得一級選單
function getTopMenu(){
jQuery("#parent").empty();
jQuery("#parent").append("<p><img src='http://img.test.com/images/zhizhen.png' alt='' title=''/> 選單</p>");
jQuery.ajax({
type: "post",
url: "/xf/makesecond.html",
data:{param:"parent"},
success: function(data){
var json = eval(data); //陣列
$.each(json, function (index) {
//迴圈獲取資料 class="on"
var Id = json[index].typeId;
var Name = json[index].typeName;
if(0==index){
firsetId = Id;
jQuery("#parent").append("<ul ><li class='nav_title' onclick='Vnavl()'><em class='on'></em>"+Name+"</li><li class='nav_details'><ul id='"+Id+"'></ul></li></ul>");
} else {
jQuery("#parent").append("<ul><li class='nav_title' onclick='Vnavl()' ><em></em>"+Name+"</li><li class='nav_details dis'><ul id='"+Id+"'></ul></li></ul>");
}
getChild(Id);
});
}
});
}
後臺實現
public List<MenuModel> getLeftMenu(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=gb2312");
response.setCharacterEncoding("gb2312");// 防止彈出的資訊出現亂碼
//查詢條件省略
List<MenuModel> list = new ArrayList<MenuModel>();
String param = request.getParameter("param");
String optionValue = request.getParameter("optionValue");
list.clear();
if ("parent".equals(param)) {
menuInfo.setTypeParentId("0");
list = menuDAO.getLeftMenuList(menuInfo);
request.setAttribute("type_id", 0);
} else if ("child".equals(param)) {
menuInfo.setTypeParentId(optionValue);
list = menuDAO.getLeftMenuList(menuInfo);
request.setAttribute("type_id", optionValue);
}
net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(list);
String data = jsonArray.toString();
System.out.println(data);
try {
response.getWriter().write(data);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
右下側資料列表,就是普通的資料展示,根據選單ID查詢對應的資料,進行分頁展示。