客户端触发:

<select id="category1" onchange="changecategory()">
    <option value="-1">所有一级类别</option>
   <%
    for(int i=0; i<topCategorys.size(); i++) {
     Category c = topCategorys.get(i);
   %>
      <option value="<%=c.getId() %>"><%=c.getName() %></option>
   <%
    }
    %>
   </select>
   <select id="category2">
    <option value="-1">所有二级类别</option>
   </select>

创建XHR:
<script type="text/javascript">
  var req;
  function changecategory() {
   if(window.XMLHttpRequest) {
    req = new XMLHttpRequest();
   } else if (window.ActiveXObject) {
    req = new ActiveXObject("Microsoft.XMLHTTP");
   }
   var id = document.getElementById("category1").options[document.getElementById("category1").selectedIndex];
   var url = "getchildcategory.jsp?id=" + escape(id.value);

req.open("GET", url, true);
   req.onreadystatechange=callback;
   req.send(null);
  }
  function callback() {
   if (req.readyState == 4) {
    if (req.status == 200) {

  //parseXml(req.responseXML);//方式1:XML方式(太麻烦)

  //parse(req.responseText);//方式2:字符方式(最常用)
     eval(req.responseText);//方式3:动态生成javascript方式(最常用)
      } 
     }
  }

function parseXml(msg) {
   var categorys = msg.getElementsByTagName("categorys")[0];
   //alert(categorys.childNodes.length);
   document.getElementById("category2").length=categorys.childNodes.length+1;
   document.getElementById("category2").selectedIndex=0;
   for(var i=0; i<categorys.childNodes.length; i++) {
    var category = categorys.childNodes[i];
    var id = category.childNodes[0].childNodes[0].nodeValue;
    //alert(id);
    var name = category.childNodes[1].childNodes[0].nodeValue;
    //alert(name);
    document.getElementById("category2").options[i+1].value=id;
    document.getElementById("category2").options[i+1].text=name;
   }
  }

function parse(msg) {
   //alert("|" + msg + "|");
   msg = msg.replace(/(^\s*)|(\s*$)/g, "");
   if(msg == null || new String(msg) == "") {
    return;
   }
   var categorys = msg.split("-");
   for(var i=0; i<categorys.length; i++) {
    var category = categorys[i].split("&");
    var id = category[0];
    var name = category[1];
    document.getElementById("category2").length=categorys.length+1;
    document.getElementById("category2").selectedIndex=0;
    document.getElementById("category2").options[i+1].value=id;
    document.getElementById("category2").options[i+1].text=name;
   }
  }
 </script>

server处理方式(getchildcategory.jsp中的内容),返回包含处理结果的javascript代码:

<%
 String strId = request.getParameter("id");
 int id = -1;
 if(strId != null && !strId.trim().equals("")) {
  id = Integer.parseInt(request.getParameter("id"));
 }
 Category parent = CategoryMgr.getInstance().loadById(id);
 List<Category> childs = parent.getChilds();
 StringBuffer buff = new StringBuffer();

//方式1:XML方式

/*

for(int i=0; i<childs.size(); i++) {
  Category c = childs.get(i);
  buff.append("<category><id>" + c.getId() + "</id><name>" + c.getName() + "</name></category>");
 }
 buff.insert(0,"<categorys>");
 buff.append("</categorys>");

*/

//方式2:字符方式

/*

for(int i=0; i<childs.size(); i++) {
  Category c = childs.get(i);
  buff.append(c.getId() + "&" + c.getName() + "-");
 }
 if(childs.size() > 0){
  buff.deleteCharAt(buff.length()-1);
 }
 */

//方式3:动态生成javascript方式
 for(int i=0; i<childs.size(); i++) {
  Category c = childs.get(i);
  buff.append("document.getElementById('category2').options[" + (i+1) + "].value=" + c.getId() + ";\n");
  buff.append("document.getElementById('category2').options[" + (i+1) + "].text='" + c.getName() + "';\n");
 }
 buff.insert(0, "document.getElementById('category2').selectedIndex=0;\n");
 buff.insert(0, "document.getElementById('category2').length=" + (childs.size()+1) +";\n");
 
System.out.println(buff.toString());

//可以采用清除缓存的方法,如下
 response.setContentType("text/xml");
 response.setHeader("Cache-Control", "no-store"); //HTTP1.1 
 response.setHeader("Pragma", "no-cache"); //HTTP1.0
 response.setDateHeader("Expires", 0);
 response.getWriter().write(buff.toString());
%>

下拉条的连动-ajax方式的更多相关文章

  1. 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  2. ajax方式提交带文件上传的表单,上传后不跳转

    ajax方式提交带文件上传的表单 一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数 ...

  3. OSS web直传 ajax方式 上传图片、文件

    部分js代码 send_request = function(){//这是从后台获取认证策略等信息. var htmlobj=$.ajax({url:root+"/service/polic ...

  4. [转] 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  5. 百度编辑器ueditor通过ajax方式提交,不需要事先转义字符的方法(异常:从客户端(xxx)中检测到有潜在危险的 Request.Form 值)

    最近项目中使用百度编辑神器ueditor,确实是很好用的一款编辑器.官网教程提供的与后端数据交互都是跟表单方式有关的,项目中使用的是ajax方式提交,因此出现了不少问题,现在记录备忘下. 环境:.ne ...

  6. jquery.validate ajax方式验证

    在做网站的时候有一块需要用到jquery.validate插件 ajax方式的方式来验证原始密码是否正确,研究了研究加上博客园朋友的帮助,终于实现了.贴出代码 <script type=&quo ...

  7. [实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册

    写在前面 今天贴合到实际的客户需求仔细的想了下,其实在userInfo这个类里面很多字段都不是必须的.有很多的事业单位根本就不能上网,填写的邮箱也是exchange的,个人的详细信息都在ad里面可以取 ...

  8. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  9. 阿里OSS ajax方式 web直传

    部分js代码 send_request = function(){//这是从后台获取认证策略等信息. var htmlobj=$.ajax({url:root+"/service/polic ...

随机推荐

  1. CALayer CABasicAnimation

    CALayer是UIView可以响应事件.一般来说,layer可以有两种用途:一是对view相关属性的设置,包括圆角.阴影.边框等参数:二是实现对view的动画操控. 因此对一个view进行core ...

  2. Spring-----6、Spring3.0提供的Java配置管理

    转载自:http://blog.csdn.net/hekewangzi/article/details/45646279

  3. 【Android类型SDK测试(二)】环境基础

    (一)语言 Android使用的Java语言,所以要测试Android类型的SDK,Java的基础知识还是需要的. 另外,Android中有NDK类型的编程,需要知道C相关的知识. (二)环境准备 A ...

  4. win32程序调试OutputDebugString 类似printf格式化输出

    有没有win32编程因为打印变量调试程序而头疼呢.方法二的函数完全类似printf.非常完美.方法一:不带参数输出如printf("hello world"); OutputDeb ...

  5. How Many Fibs?

    How Many Fibs? 点我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. SQL Server 连接和事务相关的问题。

    方法 1. dbcc opentran + sys.dm_exec_connections dbcc opentran; dbcc opentran 针对当前数据库 dbcc opentran('St ...

  7. Node.js HTTP 使用详解

    对于初学者有没有发觉在查看Node.js官方API的时候非常简单,只有几个洋文描述两下子,没了,我第一次一口气看完所以API后,对于第一个示例都有些懵,特别是参数里的request和response, ...

  8. Jquery基础之动画操作

    Jquery的动画效果能够轻松的为网页添加动画效果,为网页带来了新的活力. 一.show()方法和hide()方法 show()方法和hide()方法是jquery中最基本的动画方法.使用show() ...

  9. c# 正则表达式对网页进行内容抓取

    原文 c# 正则表达式对网页进行内容抓取 搜索引擎中一个比较重要的环节就是从网页中抽取出有效内容.简单来说,就是吧HTML文本中的HTML标记去掉,留下我们用IE等浏览器打开HTML文档看到的部分(我 ...

  10. Inno Setup 安装前卸载原程序(转)

    很多時候我們需要在安裝文件之前卸載原有的程序而不是覆盖安装,本文的code就是实现了这样的功能. 实现原理是:從注冊表'UninstallString'項中读取卸载信息,用Exec进行静默卸载. 下面 ...