面试中时时会咨询到何以采取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上出一个页面,里面引入了方的js文件,当我们当浏览器中开辟这页面时,会发现可以成功的弹奏出hello
world,这虽象征跨域调用成功了。

  • 何以跨域远程获取数据呢
    地面localhost.com上闹一个页面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参数,告诉服务器本身要翻的是CA1998软航班的信,而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地图