`
zhouyrt
  • 浏览: 1172469 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

改造请求参数---Ajax之二

阅读更多

接上篇。引入了一个私有函数_serialize,它会把js对象串行化成HTTP所需参数模式,接受如下两种结构

 

{name:'jack',age:20} --> name=jack&age=20

{fruit:['apple','banana','orange']} --> fruit=apple&fruit=banana&fruit=orange

 

请求后台的一个servlet,发送参数name=jack,age=20,默认使用异步,GET方式。现在data可以如下了

Ajax.request('servlet/ServletJSON',{
		data : {name:'jack',age:20},
		success : function(xhr){
			//to do with xhr
		},
		failure : function(xhr){
			//to do with xhr
		}
	}
);

 

完整代码

/**
 * 执行基本ajax请求,返回XMLHttpRequest
 * Ajax.request(url,{
 * 		async 	是否异步 true(默认)
 * 		method 	请求方式 POST or GET(默认)
 * 		encode 	请求的编码 UTF-8(默认)
 * 		data 	请求参数 (键值对字符串或js对象)
 * 		success 请求成功后响应函数 参数为xhr
 * 		failure 请求失败后响应函数 参数为xhr
 * });
 *
 */
var Ajax = 
function(){
	function request(url,opt){
		function fn(){}
		var async   = opt.async !== false,
			method  = opt.method 	|| 'GET',
			encode  = opt.encode 	|| 'UTF-8',
			data    = opt.data 		|| null,
			success = opt.success 	|| fn,
			failure = opt.failure 	|| fn;
			method  = method.toUpperCase();	
		if(data && typeof data == 'object'){//对象转换成字符串键值对
			data = _serialize(data);
		}
		if(method == 'GET' && data){
            url += (url.indexOf('?') == -1 ? '?' : '&') + data;
			data = null;
        }
		var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
		xhr.onreadystatechange = function(){
			_onStateChange(xhr,success,failure);
		};
		xhr.open(method,url,async);
		if(method == 'POST'){
			xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=' + encode);
		}
		xhr.send(data);
		return xhr;	
	}		
	function _serialize(obj){
		var a = [];
		for(var k in obj){
			var val = obj[k];
			if(val.constructor == Array){
				for(var i=0,len=val.length;i<len;i++){
					a.push(k + '=' + encodeURIComponent(val[i]));
				}				
			}else{
				a.push(k + '=' + encodeURIComponent(val));
			}				
		}
		return a.join('&');
	}	
	function _onStateChange(xhr,success,failure){
		if(xhr.readyState == 4){
			var s = xhr.status;
			if(s>= 200 && s < 300){
				success(xhr);
			}else{
				failure(xhr);
			}
		}else{}
	}
	return {request:request};	
}();
 

这里仅仅是使data可以是对象类型,貌似没啥大用。但如果与表单(form)结合的话还是很有用的。当我们使用form但又想用ajax方式提交,那么把form中元素序列化成HTTP请求的参数类型是一个费劲的活。这里写个工具函数formToHash,将form元素按键值形式转换成对象返回。

 

/**
 * 把表单内容转换为hash对象
 * @param {HTMLElement} form对象
 * @return {hash}
 * @example
 *         formToHash(document.forms[0]);
 */
function formToHash(form){
	var hash = {}, el;
	for(var i = 0,len = form.elements.length;i < len;i++){
		el = form.elements[i];
		if(el.name == "" || el.disabled) continue;
		switch(el.tagName.toLowerCase()){
		case "fieldset":
			break;
		case "input":
			switch(el.type.toLowerCase()){
			case "radio":
				if(el.checked)
					hash[el.name] = el.value;
				break;
			case "checkbox":
				if(el.checked){
					if(!hash[el.name]){
						hash[el.name] = [el.value];
					}else{
						hash[el.name].push(el.value);
					}
				}
				break;
			case "button":
				break;
			case "image":
				break;
			default:
				hash[el.name] = el.value;
				break;
			}
			break;
		case "select":
			if(el.multiple){
				for(var j = 0, lens = el.options.length;j < lens; j++){
					if(el.options[j].selected){
						if(!hash[el.name]){
							hash[el.name] = [el.options[j].value];
						}else{
							hash[el.name].push(el.options[j].value);
						}
					}
				}
			}else{
				hash[el.name] = el.value;
			}
			break;
		default:
			hash[el.name] = el.value;
			break;
		}
	}
	form = el = null;
	return hash;
}
 

好了,有了formToHash就可以将其返回的对象作为Ajax的参数data了,Ajax内部的_serialize能自动的将该对象转换成HTTP请求参数形式。

 

 

分享到:
评论
8 楼 kimmking 2010-08-21  
http://www.iteye.com/topic/644429

ray_linn 写道
最近发现自己在javaeye的言辞锋芒锐减了许多,自己也百思不得其解,后来终于发现,原来是最近的小白太多,放眼看去,各个板块里都是小白新手帖,如果一个个去点新手帖的话,估计都要得脉管炎了,而且那种水水的帖子,连开骂的兴趣都没有,抓这种帖子远不如以前抓robbin的“linux可以挂载新硬盘是比windows好的一个优点”这种帖子来得有意思。

介绍新东西,新思路,新想法的东西少了许多,不是谈SSH,就是说Rails,看得一点劲头没有,还是自己搞搞博吧。

7 楼 kimmking 2010-08-21  
wu_quanyin 写道
javaDevil 写道
良好帖 (1) :: 新手帖 (10) ::

这么多人投新手,这贴挺好的啊。难道je大牛太多了



不是大牛太多,是菜鸟太多,,看别人再讲基础的东西,就投新手,基础才是最重要的,难道不知道

基础的东西,请发到入门讨论,谢谢。
6 楼 wu_quanyin 2010-08-21  
javaDevil 写道
良好帖 (1) :: 新手帖 (10) ::

这么多人投新手,这贴挺好的啊。难道je大牛太多了



不是大牛太多,是菜鸟太多,,看别人再讲基础的东西,就投新手,基础才是最重要的,难道不知道
5 楼 surpass 2010-08-19  
javaDevil 写道
良好帖 (1) :: 新手帖 (10) ::

这么多人投新手,这贴挺好的啊。难道je大牛太多了

x神太多。
4 楼 smzd 2010-08-19  
很好很强大。不过愚以为,对于表单的处理可以对任何类型的键值配对都将值做成数组,而不只是checkbox这样处理。因为可能会有重名输入框的情况发生,这样不会导致只有一个值传到服务器上。而对于数组,即便只有一个也不影响系统处理,不是吗?
3 楼 javaDevil 2010-08-19  
良好帖 (1) :: 新手帖 (10) ::

这么多人投新手,这贴挺好的啊。难道je大牛太多了
2 楼 Andrew1945 2010-08-19  
LZ很强大啊,整理的很好啊,你们那些投新手的人啊...
1 楼 yangguo 2010-08-18  
LZ实力很强大,继续关注学习。

相关推荐

    在Web关闭页面时发送Ajax请求的实现方法

    在Web开发中,有时我们想要在用户关闭页面的时候执行一些操作,比如发送一个Ajax请求到服务器进行数据上报或者完成某些清理工作。为了实现这个功能,我们可以利用浏览器提供的事件监听机制,特别是`beforeunload`和`...

    结合AJAX进行PHP开发之入门

    【标题】:“结合AJAX进行PHP开发之入门” 【描述】:本文主要介绍如何使用AJAX(异步JavaScript和XML)技术与PHP结合,构建一个简单的相册应用。首先,我们将通过传统Web应用程序的方式实现相册功能,然后利用...

    AJAX无刷新源代码

    2. 发起HTTP请求:通过XMLHttpRequest对象的open()和send()方法,可以向服务器发送GET或POST请求,请求可以携带参数,比如用户的输入数据。 3. 处理服务器响应:当服务器返回响应时,XMLHttpRequest对象的...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -添加定时器控件Timer,用来定时发起AJAX请求。 +2009-09-06 v2.1.0 -Button的Pressed属性值能够正确的反映客户端的变化。 -优化Tree控件的AJAX实现。 +为页面的Form添加autocomplete="off"属性。 -参考...

    flex与服务端通信的as封装源码(同步、异步两种方式)

    - **HttpRemote.as**:此文件可能封装了与服务端通信的核心逻辑,包括初始化HttpService,设置请求参数,处理响应等。 - **AjaxRequestType.as**:这个文件可能是定义请求类型的枚举类,比如区分GET和POST请求,...

    HTTP-Proxy-Servlet:Smiley的HTTP代理实现为Java Servlet

    HTTP代理对于AJAX应用程序与托管Web应用程序以外的主机上的Web可访问服务进行通信很有用。 它是反向代理,实际上不是转发代理,尽管Servlet的模板形式可能会使这条线模糊。 这几乎不是第一个代理,为什么我要编写...

    kindeditor图片上传携带token字段

    2. **使用Ajax改造上传**:由于KindEditor默认的上传方式可能不支持自定义token,我们需要自定义上传逻辑。在`beforeUpload`回调函数中,我们可以使用原生的XMLHttpRequest或者现代浏览器的fetch API来发送带有token...

    ExtAspNet_v2.3.2_dll

    -添加定时器控件Timer,用来定时发起AJAX请求。 +2009-09-06 v2.1.0 -Button的Pressed属性值能够正确的反映客户端的变化。 -优化Tree控件的AJAX实现。 +为页面的Form添加autocomplete="off"属性。 -参考...

    Java面试框架高频问题2019

    - 使用`@ModelAttribute`将请求参数自动绑定到Java对象。 **问题十七:SpringMvc中函数的返回值是什么?** - 可以是视图名称或模型数据。 **问题十八:SpringMvc用什么对象从后台向前台传递数据的?** - 使用`...

    Delphi 下用 Intraweb 开发WEB程序应用实战(2.0).pdf

    - **超链接改造**:将普通超链接转换为 AJAX 请求。 - **参数传递**:实现在点击超链接时向服务器发送特定参数。 ##### 3.6 实现网页复杂提示信息框 - **设计思路**:考虑提示信息的样式和内容。 - **交互效果**:...

    jQuery ajax 路由和过滤器使用说明

    而在改造之前,同一个请求需要发送到`/ajax.php`并带上一系列的参数,包括dir、page、action以及args。很明显,改造后的调用方式更加简洁明了,更符合良好设计的Web API标准。 总结一下,通过使用jQuery的...

    jquery.paginate插件源码改造:支持动态分页

    // 这里可以使用Ajax请求或其他方式获取数据 // page: 当前页码,pageSize: 每页大小 return $.ajax({ url: 'api/data', type: 'GET', data: { page: page, size: pageSize }, success: function(data) { //...

    海康威视二次开发问题

    前端将这些参数通过Ajax发送到后端服务器,服务器接收到请求后,调用SDK中的检索接口,查找该时间段内的录像文件。 在后端,开发者需要实现一个新的接口,这个接口接受时间区间作为输入,查询海康威视设备上的录像...

    基于jQuery的FlexiGrid的插件使用和改造

    比如,你可以调整分页请求的参数,或者增加新的数据处理逻辑。 2. 兼容性优化:确保插件在各种浏览器下正常工作,包括IE8及更低版本。 3. 性能优化:合理设置列宽和数据加载量,避免一次性加载过多数据导致页面...

    基于jsp+servlet+javaBean的图书管理系统.zip

    2. Servlet:Servlet是Java的一个接口,用于扩展服务器的功能,处理HTTP请求。在图书管理系统中,Servlet充当了后台逻辑的中心,接收并响应用户的请求,如登录验证、图书查询、借阅操作等。通过定义不同的Servlet,...

    二次开发使用 WEB32网页调用接口说明.zip_aloudv4k_二次开发使用 WEB32网页调用接口说明

    在IT行业中,二次开发是指基于现有软件或系统进行的定制化改造或功能扩展,以满足特定用户需求。在这个场景中,我们关注的是"WEB32网页调用接口"的二次开发使用,它涉及到如何通过网页与后台服务进行交互,实现功能...

    springCloud

    1、提交代码触发post请求给bus/refresh 2、server端接收到请求并发送给Spring Cloud Bus 3、Spring Cloud bus接到消息并通知给其它客户端 4、其它客户端接收到通知,请求Server端获取最新配置 5、全部客户端均获取到...

    基于springboot,采用mybatis和mapper3插件,基于shiro的sso cookies单机实现+源代码+文档说

    10. 基于 shiro 改造的 sso 单机实现,登录生成 token 存储在用户 cookies 中,请求解析 cookies,以解析成功作为标识。 11. 交互上使用 layui,使用第三方功能。 12. 热刷新实体 mapper.xml文件 MapperRefresh.java...

    fastadmin版多商户不限坐席php插件

    前端通过Ajax或其他异步方式实时获取反馈信息,提供给用户。`config.php`中的配置决定了插件的行为,而`info.ini`则提供了插件的元数据信息。整个过程中,PHP的面向对象编程和FastAdmin的框架优势得以充分发挥,使得...

    oschina+技术架构介绍.ppt

    首先,OSChina 的每日访问量非常大,IP 超过10万,动态请求高达300万,其中页面请求80万,Ajax 请求220万。高峰期并发连接数可达2000。为了应对这样的流量,OSChina 的硬件配置包括一台DELL SC 1435 服务器,配备双...

Global site tag (gtag.js) - Google Analytics