ajax的运用及跨域的运用
来源:3-5 跨域调用
迷失的小麦
2020-01-22 17:39:10
能不能用通俗的语言解释下什么是ajax的原理和跨域的原理?
请老师另外举一个跨域的例子运用,帮助我理解?
这个应该运用到服务器的知识吧,请问我如何在pc端测试是否代码正确?
// 封装通用的xhr,兼容各个版本
function createXHR() {
//判断浏览器是否将XMLHttpRequest作为本地对象实现,针对IE7,Firefox,Opera等浏览器
if (typeof XMLHttpRequest != "undefined") {
return new XMLHttpRequest();
} else if (typeof ActiveXObject != "undefined") {
//将所有可能出现的ActiveXObject版本放在一个数组中
var xhrArr = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
//遍历创建XMLHttpRequest对象
var len = xhrArr.length;
for (var i = 0; i < len; i++) {
try {
//创建XMLHttpRequest对象
xhr = new ActiveXObject(xhrArr[i]);
//如果创建XMLHttpRequest对象成功,则跳出循环
break;
} catch (ex) {}
}
} else {
throw new Error("No XHR object available.");
}
}
var xhr = createXHR(),
data = null; //用于接收服务器端返回的数据
//响应XMLHttpRequest对象状态变化的函数
xhr.onreadystatechange = function() {//当readyState属性状态发生改变调用事件
//异步调用成功
if (xhr.readyState === 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {//前面表示异步调用成功,后面表示请求资源没有被修改
//获得服务器返回的数据
data = JSON.parse(xhr.responseText);
//data=eval("("+xhr.responseText+")");
//eval("("+xhr.responseText+")"); 的意思是强制转化成json对象,之所以写成 eval“("("+data+")");这种格式,原因是由于json是以”{}”的方式来开始以及结束的。在JavaScript中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式,加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为语句来执行
//将响应信息作为字符串返回responseText
//console.log(data.slider);
//渲染数据
renderDataToDom();
} else {
console.log('unsuccess');
}
}
};
//创建http请求
xhr.open('get', './server/slider.json', false);
//发送http请求
xhr.send(null);
//发送请求的两种方式
//xhr.send({user:"zhangsan",id:6});//post
//xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//get//xhr.open('get', './server/slider.json?user=zhangsan&id=6', false);
//渲染数据
function renderDataToDom() {
var img = data.slider,
i,
len = img.length,
str = "",
banner = document.getElementById("banner");
//遍历数据,拼接字符串
for (i = 0; i < len; i++) {
//第二种写法
/*var a=document.createElement("a");
a.href=img[i].linkUrl;
a.innerHTML='<img src="' + img[i].picUrl + '">';
banner.appendChild(a);*/
str += '<a href="' + img[i].linkUrl + '"><img src="' + img[i].picUrl + '"></a>'
}
// 渲染图片信息
banner.innerHTML = str;
}
// jquery请求
$.ajax({
url: "./server/slider.json",//请求地址
type: "post",//请求方式
dataType: "json",//数据格式
async: true,//同步异步
success: function(datas) {//请求成功的回调
renderData(datas.slider);
}
})
// jquery渲染数据
function renderData(data) {
var str = "";
$.each(data, function(index, obj) {
str += '<a href="' + obj.linkUrl + '"><img src="' + obj.picUrl + '"></a>'
})
$("#banner_jq").html(str);
}
// // 封装一个jsonp函数,实现跨域
function getJSONP(url, callback) {
if (!url) {
return;
}
var a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']; //定义一个数组以便产生随机函数名
//为保证Jsonp正常运作,在发出请求之前需要在window对象上放置回调函数。假设回调函数不是随机的,那在连续JSONP请求时,后发出的请求放置的回调函数会覆盖掉之前的,回调数据会出问题
var r1 = Math.floor(Math.random() * 10);
var r2 = Math.floor(Math.random() * 10);
var r3 = Math.floor(Math.random() * 10);
var name = 'getJSONP' + a[r1] + a[r2] + a[r3];
var cbname = 'getJSONP.' + name; //作为jsonp函数的属性
if (url.indexOf('?') === -1) {//判断url地址中是否有?号
url += '?jsonp=' + cbname;
} else {
url += '&jsonp=' + cbname;
}
var script = document.createElement('script');//动态创建script标签
//定义被脚本执行的回调函数
getJSONP[name] = function(e) {
try {
callback && callback(e);//if语句可以代替
} catch (e) {
//
} finally {
//最后删除该函数与script元素
delete getJSONP[name];
script.parentNode.removeChild(script);
}
}
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
// 跨域调用
getJSONP('http://class.imooc.com/api/jsonp', function(response) {
console.log(response);
});1回答
好帮手慕星星
2020-01-22
同学你好,问题解答如下
1、ajax过程可以分为5个步骤,拿买东西举例:
自己需要先想好买什么,准备好(创建XMLHttpRequest),然后通知服务员(连接服务器),告知服务员具体要买什么(发送请求),服务员了解之后去货架上找(服务器做出响应),把商品给你,你拿到商品(接收响应数据),简单理解就是一个获取数据的过程。
详细过程可以看一下相关手记:
https://www.imooc.com/article/35241
2、课程中是通过script标签进行跨域的,利用 script 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据,JSONP请求一定需要对方的服务器做支持才可以。
3、跨域的例子需要接口链接,目前使用课程中给出的链接测试就好,以后在实际工作中后台会提供数据接口。这里就是调用封装的跨域函数

4、课程中用的是wampserver服务器,资料中也有安装使用流程:

自己可以安装一下。如果这个服务器安装或者启动不成功,资料中还有一个PHPstudy服务器使用流程,也可以用这个:

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~