昨天和小伙伴聊天,聊到ajax和jsonp,网上关于jsonp的原理文章不少,可是由于jquery的封装,好多人觉得ajax和jsonp是一回事,那么他们有什么不一样呢?时间宝贵,咱们用简短的方式了解一下jsonp。javascript
正常的一个get请求是经过建立XHR对象,调用XHR对象的open、send、onreadystatechange方法来完成一次请求。html
var XHR=new XMLHttpRequest();//建立实例
//启动
XHR.open("GET","test1.txt",true);
//发送
XHR.send();
//监听执行状态
XHR.onreadystatechange=function() {
//状态判断
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// responseText:响应数据、readyState:响应状态、status:响应状态码
document.getElementById("myDiv").innerHTML=XHR.responseText;
}
}复制代码
不是XHR对象:jsonp并不调用XHR,并且和XHR没什么关系,是为了实现跨域,而衍生出来的一个野路子(相对于XHR),现在已经已被你们普遍使用,相信看完这个你也就知道为何jquery封装的jsonp不能设置同步了。前端
实现原理java
data.js为须要请求引入的js文件jquery
//data.js
function data(){
return 'hello'
};复制代码
index.htmlajax
<script src="data.js"></script>
<script>
var value = data();
alert(value);//弹出hello
</script>复制代码
原理咱们清楚之后,实现起来就简单了,无非就是封装一个方法,把文件地址、回调名称、回调函数封装一下。json
data.js跨域
//具体方法名可以让后台接收入参而且给你拼接出方法名`
function data(){
return 'hello'
};复制代码
index.html微信
<script>
function jsonp(src,callbackName,fn){//构造函数, src:js地址,callbackName:回调名称,fn:回调方法
// 建立script标签
var El = document.createElement('script');
// 设置src属性为地址
El.setAttribute('src',src);
// 插入到body中
document.body.appendChild(El);
El.onload= function(){ // 加载完成回调
var cbFneval = eval(callbackName); // 根据callbackName入参字符串转换成可执行函数
var value = cbFneval(); // 执行callbackName(),得到返回的相应数据
fn(value); // 执行回调方法并传入数据
document.body.removeChild(El) //移除script标签
};
};
// 执行jsonp方法
jsonp('data.js','data',function(data){
alert(data);
});
</script>复制代码
本文对你有帮助?欢迎扫码加入前端学习小组微信群:app