利用jquery、json实现前台无刷新的多级联动下拉菜单

3 篇文章 0 订阅
2 篇文章 0 订阅
这两天我都在做一个项目,s2sh的一个项目,里面有一个模块需要实现菜单多级联动,然后问了一个同学,他给我提供了一个解决方案,是利用jquery还有json做的,现在把他写出来,第一,分享给需要的人,第二,也当时我自己的一个备份吧,如果以后忘记了还可以返回了看看。
要实现无刷新多级联动,则需要按照以下步骤:
 
1、需要使用json-lib框架, http://json-lib.sourceforge.net下载json-lib-1.1-jdk15.jar,运行json还需要的包有:commons-lang.jarcommons-logging.jarcommons-beanutils.jarxom-1.0-2005-01-05.jarezmorph-1.0.1.jar,可在http://www.docjar.com搜索下载。将那些包下载好后放进项目的Build Path即可。
我已打包上传,可以直接到点击打开链接下载json-lib包下载即可

2、在需要使用多级联动菜单的前台界面代码中,引用jquery文件。

3、自己编写一个json组件,也就是一个java类,方便后面从数据库中查询出数据后直接使用该类的静态方法发送json数据到前台。
代码如下:
package com.ms.teach.by.utils;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import org.apache.struts2.ServletActionContext;

/**
 * @author chaoming
 */
public class JSONUtils{

	/**以JSON格式传递数据到客户端*/
	public static void sendOfJSON(List list) {
		if(list!=null && list.size()>0){
			JSONArray jr = JSONArray.fromObject(list);
			HttpServletResponse response = ServletActionContext.getResponse();
			response.setHeader("cache-control", "no-cache");
			response.setContentType("text/json");
			response.setCharacterEncoding("UTF-8");
			PrintWriter out;
			try {
				out = response.getWriter();
				String jsonUser = jr.toString();
				//System.out.println(jsonUser);
				out.print(jsonUser);
				out.flush();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	/**以JSON格式传递数据到客户端*/
	public static void sendOfJSON(Set set) {
		JSONArray jr = JSONArray.fromObject(set);
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setHeader("cache-control", "no-cache");
		response.setContentType("text/json");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out;
		try {
			out = response.getWriter();
			String jsonUser = jr.toString();
			//System.out.println(jsonUser);
			out.print(jsonUser);
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
4、在前台中,使用jquery语句发送请求到后台,比如一下代码:
<script type="text/javascript">
	function getCourseTermByJSON() {
		$.getJSON("NativeCourses_getCourseTermByJSON", "", function(data) {
			$("#course_term option").remove();
			$("#course_term").append("<option>===请选择授课学期===</option>");
			$.each(data, function(i) {
				$("#course_term").append(
						"<option value="+data[i][0]+">" + data[i][1]
								+ "</option>");
			});
		});
	}
</script>
上面的这段代码主要就是发送请求到后台的action,action的名字是NativeCourses_getCourseTermByJSON,那个jquery的getJSON方法第一个参数就是action的地址,第二个参数就是要传递到后台的参数,当有多个参数要传递的时候可以使用&来连接,比如para1=1&para2=2,第三个参数就是一个方法,主要是对后台传递回来的json数据进行处理。下面的那个course_term就是select标签的id。要在body的onload事件中执行上面那个方法,这样页面在载入的时候就可以直接从后台中查询想要的数据。
经过我的尝试,如果返回的data是java对象的话,输出的时候可以这样:data[i].name、data[i].age。
5、在后台的action无返回参数,即void类型的一个方法,比如一下代码:
public void getCourseTermByJSON() {
		List l = this.nativeCoursesDAO.getCourseTerm();
		JSONUtils.sendOfJSON(l);
	}
上面的那个方法配置成一个action,查询出所需要的数据,
,查询出来后使用刚刚我们写的那个组件里面的静态方法发送数据到前台,注意,这里我查询出的只是单值,我没有试过查询出是对象时前台的处理情况,有兴趣的可以试试,上面的那个查询实际上相当于发送了一条类似于select name from person的sql语句,如果是这样的话那么一会前台要输出的时候就是修改上面的那个jquery方法getJSON的function(data),因为是单值,所以$("#course_term").append("<option value="+data[i][0]+">" + data[i][1]+ "</option>");需要改为$("#course_term").append("<option value="+data[i]+">" + data[i]+ "</option>");如果你查询的结果是多值的,比如类似于一下sql语句:select name,age from person这样的话直接使用
$("#course_term").append("<option value="+data[i][0]+">" + data[i][1]+ "</option>");
即可,data[i][0]既是name的值,data[i][1]是age的值。

6、数据返回到了前台后进行处理,第一个下拉菜单数据项从数据库中加载,这样在可以写类似上面的那段jquery方法,写在某个select标签的onchange事件中,这样当select选中项改变的时候就会执行jquery方法,传递那个select的选择项的value,传到后台再根据这个value查询出结果,就这样再返回前台,即可实现多级联动选择菜单。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,我可以为您提供相关的代码实现。 这是一个基于 jQuery 的三级联下拉菜单的例子: HTML 代码: ``` <select id="province"> <option value="">请选择省份</option> </select> <select id="city"> <option value="">请选择城市</option> </select> <select id="area"> <option value="">请选择地区</option> </select> ``` jQuery 代码: ``` $(document).ready(function(){ // 加载省份数据 $.ajax({ type: "GET", url: "省份数据接口地址", dataType: "json", success: function(data){ $.each(data,function(i,item){ $("#province").append("<option value='"+item.code+"'>"+item.name+"</option>"); }); } }); // 当省份选择发生变化时,加载城市数据 $("#province").change(function(){ var provinceCode = $(this).val(); if(provinceCode != ""){ $.ajax({ type: "GET", url: "城市数据接口地址", data: {"provinceCode":provinceCode}, dataType: "json", success: function(data){ $("#city").empty(); $("#area").empty(); $("#city").append("<option value=''>请选择城市</option>"); $.each(data,function(i,item){ $("#city").append("<option value='"+item.code+"'>"+item.name+"</option>"); }); } }); }else{ $("#city").empty(); $("#area").empty(); $("#city").append("<option value=''>请选择城市</option>"); $("#area").append("<option value=''>请选择地区</option>"); } }); // 当城市选择发生变化时,加载地区数据 $("#city").change(function(){ var cityCode = $(this).val(); if(cityCode != ""){ $.ajax({ type: "GET", url: "地区数据接口地址", data: {"cityCode":cityCode}, dataType: "json", success: function(data){ $("#area").empty(); $("#area").append("<option value=''>请选择地区</option>"); $.each(data,function(i,item){ $("#area").append("<option value='"+item.code+"'>"+item.name+"</option>"); }); } }); }else{ $("#area").empty(); $("#area").append("<option value=''>请选择地区</option>"); } }); }); ``` 请注意,以上代码中的数据接口地址需要替换为实际的接口地址。此外,还需要根据实际情况调整代码中的数据格式和名称。 ### 回答2: Ajax多级联效果是指利用Ajax技术实现多个下拉菜单之间的数据联实现根据前一个下拉菜单的选项态改变后续下拉菜单的选项内容。Ajax三级联下拉菜单效果是指有三个相关联的下拉菜单,选择一个下拉菜单的选项后,另外两个下拉菜单的选项内容会相应改变。 实现这个效果的步骤如下: 1. 前端页面设置三个下拉菜单元素,并使用JavaScript监听第一个下拉菜单的选项改变事件,即当第一个下拉菜单的选项改变时触发事件。 2. 在JavaScript中定义一个Ajax请求函数,该函数通过发送一个Ajax请求到后端获取第二个下拉菜单的选项内容。 3. 后端接收到Ajax请求后,根据第一个下拉菜单选项的值进行相应的数据处理,并将处理结果返回给前端。 4. 前端通过Ajax请求的回调函数获取到后端返回的数据,然后将数据设置为第二个下拉菜单的选项内容。 5. 同样地,对第二个下拉菜单也需要设置一个监听选项改变事件的函数,并在该函数中通过发送Ajax请求获取第三个下拉菜单的选项内容。 6. 后端根据第二个下拉菜单选项的值进行数据处理,并返回给前端。 7. 前端通过回调函数获取到后端返回的数据,并将数据设置为第三个下拉菜单的选项内容。 通过以上步骤,就可以实现Ajax三级联下拉菜单效果。在这个过程中,通过Ajax技术实现了前后端的数据交互,从而实现了多级联效果。 ### 回答3: Ajax多级联效果指的是在网页中使用Ajax技术实现多个下拉菜单之间的联效果。常见的应用场景是省市区三级联选择。 具体操作如下: 1. 在HTML中,定义一个最外层的下拉菜单,用来选择省份。 2. 使用Ajax发送请求,获取省份列表数据,并将数据填充到省份的下拉菜单中。 3. 给省份下拉菜单添加change事件监听器,当省份变化时,触发事件回调函数。 4. 在事件回调函数中,获取选中的省份值,并发送Ajax请求获取对应的城市列表数据。 5. 将获取到的城市列表数据填充到城市的下拉菜单中。 6. 给城市下拉菜单添加change事件监听器,当城市变化时,触发事件回调函数。 7. 在事件回调函数中,获取选中的城市值,并发送Ajax请求获取对应的区县列表数据。 8. 将获取到的区县列表数据填充到区县的下拉菜单中。 9. 完成三级联菜单的效果。 通过以上步骤,实现了Ajax三级联下拉菜单效果,用户可以根据选择的省市区,态获取到对应的下级菜单数据,从而实现级联效果。此种效果在选择地址、商品分类等场景中应用广泛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值