zoukankan      html  css  js  c++  java
  • jsonp

    同源策略

    同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。

    什么是jsonp?

    JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

    jsonp有什么用?

    由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

    如何使用jsonp?

    html:

    <script>
        function fn(data){
            for(var key in data){
                console.log(key+"----"+data[key]);
            }
        }
        var element=document.createElement("script");
        element.type="text/javascript";
        element.src="http://127.0.0.1/jsonp/test.php?callback=fn";
        document.body.appendChild(element);
    </script>

    或者直接:

    <script>
         function fn(data){
            for(var key in data){
                console.log(key+"----"+data[key]);
            }
         }
    </script>
    <script type="text/javascript" src="http://127.0.0.1/jsonp/test.php?callback=fn"></script> //JavaScript的链接,必须在function的下面。

    服务端php代码:

    $arr=array("a"=>1,"b"=>2,"c"=>3);
    $result=json_encode($arr); 
    $callback=$_GET["callback"];
    echo $callback."($result)";

    jquery方法实现  

    $.ajax:

    $.ajax({
          url:"http://127.0.0.1/jsonp/test.php",
          dataType:"jsonp",
          success:function(data){
              for(var key in data){
                  console.log(key+"----"+data[key]);
              }
          }
    })

    $.getJSON

    $.getJSON(
        "http://127.0.0.1/jsonp/test.php?callback=?",
        function(data){
            for(var key in data){
                console.log(key+"----"+data[key]);
            }
        }
    );

    $.get

    $.get(
        'http://127.0.0.1/jsonp/test.php?callback=?', 
        function (data) { 
            for(var key in data){
                console.log(key+"----"+data[key]);
            } 
        }, 
        'jsonp'
    ); 

    jsonp原理:

    首先在客户端注册一个callback, 然后把callback的名字传给服务器。
    此时,服务器先生成 json 数据。
    然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
    最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
    客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)

  • 相关阅读:
    {POJ}{3903}{Stock Exchange}{nlogn 最长上升子序列}
    {HDU}{2516}{取石子游戏}{斐波那契博弈}
    {POJ}{3925}{Minimal Ratio Tree}{最小生成树}
    {ICIP2014}{收录论文列表}
    {Reship}{KMP字符串匹配}
    kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
    kettle系列-kettle管理平台部署说明
    kettle系列-我的开源kettle调度、管理平台[kettle-manager]介绍
    技术杂记-改造具有监控功能的数据库连接池阿里Druid,支持simple-jndi,kettle
    技术杂记-日期时间字符串解析识别
  • 原文地址:https://www.cnblogs.com/xlj-code/p/7904289.html
Copyright © 2011-2022 走看看