`

JSON 级联表单

    博客分类:
  • AJAX
 
阅读更多

动态下拉列表的原理其实很简单的,当某一下拉列表触发了onchange事件,然后使用AJAX在后台向服务器异步请求数据,最后将服务器返回的数据进行解析后动态添加到指定的select上即可!

    首先来看后台的数据输出,我们假设服务器传送给客户段的JSON数据格式为如下:

{
    "options" : [
        {"value" : 值,"text" : 文本}, 
        {"value" : 值,"text" : 文本},
        {"value" : 值,"text" : 文本}
        ]
}

    其中options是整个JSON对象的标识符,它是一个数组,该数组中的每一个值表示一个select中的option,当然该值也是一个对象了,有两个属性,一个是value,一个是text,分别对应option中的value和显示的text值。

    有了数据格式,那么客户端和服务器端进行交流就方便很多了。我们来先写客户端的JS方法。这里我是提供一个静态的实用类Select,专门针对select元素的操作方法,如下:

/**-----------------------------------------------------------------------
 * ------------------------针对select操作的实用Select类-------------------
 * -----------------------------------------------------------------------
 */
function Select(){};
/**
 * 根据指定的JSON对象来生成指定的select的options项(清除原来的options).
 */
Select.create = function(/*string*/selectId,/*json object*/json) {
 Select.clear(selectId);
 Select.add(selectId, json);
};
/**
 * 该方法同create,只不过是在原来的基础上进行追加
 */
Select.add = function(/*string*/selectId,/*json object*/json) {
 try {
  if (!json.options) return;
  for (var i = 0; i < json.options.length; i ++) {
   Select.addOption(selectId,json.options[i].value,json.options[i].text);
  }
 } catch (ex) {
  base.alert('设置select错误:指定的JSON对象不符合Select对象的解析要求!');
 }
};
/**
 * 创建一个options并返回
 */
Select.createOption = function(/*string*/value, /*string*/text) {
 var opt = document.createElement('option');
 opt.setAttribute('value', value);
 opt.innerHTML = text;
 return opt;
};
/**
 * 给指定的select添加一个option,并返回当前option对象
 */
Select.addOption = function(/*string*/selectId, /*string*/value, /*string*/text) {
 var opt = Select.createOption(value, text);
 $(selectId).appendChild(opt);
 return opt;
};
/**
 * 获取指定select的当前被选中的options对象,如果为多选且有多个被选中则返回数组.
 */
Select.getSelected = function(/*string*/selectId) {
 var slt = $(selectId);
 if (!slt) return null;
 if (slt.type.toLowerCase() == "select-multiple") {
  var len = Select.len(selectId);
  var result = [];
  for (var i = 0; i < len; i ++) {
   if (slt.options[i].selected) result.push(slt.options[i]);
  }
  return result.length > 1 ? result : (result.length == 0 ? null : result[0]);
 } else {
  var index = $(selectId).selectedIndex;
  return $(selectId).options[index];
 }
};
/**
 * 使指定索引位置的option被选中.从0开始.
 */
Select.select = function(/*string*/selectId, /*int*/index) {
 var slt = $(selectId);
 if (!slt) return false;
 for (var i = 0; i < slt.options.length; i ++) {
  if (index == i) {
   slt.options[i].setAttribute("selected", "selected");
   return true;
  }
 }
 return false;
};
/**
 * 选中指定的select的所有option选项,如果支持多选的话
 */
Select.selectAll = function(/*string*/selectId) {
 var len = Select.len(selectId);
 for (var i = 0; i < len; i ++) Select.select(selectId, i);
};
/**
 * 获取指定select的总的options个数
 */
Select.len = function(/*string*/selectId) {
 return $(selectId).options.length;
};
/**
 * 清除select中满足条件的options,如果没有指定处理方法则清除所有options项
 */
Select.clear = function(/*string*/selectId, /*function*/iterator) {
 if (typeof(iterator) != 'function') {
  $(selectId).length = 0;
 } else {
  var slt = $(selectId);
  for (var i = slt.options.length - 1; i >= 0; i --) {
   if (iterator(slt.options[i]) == true) slt.removeChild(slt.options[i]);
  }
 }
};
/**
 * 复制指定的select的option对象到另外一指定的select对象上.如果指定了处理
 * 函数,那么只有返回true时才会copy.
 * 函数iterator参数:当前处理的option对象、目标select的options数组
 */
Select.copy = function(/*string*/srcSlt, /*string*/targetSlt, /*function*/iterator) {
 var s = $(srcSlt), t = $(targetSlt);
 for (var i = 0; i < s.options.length; i ++) {
  if (typeof(iterator) == 'function') {
   if (iterator(s.options[i], $(targetSlt).options) == true) {
    t.appendChild(s.options[i].cloneNode(true));
   }
  } else {
   t.appendChild(s.options[i].cloneNode(true));
  }
 }
};

    那么在回调方法中就可以只要来调用:

……
var jsonString = xmlHttp.responeText; // 获取服务器返回的json字符串
var jsonObj = null;
try {
   jsonObj = eval('(' + jsonString + ')'); // 将json字符串转换成对象
} catch (ex) {
   return null;
}
Select.create("你的select的ID", jsonObj); // 执行option的添加
……

    在Select中提供了很多实用的JS方法来方便操作select对象,我们这里只使用其中的create方法。客户端有了JS,我们现在来做服务器端的字符串输出。这里我们用到了JSONLib库,该库可以很方便的来从现有的javaBean或其他集合对象中来转换成json字符串。我们这里也提供一个公用类如下:

package common.utils.json;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;

/**
 * 下拉列表的JSON对象转换.
 * 转换后的字符串是如下格式:
 * {"options" : [ {"value" : 值,"text" : 文本}, 
 *       {"value" : 值,"text" : 文本},
 *       ……
 *       {"value" : 值,"text" : 文本}
 *              ]
 * }
 * 前台将利用两个JS进行转换和生成:
 * BaseClass对象的json方法将返回的字符串转换成对象;
 * Select对象的create/add方法将把转换后的对象添加到指定的select上去。
 * 
 * @author 铁木箱子
 *
 */
public class SelectJSON
{
 /**
  * Logger for this class
  */
 private static final Logger log = Logger.getLogger(SelectJSON.class);

 /**
  * 从指定的map对象中获取要设置的值后组装成返回给前台的JSON对象字符串.
  * 
  * 存储在map中的key-value应该是option中的value和text,即如下的option:
  * <option value="hello">你好</option>
  * 应该使用如下的map对象:
  * map.put("hello", "你好");
  * 注意使用map对象相同key值的将会被后设置的给覆盖!
  * 
  * @param map
  * @return
  */
 public static String fromMap(Map map)
 {
  Iterator it = map.keySet().iterator();
  JSONArray options = new JSONArray();
  while (it.hasNext()) {
   JSONObject option = new JSONObject();
   String key = (String)it.next();
   option.put("value", key);
   option.put("text", map.get(key));
   options.put(option);
  }
  JSONObject result = new JSONObject();
  result.put("options", options.toString());
  return result.toString();
 }
 
 /**
  * 从指定的list中获取要设置出去JSON对象.
  * 
  * 存放在list中的对象应该是满足JavaBean规范的POJO对象,同时还要指定该对象中的
  * 哪个属性作为option的value,哪个属性作为option的text。比如有如下一个JavaBean
  * ,其部分属性如下:
  * ……
  * public String getOptValue()
  * {
  *     return this.optValue;
  * }
  * public String getOptText()
  * {
  *     return this.optText;
  * }
  * ……
  * 如果我们想用optValue作为option的value属性,而optText作为option的text值,那么
  * 我们就应该传递参数分别是:optValue, optText.
  * 
  * @param list
  * @param valueProp
  * @param textProp
  * @return
  */
 public static String fromList(List list, String valueProp, String textProp)
 {
  JSONArray options = new JSONArray();
  try {
   for (Object obj : list) {
    JSONObject option = new JSONObject();
    String value = BeanUtils.getProperty(obj, valueProp);
    String text = BeanUtils.getProperty(obj, textProp);
    option.put("value", value);
    option.put("text", text);
    options.put(option);
   }
  } catch (Exception ex) {
   throw new RuntimeException(ex);
  }
  JSONObject result = new JSONObject();
  result.put("options", options.toString());
  return result.toString();
 }
 
 public static void main(String[] args)
 {
  // map 测试
  Map<String,String> tt = new HashMap<String,String>();
  tt.put("value1", "text1");
  tt.put("value2", "text2");
  tt.put("value3", "text3");
  log.info(SelectJSON.fromMap(tt));
 }
}

    在类SelectJSON中提供了两个方法,一个是从map中来获取并转换成json字符串,还一个就是从list中的对象来获取,这个方法需要使用BeanUtils工具来辅助获取JavaBean对象中的指定属性。当然了,你可以可以写其他方便发辅助方法来达到这样的效果。

    比如我们在上面的SelectJSON类中的测试,会输出:

{"options":[{"value":"value1","text":"text1"},{"value":"value2","text":"text2"},{"value":"value3","text":"text3"}]}

    然后我们再调用上面提到的JS类Select进行操作就可以了,注意,在使用Select类进行操作前,比如先转换服务器返回的字符串为js对象,即使用eval来执行返回字符串即可!好了,关于使用json来做动态下拉列表就说到这里咯,如有问题,欢迎一起交流~~~ 

分享到:
评论

相关推荐

    jQuery + Ajax + json 级联

    ### jQuery + Ajax + JSON 级联:深入解析与应用 在现代Web开发中,级联选择器(Cascade Selectors)是一种常见的用户界面设计模式,主要用于处理多层级的数据选择,如国家-省份-城市的选择。本文将深入探讨如何...

    jsp+json+mySql 实现二级级联下拉菜单

    在本文中,我们将深入探讨如何使用JSP、JSON和MySQL来实现一个二级级联下拉菜单。这个功能常用于网站的表单设计中,让用户能够从相关联的分类中选择选项,例如省份与城市的选择。 首先,让我们了解这三个技术的核心...

    级联下拉菜单:级联表单下拉菜单

    级联下拉菜单jQuery插件,它允许您根据先前的选择来填充一组表单下拉菜单。演示版基本用法要使用该插件而不覆盖任何默认设置,您需要使用多个下拉(选择)菜单创建表单的结构。 在以下示例中,我正在使用&lt;form&gt...

    dynamicformgenerator:从JSON动态生成表单

    动态表单生成器是一种强大的工具,它允许开发者根据JSON数据结构动态地创建用户界面,尤其在Web应用中,这种功能非常实用。这个特定的项目,名为"dynamicformgenerator",显然是一个基于Java实现的解决方案,它能从...

    jQuery城市级联插件

    jQuery城市级联插件广泛应用于各种在线表单、注册页面、地址管理等场景,尤其在电商、物流等行业中尤为重要。它不仅能提高数据输入的准确性和效率,还可以减少用户输入错误,提升整体用户体验。 总结,jQuery城市...

    struts实现select级联

    在Web表单中,我们经常需要实现select组件的级联选择,即一个下拉框的选择会影响到另一个下拉框的选项。这个场景在处理关联数据时非常常见,比如省份和城市的关系,一个省份被选中后,相关的城市会显示出来。在本...

    input 级联下拉列表

    `input`元素是HTML中的一种表单控件,用于接收用户输入。在创建级联下拉列表时,我们通常使用`&lt;select&gt;`标签来定义下拉列表,并通过`&lt;option&gt;`标签定义可选的项。 2. **基本结构**: 基本的级联下拉列表由两个或...

    Ajax 实现级联菜单

    在本项目中,Ajax被用来实现级联菜单的效果,即一个下拉菜单的选择会影响另一个下拉菜单的内容,这种交互方式常见于数据层级关系丰富的表单中。下面将详细介绍Ajax实现级联菜单的相关知识点。 1. **异步通信**: ...

    layui-级联下拉框-可配置开启多选-HTML源码

    layui是一个轻量级的前端UI框架,它集成了丰富的组件和模块,包括表格、按钮、表单、弹窗等。这个级联多选下拉框可能就是layui的一个组件,它提供了方便的API和配置项,使得开发者可以轻松地开启或关闭多选功能,...

    AJAX级联下拉框源码

    这种功能在数据关联、筛选和表单填写中非常常见,例如省份和城市的选择,类别和子类别的筛选等。以下是对AJAX级联下拉框实现的详细解析: 1. **基本原理** AJAX(Asynchronous JavaScript and XML)是一种在不刷新...

    JavaScript动态级联下拉列表框

    这种技术在数据筛选、表单填写等场景中广泛应用,能够提高用户体验,减少不必要的信息输入。 在实现JavaScript动态级联下拉列表框时,通常涉及以下几个关键知识点: 1. DOM操作:JavaScript通过Document Object ...

    js 级联选择地区

    这种联动效果可以提高用户体验,减少用户误操作,并简化表单提交的数据结构。 在JavaScript中,我们可以利用DOM操作(例如`document.getElementById`、`document.querySelector`或`document.querySelectorAll`)来...

    AJAX3级级联下拉例子

    这个"AJAX3级级联下拉例子"是一个典型的前端交互应用,常见于动态填写表单,如地区选择,省市区级联填充。在这个例子中,用户选择一个选项时,下一个下拉框会根据前一个选项的值动态加载相关的数据,从而提供更精确...

    dojo省份地市级联JSON数据源

    这个数据源显然用于实现一个级联选择的功能,常见于地理信息或地址输入的网页表单中。 首先,我们要理解什么是JSON(JavaScript Object Notation)。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于...

    动态实现下拉列表框三级级联查询

    在IT领域,动态实现下拉列表框的三级级联查询是一项常见的前端交互功能,它能够为用户提供更加便捷的导航和筛选体验。在这个场景中,我们使用JSP(JavaServer Pages)脚本语言来实现这一功能。JSP是Java平台上的...

    ajax+struts2.0+jsp下拉列表级联

    Struts2是一款基于MVC(Model-View-Controller)架构的Java Web框架,它简化了开发过程,提供了强大的表单处理和动作调度机制。在这个案例中,Struts2将作为服务器端的控制器,接收AJAX请求,处理业务逻辑,并返回新...

    ajax实现省市县三级级联和ajax实现登录判断账号是否被注册

    首先,我们来看“省市县三级级联”的实现。在网页设计中,级联下拉框常用于地理信息的选择,如省市县的选取。通过Ajax,我们可以动态地加载下一级的数据,用户选择上一级后,下一级的选项会根据选择自动更新。具体...

    ajax +json做省市级联效果 检测用户唯一 点击改片图片

    首先,**省市级联效果**是常见的前端表单设计,用于获取和展示地区级别的数据。它通过Ajax技术实现实时更新,无需刷新整个页面即可改变显示内容。当用户选择一个省份时,Ajax向服务器发送请求,服务器返回该省份下的...

Global site tag (gtag.js) - Google Analytics