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

js请求(2)

阅读更多
<html>
<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
	<title>js请求</title>
	<script src="http://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
</head>
<body>
	<input id="btn1" type="button" value="发送请求" />
</body>
</html>

<script type="text/javascript">
	//兼容ie浏览器测试
	var console = console || {};
	console.log = console.log || function(a){
		alert(a);
	}

	/*
	ajax工厂模式
	每次都实例化一个单独的对象,各自保存自己的状态.
	通常一些需要包含自身业务的组件可以采用工厂来封装,比如日历,表格等.
	*/
	function Ajax(obj){
		//请求方式GET/POST,默认GET
		this.method = obj.method.toUpperCase() || "GET";
		//请求类型,如果不是同步就默认异步
		this.async = obj.async == false ? false : true;
		//请求参数
		this.data = obj.data || null;
		//成功返回函数
		this.success = obj.success || function(){};
		//失败返回函数
		this.failure = obj.failure || function(){};
		//请求地址
		this.url = obj.url || null;

		this.init.apply(this,arguments);
	}
	Ajax.prototype = {
		//请求对象数组
		requests:[],
		xhr:null,
		init:function(){
			var xhr = null;
			//判断是否当前有空闲的xhr
			for(var i = 0,len = this.requests.length; i < len; i++){
				//当xhr的readyState状态为0/4,都可以标识当前xhr是空闲状态.
				xhr = this.requests[i];
				//0:还未连接,4:请求完成
				var state = xhr.readyState;
				if(state === 0 || state === 4){
					break;
				}
				else{
					//没有空闲,置成null值,去创建一个新的.
					xhr = null;
				}
			}
			//这个地方还可以做成如果请求数大于N个,那么等待空闲xhr.

			//如果没有空闲的,创建一个新的.
			if(xhr === null){
				//创建新的xhr
				this.xhr = this.createHttpRequest();
				this.requests.push(this.xhr);
				//发送请求
				this.sendRequest();
			}
			else{
				this.xhr = xhr;
				//发送请求
				this.sendRequest();
			}
		},
		createHttpRequest:function(){
			console.log("createHttpRequest!!!");
			var xmlhttp = null;
			//XMLHttpRequest对象是w3c标准对象,所以IE君又不支持了.
			if(window.XMLHttpRequest){
				//非IE
				xmlhttp = new XMLHttpRequest();
			}
			else{
				if(window.ActiveXObject){
					//IE
					try{
						xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
					}
					catch(e){
						xmlhttp = new ActiveXObject("msxml2.XMLHTTP");
					}
				}
				else{
					console.log("浏览器不支持!");
				}
			}
			return xmlhttp;
		},
		//发送ajax请求
		sendRequest:function(){
			//格式化data符合url传参格式,并不适用任何情况数据
			function dataformat(data){
				var d = "";
				var t = new Date() - 0;
				if(typeof data == "object" && data != null){
					for(var k in data){
						d += k + "=" + data[k] + "&"
					}
					//动态添加时间参数,减0转化成毫秒
					d = d + "t=" + t;
					return d;
				}
				else{
					//如果是字符串直接返回
					return data + "&t" + t;
				}
			}
			function fn(){}

			//请求参数
			var method = this.method;
			var async = this.async;
			var data = this.data;
			var success = this.success;
			var failure = this.failure;
			var url = this.url;

			if(url != null){
				//如果是GET请求把参数拼接到url后面
				if(method == "GET" && data){
					//格式化请求参数
					var condi = dataformat(data);
					url += (url.indexOf("?") == -1 ? "?" : "&") + condi;
					//GET请求send参数null
					data = null;
				}

				var xhr = this.xhr;
				//绑定回调函数
				xhr.onreadystatechange = function(scope){
					return function(){
						scope.callback.apply(scope,arguments);
					}
				}(this);

				//打开请求url
				xhr.open(method,url,async);

				//如果是POST请求需要添加头信息
				if(method == 'POST'){
					xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded;');
				}

				//发送http请求
				xhr.send(data);
			}
			else{
				//没有指定请求请求地址
			}
		},
		callback:function(){
			/*
			readyState一共有五个状态
			0 还未连接,还没有调用open().
			1 打开请求连接,还没有调用send().
			2 发送请求,还没有收到服务器响应.
			3 数据接收,已经收到服务器响应.
			4 数据接收完毕,跟服务器交互完毕.
			*/
			var xhr = this.xhr;
			if(xhr.readyState == 4){
				//http状态
				var status = xhr.status;
				if(status >= 200 && status < 300){
					//请求成功
					this.success(xhr);
				}
				else{
					//请求错误
					this.failure(xhr);
				}
			}
			else{
				//请求失败
			}
		}
	};

	//一个例子
	var btn1 = document.getElementById("btn1");
	btn1.onclick = function(){
		setTimeout(function(){
			test1(1);
		},1000);
		setTimeout(function(){
			test2(2);
		},2000);
	}

	function test1(num){
		var ajax = new Ajax({
			url:"http://192.168.3.209/php/test.php",
			method:"GET",
			//传递参数
			data:{name:"康德" + num,address:"当看到" + num},
			success:function(xhr){
				//服务器返回结果
				console.log(xhr.responseText);//{"name":"康德1","address":"当看到1"}
			},
			error:function(xhr){
				console.log(xhr);
			}

		});
	}

	function test2(num){
		var ajax = new Ajax({
			url:"http://192.168.3.209/php/test.php",
			method:"GET",
			//传递参数
			data:{name:"康德" + num,address:"当看到" + num},
			success:function(xhr){
				//服务器返回结果
				console.log(xhr.responseText);//{"name":"康德2","address":"当看到2"}
			},
			error:function(xhr){
				console.log(xhr);
			}

		});
	}

	/*
	知识点:
	1.ajax简单工厂封装.
	2.ajax连接池简单现实.
	*/
</script>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics