ajax Class

/************************************************************************
//封装ajax
	首先一个xhr自执行,创建一个xmlhttprequest的对象.这里的对象,兼容IE和W3C
		obj 是一个键值对,
					method 	: get或者post
					async  	: false同步, true异步.(一般都有true)
					success	: function() {}, 成功返回的回调函数, 参数是服务器返回的值
					data 	: 一个键值对,向服务器发送的数据.
例子: 
	$sy().ajax({
		method : 'get',
		url : 'demo.php',
		data : {
			'name' : 'Lee',
			'age' : 100
		},
		success : function (text) {
			alert(text);
		},
		async : true
	});

ajax执行顺序是,open,send, 接受数据
	
	xhr.readyState == 4             4,完成接受到了全部数据,可以执行success
						0,维初始化,没有调用open
						1,启动,调用了open,但为调用send
						2,调用了send,但未接受响应.
						3,接收到部分数据的相应.


	shr.status == 	200 OK, 
					400,语法错误导致服务器不识别
					401,请求需要用户认证
					404,指定的url服务器找不到.
					500,服务器的意外错误.

************************************************************************/

Osye.prototype.ajax  = function (obj) {
	var xhr = (function () 
	{
		if (typeof XMLHttpRequest != 'undefined') 
		{
			return new XMLHttpRequest();
		} 
		else if (typeof ActiveXObject != 'undefined') 
		{
			var version = [ 'MSXML2.XMLHttp.6.0',		//这三个是兼容低版本的IE
							'MSXML2.XMLHttp.3.0',
							'MSXML2.XMLHttp'];

			for (var i = 0; version.length; i ++) 
			{
				try {
					return new ActiveXObject(version[i]);
				} catch (e) {
					//跳过
				}	
			}
		} 
		else 
		{
			throw new Error('sorry, your browser is not support ajax, please change other browser. thanks.');
		}
	})();

	if (obj.async == undefined) {	//如果没有传入async.默认是异步
		obj.async = true;
	}

	obj.url = obj.url + '?rand=' + Math.random();	//加一个随机数,保证每次不一样.都可以返回
	
	obj.data = (function (data) {					//函数自执行,将传输的数据,赋值给url字符串.
		var arr = [];
		for (var i in data) {
			arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
		}
		return arr.join('&');					//为键值对之间加入&,保持键值对的可识别性.
	})(obj.data);		

	if (obj.method === 'get'){		//将数据,添加到url后面.
		obj.url += obj.url.indexOf('?') == -1 ? '?' + obj.data : '&' + obj.data;
		// alert(obj.data);		//测试键值对
	} 	

	xhr.open(obj.method, obj.url, obj.async);		//发送请求类型,method,方法,url链接,async是否同步.

	if (obj.async === true) {			     //异步事件,onreadystatechange.
		xhr.onreadystatechange = function () {
			if (xhr.readyState == 4) {	     //成功返回.
				callback();
			}
		};
	}

	if (obj.method === 'post') {		 //post方法
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xhr.send(obj.data);	
	} 
	else {			          //get,数据已经发出去了.在浏览器的网址输入栏里
		xhr.send(null);
	}

	if (obj.async === false) 	     //同步,就直接会回调
	{
		callback();
	}

	function callback() {
		if (xhr.status == 200) 					//200成功返回.
		{
			obj.success(xhr.responseText);			//回调传递参数
		} 
		else
		{
			//获取数据错误,打出错误代号和错误信息.
			alert('To get the data error! Error code' + xhr.status + ',Error message:' + xhr.statusText);
		}	
	}
}

 

原文地址:https://www.cnblogs.com/hgonlywj/p/4868941.html