jsonp 指南

jsonp 的本质就是在页面创建一个 script 标签引入一段 js 执行而已.

回调函数的名字 通过 url 传给后台, 后台返回一段 js 代码, 这段代码在这个 js 文件加载完后自动执行, 而正是在这段 js 代码里, 我们执行了 回调函数.

好, 我们来举个完整的例子.

我们要从域名 qq1.com 某页面发送请求到 qq2.com.

前台页面可以这样写:

var el = document.createElement('script');                   // 创建一个 script 标签
el.src = '//qq2.com/users?name=刘看山&callback=onSuccess';    // 设置 url 属性, 注意参数
document.body.appendChild(el);                               // 把标签插到页面里去

function onSuccess(resp) {                                   // 回调函数, 暴露在全局
    console.log(resp);                                       // 回调函数主体
}

你看第 2 行, 我们把回调函数名当成参数放到了 url 里, 我们还带了另一个参数 name, 这样后台就可这样写(php):

// 这里只举例, 没有对参数过滤, :)
$callback = $_GET['callback'];                               // 拿到前台回调函数名

// 然后在这里进行业务逻辑处理
// 如根据参数里的 name 从数据库取出用户信息
$name = $_GET['name'];                                       
$user_info = json_encode($this->getUserInfo($name));         // 转成 json 格式

echo "$callback($user_info)";                                // 用回调函数包起来, 
                                                             // 把 json 数据当参数传进去,
                                                             // 整个以文本输出给前台

当这个请求完后, 前台拿到的所有东西可能长这样:

onSuccess({"user_id"=100,"name"="刘看山","gender"="M"})

script 脚本请求完后立即自动执行了, 也就是执行了你页面上等了很久的回调函数了. 讲完了. 理解了没?

你看, 传到回调函数里的是一个对象.

----------- cut ------------

我们把前台代码改成 jQuery 版的:

$.ajax({
    url: '//qq2.com/users',         // 设置 url
    dataType: 'jsonp',
    data: {
        name: "刘看山"               // 设置向后台传的参数 
    }, 
    timeout: 30000
}).done(function(resp) {
    console.log(resp);              //  你只用放心地在这里写你的回调函数就好
}).fail(function(x, t, m) {
    if(t==="timeout") {
    // 请求超时, 失败, 也有可能是后台出错了, 什么都没有返回, 才没有触发回调函数
    // 你只能在判断超时来确定的确是否出错了
    // 因为脚本要是没加载进来, 不再会有其它任何函数触发
    }
}

你看, jQuery 版没有写 callback=onSuccess 在 url 里, 也没有当参数跟 name 放到一起.
因为 jQuery 会自动给你创建一个全局的函数, 把你的回调函数赋给它, 如, 可能长这样:

jQuery11130629023184068501_1447428071106(resp) {
    console.log(resp);  
}

如此不好记的函数名, 相信也不会跟你的全局函数冲突吧. 😄

而它加到页面上的 script 可能长这样:

<script src="//qq2.com/users?callback=jQuery11130629023184068501_1447428071106&name=\"刘看山\""></script>

我们没有改后台, 那这个请求返回的东西应该还是:

jQuery11130629023184068501_1447428071106({"user_id"=100,"name"="刘看山","gender"="M"})

理解了嘛? 理解了请点小星星, 没理解请在下面提问.
快来群里玩, 豪情的专业前端群:492107297 发大图自由群:343243212 😃

posted @ 2016-12-19 14:20  shrekuu  阅读(136)  评论(0编辑  收藏  举报