小皮球,下脚踢,马莲开花JSONP

简单直白的实现jsonp

昨天和小伙伴聊天,聊到ajax和jsonp,网上关于jsonp的原理文章不少,可是由于jquery的封装,好多人觉得ajax和jsonp是一回事,那么他们有什么不一样呢?时间宝贵,咱们用简短的方式了解一下jsonp。javascript

一个get请求的样子

正常的一个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;
        }
    }复制代码

jsonp是怎么实现的?

  • 不是XHR对象:jsonp并不调用XHR,并且和XHR没什么关系,是为了实现跨域,而衍生出来的一个野路子(相对于XHR),现在已经已被你们普遍使用,相信看完这个你也就知道为何jquery封装的jsonp不能设置同步了前端

  • 实现原理java

    1. 建立script标签,插入到页面,引入js文件。
    2. js文件加载完成后执行引入的js文件方法,而且return数据。

直白的展现

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>复制代码

本身来写一个jsonp

原理咱们清楚之后,实现起来就简单了,无非就是封装一个方法,把文件地址、回调名称、回调函数封装一下。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

相关文章
相关标签/搜索