面试中平常会问到怎么样行使jsonp跨域(jsonp跨域的原理是怎么样),那篇小说就给大家介绍一下巢毁卵破的文化,如有不对,麻烦指出
~

1. 第②我们比较一下json和jsonp
  • JSON是一种基于文本的数据沟通方式,或许叫做数据描述格式;
  • JSONP是一种不合法跨域数据交互协议;
2.为何会油然则生jsonp
1)、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准。
2)、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>)。
3)、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。
4)、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。
5)、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。
6)、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。
7)、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

3.jsonp完成例子

  • 比方远程的服务器remoteServer.com上有一段js文件,内容为:

alert("hello world");

作者们当地localhost.com上有3个页面,里面引入了地点的js文件,当大家在浏览器中开拓此页面时,会意识可以成功的弹出hello
world,那就代表跨域调用成功了。

  • 怎样跨域远程获取数据呢
    当地localhost.com上有1个页面localhost.html,页面内容为:

<html>
  <head> 
    <title></title> 
    <script type="text/javascript"> 
      var localHandler = function(data){ 
          alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result); 
      };                  
    </script> 
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
    </head>
<body>
</body>
</html>

remoteserver.com上的remote.js文件内容:

localHandler({"result":"hello world"});

咱俩在浏览器中开辟此页面localhost.html,发现弹出了

我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:hello world
跨域远程获取数据的目标基本完毕了,不过又八个题材应运而生了,小编怎么让长途js知道它应当调用的地面函数叫什么名字啊?毕竟是jsonp的服务者都要面对许多劳动对象,而这几个服务目的分其余本土函数都不平等啊?

<br >

  • 杀鸡取卵长途服务器不明白该调用什么函数的题材

思路:只要服务端提供的js脚本是动态变化的,这样调用者可以传多少个参数过去报告服务端
“作者想要一段调用XXX函数的js代码,请你回来给小编”,于是服务器就足以根据客户端的要求来生成js脚本并响应了。

再看 localhost.html

<html>
  <head> 
    <title></title> 
    <script type="text/javascript"> 
       // 得到航班信息查询结果后的回调函数 
      var flightHandler = function(data){ 
          alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。'); 
      };
       // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码) 
      var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler"; 
      // 创建script标签,设置其属性 
      var script = document.createElement('script'); 
      script.setAttribute('src', url); 
      // 把script标签加入head,此时调用开始
      document.getElementsByTagName('head')[0].appendChild(script); 
    </script> 
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
    </head>
<body>
</body>
</html>

作者们见到调用的url中传送了一个code参数,告诉服务器自身要查的是CA一九九六次航班的音讯,而callback参数则告知服务器,作者的地面回调函数叫做flightHandler,所以请把询问结果传到那一个函数中展开调用。
flightResult.aspx中:

{
  "code": "CA1998", 
  "price": 1780,
   "tickets": 5
}
  • 打包代码,jquery落成jsonp

<html>
 <head>
     <title>Untitled Page</title>
      <script type="text/javascript" src=jquery.min.js"></script>
      <script type="text/javascript">
        // 得到航班信息查询结果后的回调函数  
        var flightHandler = function(data){ alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。'); };

        jQuery(document).ready(function(){
          $.ajax({
             type: "get",
             async: false,
             url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
             dataType: "jsonp",
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
             jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
             success: function(json){
                 alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
             },
             error: function(){
                 alert('fail');
             }
           });
         });
     </script>
 </head>
 <body>
 </body>
</html>

jquery帮您转移回调函数并把数据取出来供success属性方法来调用。

附其余完成跨域的情势:
  • document.domain+iframe的设置
  • 动态创立script
  • 利用iframe和location.hash
  • window.name完成的跨域数据传输
  • 使用HTML5 postMessage
  • 利用flash
    详尽介绍,点击那里

参考文章:说说JSON和JSONP,或者你会出现转机,含jQuery用例

相关文章

网站地图xml地图