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查询相应的数据,进行分页展示。

java结合jQuery.ajax实现左右菜单联动刷新列表内容的更多相关文章

  1. jquery ajax实现省市二级联动

    今天给大家带来使用jQuery ajax实现的省市联动效果.我们直奔主题,先说下实现思路: 准备数据 这里数据库我使用的是mysql,先看下表格: provience表 city表 这里使用provi ...

  2. JQuery+Ajax实战三级下拉列表联动(八)

    本片文章为练习,项目中不会这样写: 一:涉及到的知识点: jQuery Dom操作 jQuery Ajax操作 ASP.net中的json操作 二:用了自动代码生成器 1.Dal层的代码: publi ...

  3. (jquery+ajax)省市区三级联动(封装和不封装两种方式)-----2017-05-14

    首先,要实现如下图效果, 1.要理清思路: 先做出三个下拉菜单----根据第一个下拉菜单的value值获取第二个下拉列表的内容,第三个同理. 2.用到的数据库表:Chinastates表 规律:根据国 ...

  4. jquery ajax协调SpringMVCD实现局部刷新IV

    feedback.jsp: <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  5. jQuery.ajax() 如何设置 Headers 中的 Accept 内容

    其实很简单,首先如果是常见类型,则请直接设置 dataType 属性 $.ajax({ dataType: "json", type: "get", succe ...

  6. 用jquery ajax做的select菜单,选中的效果

    //用server端语言赋值给js变量     var departmentId = '<%=提交的值 %>', deviceId='<%=提交的值 %>'     $(fun ...

  7. jquery ajax php 无刷新上传文件 带 遮罩 进度条 效果的哟

    在很多项目中都会叫用户上传东西这些的,自从接触了jquery 和ajax之后就不管做什么,首先都会想到这个,我这个人呢?是比较重视客户体验的,这次我这边负责的是后台板块,然后就有一块是要求用户上传照片 ...

  8. jQuery.ajax() 设置 Headers 中的 Accept 内容

    jQuery.ajax() 如何设置 Headers 中的 Accept 内容   其实很简单,首先如果是常见类型,则请直接设置 dataType 属性 $.ajax({ dataType: &quo ...

  9. Ajax和JSON完成二级菜单联动的功能

    首先需要找好JSON的包哦: 链接:http://pan.baidu.com/s/1jH6gN46 密码:lbh1 1:首先创建一个前台页面,比如secondMenu.jsp,源码如下所示: < ...

随机推荐

  1. linux网络启动报错

    报错信息: shutting down interface eth0: error:device "eth0" (/org/freedsktop/networkMaager/Dev ...

  2. EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType

    问题原因,EF当前版本没有该方法,将EF版本升级即可. 1.packages.config <package id="EntityFramework" version=&qu ...

  3. CGContext含义

    代码 含义 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 CGContextMoveToPoint 开始画线 CGContex ...

  4. Oracle动态性能表-V$SESSION_WAIT,V$SESSION_EVENT

    (1)-V$SESSION_WAIT 这是一个寻找性能瓶颈的关键视图.它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件).当系统存 ...

  5. 微信小程序发送模板消息

    微信小程序发送模板消息 标签(空格分隔): php 看小程序文档 [模板消息文档总览]:https://developers.weixin.qq.com/miniprogram/dev/framewo ...

  6. Ubuntu 14.04安装Skype

    Skype 4.3版本在14.04 LTS工作正常.安装步骤: $ sudo apt-get remove skype skype-bin:i386 skype:i386 $ sudo apt-get ...

  7. JPush设置别名不走成功回调的解决办法

    在参考了极光推送的文档之后,对个推(单个推送)有设置别名的方法,方法如下 [JPUSHService setTags:tags alias:alias fetchCompletionHandle:^( ...

  8. QQ自动登录里的一些控件知识

    在这个程序里面有个读取计算机指定文件的知识: private void button2_Click(object sender, EventArgs e) { openFileDialog1.Show ...

  9. SQL Server-聚焦聚集索引对非聚集索引的影响

      前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没 ...

  10. ABBYY FineReader双十一优惠享不停,战绩如何?

    随着双十一的火热来袭,购物达人也是不吝啬囊中票子,各种姿势剁手齐全,立誓过后吃土半月,双十一的好与不好?自己也是门清,反正真真的是促进消费了! 就ABBYYFineReader而言,此次的双十一力度就 ...