前端学习笔记-8.4数据交互

AJAX是动态的从其他网页获取,
JSONP是通过script引入,
CORS:跨域资源共享
和JSONP的编码没有区别,jsonp支持GET,cors都支持。

1.AJAX:Asyncchronous JavaScript and XML,用JavaScript执行异步网络请求

如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面,这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新。

AJAX请求是异步执行的,也就是说,要通过回调函数获得响应

目前AJAX主要依靠XMLHttpRequest对象:

		function success(text){
			var textarea = document.getElementById('test-response-text');
			textarea.value = text;
		}
		
		function fail(code){
			var textarea = document.getElementById('test-response-text');
			textarea.value = 'Error code:'+code;
		}
		var request = new XMLHttpRequest();//新建XMLHttpRequest
		
		response.onreadystatechange = function(){//状态发生变化时,函数被回调
			if(request.readyState === 4){//成功完成
			//判断响应结果:
			if(request.status === 20){
				//成功,通过responseText拿到响应的文本:
				return success(request.responseText);
			}else{
				//失败,根据响应码判断失败原因:
				return fail(request.status);
			}
			}else{
				//HTTP请求还在继续...
			}
		};
		
		//发送请求:
		request.open('GET','/api/categories');
		request.send();
		
		alert('请求已发送,请等待响应...');*/

对于低版本的IE,需要用ActiveXObject对象:

		function success(text) {
		    var textarea = document.getElementById('test-ie-response-text');
		    textarea.value = text;
		}
		
		function fail(code) {
		    var textarea = document.getElementById('test-ie-response-text');
		    textarea.value = 'Error code: ' + code;
		}
		
		var request = new ActiveXObject('Microsoft.XMLHTTP'); // 新建Microsoft.XMLHTTP对象
		
		request.onreadystatechange = function () { // 状态发生变化时,函数被回调
		    if (request.readyState === 4) { // 成功完成
		        // 判断响应结果:
		        if (request.status === 200) {
		            // 成功,通过responseText拿到响应的文本:
		            return success(request.responseText);
		        } else {
		            // 失败,根据响应码判断失败原因:
		            return fail(request.status);
		        }
		    } else {
		        // HTTP请求还在继续...
		    }
		}
		
		// 发送请求:
		request.open('GET', '/api/categories');
		request.send();
		
		alert('请求已发送,请等待响应...');*/

标准写法和IE写法混在一起,可以这么写:

var request;
			if(window.XMLhttpRequest){
				request = new XMLHttpRequest();
			}else{
				request = new ActiveXObject('Microsoft.XMLHTTP');
			}

AJAX的封装一:

function ajax(options){
	var xhr = null;
	var params = formsParams(options.data);
	//创建对象
	if(window.XMLHttpRequest){
		xhr = new XMLHttpRequest();
	}else{
		xhr = new ActiveXObject("Microsoft.XMLHTTP");//兼容IE
	}
	//链接
	if(options.type =="GET"){
		xhr.open(options.type,options.url+ "?" + params,options.async);
		xhr.send(null);
	}else if(options.type=="POST"){
		xhr.open(options.type,options.url,options.async);
		xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		xhr.send(params);
	}
	xhr.onreadystatechange = function(){
		if(xhr.readyState ==4&& xhr.status ==200){
			options.success(xhr.responseText);
		}
	}
	function formsParams(data){
		var arr = [];
		for(var prop in data){
			arr.push(prop + "=" data[prop]);
		}
		return arr.join("&");
	}
}

2.JSONP跨域
JSONP,它有个限制,只能用GET请求,并且要求返回javascript。这种方式跨域实际上是利用了浏览器允许跨域引用javascript资源。
JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。

它的基本思想是,网页通过添加一个script元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。

首先,网页动态插入script元素,由它向跨源网址发出请求。

function addScriptTag(src) {
var script = document.createElement(‘script’);
script.setAttribute(“type”,“text/javascript”);
script.src = src;
document.body.appendChild(script);
}

window.onload = function () {
addScriptTag(‘http://example.com/ip?callback=foo’);
}

function foo(data) {
console.log('Your public IP address is: ’ + data.ip);
};
上面代码通过动态添加script元素,向服务器example.com发出请求。注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字,这对于JSONP是必需的。

服务器收到这个请求以后,会将数据放在回调函数的参数位置返回。

foo({
“ip”: “192.168.45.145”
});
由于script元素请求的脚本,直接作为代码运行。这时,只要浏览器定义了foo函数,该函数就会立即调用。作为参数的JSON数据被视为JavaScript对象,而不是字符串,因此避免了使用JSON.parse的步骤

3.跨域资源共享CORS
4.Promise
5.Axios

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值