专栏名称: JavaScript
面向JavaScript爱好人员提供:前端最新资讯、原创内容、JavaScript、HTML5、Ajax、jQuery、Node.js等一系列教程和经验分享。
目录
相关文章推荐
51好读  ›  专栏  ›  JavaScript

JSONP是什么

JavaScript  · 公众号  · Javascript  · 2016-12-29 11:38

正文

转自 https://segmentfault.com/a/1190000007935557

一、JSONP的诞生

  • 首先,因为ajax无法跨域,然后开发者就有所思考

  • 其次,开发者发现,

    这边做的就是直接引入一个js,页面将会弹出一个提示窗体,显示 我是远程文件。

    【栗子二】
    跨域服务器

    文件:remote.js 
    代码:

    localHandler({"result":"我是远程js带来的数据"});

    本地

    这边做的是 
    1、本地定义一个函数 
    2、引入一个js 
    3、被引入的js里面,调用这个函数

    页面将会弹出一个提示窗体。显示本地函数被跨域的远程js调用成功,并且还接收到了 我是远程js带来的数据。 
    新问题出现了:让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同啊?

    【栗子三】

    跨域服务端提供的js脚本动态生成,这样调用者可以传一个参数过去告诉跨域服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是跨域服务器就可以按照客户端的需求来生成js脚本并响应了。

    跨域服务器

    文件:flightResult.php 
    代码:

    flightHandler({

       "code":"CA1998",

       "price": 1780,

       "tickets": 5

    });

    本地

    这次我们做的是 
    1、动态创建脚本 
    2、url中传递了一个code参数,服务器去做查询CA1998次航班的信息,callback参数告诉服务器,我的本地回调函数叫做flightHandler 
    3、跨域服务端调用这个函数flightHandler 页面将会弹出一个提示窗体。把票价、余票以及张数给传递回来了。

    三、那么服务器到底做了什么呢? 说到底,就是拼接字符串。

    // 数据

    $data = [

       "name":"anonymous66",

       "age":"18",

       "like":"jianshu"

    ];

    // 接收callback函数名称

    $callback = $_GET['callback'];

    // 输出

    echo $callback . "(" . json_encode($data) . ")";

    四、与AJAX的区别是什么?

    ajax和jsonp本质上是不同的东西。 
    ajax的核心是通过XmlHttpRequest获取非本页内容 
    jsonp的核心则是动态添加