热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ajax操作json实现动态下拉列表

先给出一段兼容浏览器的获取AJAX对象的javascript函数functiongetXmlHttp(){varXmlhttpnull;try{XmlhttpnewActiveXObject(MSXML2.XMLHTTP);}catch(e){try{XmlhttpnewActiveXObject(Microsoft.

先给出一段兼容浏览器的获取AJAX对象的Javascript函数

function getXmlHttp(){

var Xmlhttp=null;

try{

Xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");

}catch(e){
try{Xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

}catch(E){

Xmlhttp = false;}
}
if((!Xmlhttp) && (typeof(XMLHttpRequest)!= 'undefined') ) {

Xmlhttp = new XMLHttpRequest();

}

return Xmlhttp;
}

使用方法 var xmlhttp = getXmlHttp();

在很多的ajax范例中,开发者都是用xmlhttp从服务器端获得一个xml数据,然后转换成Javascript可触及的对象,再用js绘制到document中.但我觉得这并非唯一选项,我甚至觉得是多此一举!为什么不直接传递js对象呢?在我开发的系统中,xmlhttp从服务器上获得的是代表js对象的字符串.假如我要传送一个人员列表,我会在服务器上输出:
[{id:1,name:"name1"},{id:2,name:"name2"},{id:3,name:"name3"}]

然后在浏览器上用js获得这个字符串所代表的对象:
var returned = xmlhttp.responseText;
var obj = eval(returned );
接着,你就可以这样访问:
var person1 = obj[0]; var person2 = obj[1];
alert(person1.id);
alert(person1.name);

这样做比传递xml文档直接一些,不必通过转换可以让js直接访问数据.

ajax操作json举例: 使用JSON来做数据传输的动态下拉列表

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

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

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

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

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


function Select(){};


Select.create = function( selectId, json ) {
Select.clear(selectId);
Select.add(selectId, json);
};

Select.add = function(selectId,json) {
try {
if (!json.options) return;
for (var i = 0; i Select.addOption(selectId,json.options[i].value,json.options[i].text);
}
} catch (ex) {
base.alert('设置select错误:指定的JSON对象不符合Select对象的解析要求!');
}
};

Select.createOption = function( value, text) {
var opt = document.createElement_x('option');
opt.setAttribute('value', value);
opt.innerHTML = text;
return opt;
};

Select.addOption = function( selectId, value, text) {
var opt = Select.createOption(value, text);
$(selectId).appendChild(opt);
return opt;
};

Select.getSelected = function( 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 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];
}
};

Select.select = function( selectId, index) {
var slt = $(selectId);
if (!slt) return false;
for (var i = 0; i if (index == i) {
slt.options[i].setAttribute("selected", "selected");
return true;
}
}
return false;
};

Select.selectAll = function( selectId) {
var len = Select.len(selectId);
for (var i = 0; i };

Select.len = function( selectId) {
return $(selectId).options.length;
};

Select.clear = function( selectId, 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.copy = function( srcSlt, targetSlt, iterator) {
var s = $(srcSlt), t = $(targetSlt);
for (var i = 0; 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_r('(' + jsonString + ')'); // 将json字符串转换成对象
} catch (ex) {
return null;
}
Select.create("你的select的ID", jsonObj); // 执行option的添加
……

在Select中提供了很多实用的JS方法来方便操作select对象,我们这里只使用其中的create方法.客户端有了JS,我们现在服务器端的字符串输出json数据.

这里我们用到了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;


public class SelectJSON
{


private static final Logger log = Logger.getLogger(SelectJSON.class);


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();
}


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 tt = new HashMap();
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来执行返回字符串即可!


推荐阅读
  • 前言对于从事技术的人员来说ajax是这好东西,都会使用,而且乐于使用。但对于新手,开发一个ajax实例,还有是难度的,必竟对于他们这是新东西。leo开发一个简单的ajax实例,用的是 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • 这篇文章给大家讲解如何利用dhtmlxGantt在服务器端集成数据。脚本数据保存如果您已初始化dataProcessor,则用户或以编程方式所做的任何更改都将自动 ... [详细]
  • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
author-avatar
婉婷雅铃43
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有