美文网首页
什么是jsonp

什么是jsonp

作者: pengtoxen | 来源:发表于2019-04-30 14:38 被阅读0次

    先来看一个简单的例子

    var script  = document.createElement('script');
    script.src = 'localhost:80/test.php';
    ducument.body.appendChild(script);
    

    上面这段代码在body中创建了一个script标签,script的src属性指向本地的一个php脚本.这段代码执行后,在控制台可以看到请求了php脚本并返回了响应.提示未定义的函数foo.

    什么鬼?我请求一个php脚本,结果提示函数foo未定义.发生了什么?

    我们先来看看php脚本是怎么样的

    <?php
    header('Content-Type:application/javascript');
    $json = json_encode(array('time'=>time()));
    
    echo "foo({$json})";
    

    我看到其实这个php脚本返回的是个字符串 foo(xxxxx);返回的mime是javascript.

    我们理一下逻辑:
    1.body中新增一个script标签后,请求php脚本;
    2.php脚本返回了一个字符串,mime是javascript;
    3.页面执行了php返回的脚本foo(xxx);
    4.没有找到定义的foo函数,报错;

    从上面可以知道,这里的script脚本是异步执行返回的.

    现在我们把php脚本改为另外一个域的.例如www.test.loc/test.php;
    结果和本地的php脚本一致.

    那什么是jsonp?
    其实就是通过script标签请求一个服务端的文件,通过这个文件返回的结果是一段js,作用是调用我们定义好的一个函数,从而将服务端想要给客户端发过去的数据发送给客户端

    当然上面的调用函数foo显然是理想情况,即外部已经定义好了.
    我们再来封装一下

    function jsonp(url, params, callback) {
        var funName = 'callback_' + Data().now() + Math.random().toString().substr(2, 5);
        if (typeof params === 'object') {
            var tempArr = [];
            for (var key in params) {
                var value = params[key];
                tempArr.push(key + '=' + value)
            }
            params = tempArr.json('&');
        }
    
        var script = document.createElement('script');
        script.src = url + '?' + params + '&callback=' + funcName;
        document.body.appendChild(script);
        window[funcName] = function (data) {
            callback(data);
        }
    }
    
    jsonp('http://www.test.com/test.php', { id: 1 }, function (res) { console.log(res); })
    

    这样就能请求jsonp了

    相关文章

      网友评论

          本文标题:什么是jsonp

          本文链接:https://www.haomeiwen.com/subject/pxtvnqtx.html