AJAX学习:跨域、JSONP、JQuery全局事件处理、CORS

跨域

概念

同源策略是浏览器的一种安全策略,所谓同源是指 域名协议端口完全相同,只要同源的地址才可以相互通过AJAX的方式请求

同源或者不同源的是两个地址之间的关系,不同源地址之间请求我们称之为跨域

同源策略

指的是:不同源地址之间,必须服务端和客户端配合才能完成

尝试找到一种可以发送不同源请求的方式

<script>
    //请求一个不同源的地址实际上就是我们所说的跨域请求
    //## 1. img
    //可以发送不同源地址之间的请求,但是无法拿到响应结果
    // var img =new Image();
    // img.src='http://locally.uieee.com/categories';
    //## 2. link
    //可以发送不同源地址之间的请求,但是无法拿到响应结果
    // var link = document.createElement('link');
    // link.rel = 'stylesheet';
    // link.href = 'http://locally.uieee.com/categories';
    // document.body.appendChild(link);

    // ## 3. script
    var script = document.createElement('script');
    script.src = 'http://localhost/time2.php';
    document.body.appendChild(script);
</script>

JSONP
JSON with Padding 是一种借助于script标签发送跨域请求的技巧
其原理就是在客户端借助script标签请求服务端的一个动态网页(php文件),服务端的这个动态网页返回一段带有函数调用的JavaScript全局函数调用的脚本,将原本需要返回给客户端的数据传递进去
以后绝大多数情况都是采用JSONP的手段完成不同源地址之间的跨域请求

总结:

由于XMLHttpRequest无法发送不同源地址之间的跨域请求,所以我们必须另寻他法,script这种方案就是我们最终选择的方式,这个方式成为JSONP,

问题:

1.JSONP需要服务端配合,服务端按照客户端要求防返回一段JavaScript调用客户端的函数
2.只能发生GET请求

注意:

JSONP用的是script标签,跟AJAX提供的XMLHttpRequest没有任何关系

通过script标签请求一个服务器的PHP文件,这个文件返回的结果是一段JS,
作用是调用我们事先定义好的一个函数,
从而将服务器想要给客户端发过去的数据发送给客户端-

jQuery中ajax的封装

$.ajax({
        url: 'json.php',
        type: 'get',
        data: {id: 1, name: '张数'},
        //    用于设置响应体的类型,注意:跟data参数没有关系
        dataType: 'json',
        success: function (res) {
            //res 会自动根据服务器响应的Content-Type自动转换为对象,这是jQuery内部实现的
            //    一旦设置的dataType选项,就不再关心服务端响应的 Content-Type
            //    客户端会主观认为服务端返回的就是JSON格式的字符串
            console.log(res);
        }, error: function (xhr) {
            //只有请求不正常才会执行(状态码不为200)
            console.log(xhr);
        },complete: function (xhr) {
            //    请求完成, 成功/失败  都会执行
        }
    });

JQuery全局事件处理

    $(document).ajaxStart(function () {
        //    只要有ajax请求发生,就会执行
        $(".loading").fadeIn();
        console.log("请求开始了")
    }).ajaxStop(function () {
        //    只要有ajax请求结束,就会执行
        $(".loading").fadeOut();
        console.log("请求结束了")
    });

jQuery高度封装的函数

    $.get('time.php', {id: 1}, function (res) {
        console.log(res);
    });
    $.pose('time.php', {id: 5}, function (res) {
        console.log(res);
    });

回调

    function getTimeStamp(done) {
        setTimeout(function () {
            //    执行指定的事情
            done(Date.now());
        })
    }

    var done = function (timeStamp) {
        console.log(timeStamp / 1000 / 60 / 60);
    };
    getTimeStamp(done);

CORS
Cross Origin Resource Share 跨域资源共享

header('Access-Control-Allow-Origin:*');
这种方案无需客户端做出任何修改,只要在被请求的服务端响应的时候添加一个Access-Control-Allow-Origin响应头,表示这个资源十分允许指定域请求。

jsonp 封装

   function jsonp(url, params, callback) {
        var funcName = 'jsoup_' + Date.now() + Math.random().toString().substring(2, 5);
        if (typeof params === 'object') {
            var tempArr = [];
            for (var key in params) {
                var value = params[key];
                tempArr.push(key + "=" + value);
            }
            params = tempArr.join('&');
        }
        var script = document.createElement('script');
        script.src = url + '?' + params + '&callback' + funcName;
        document.body.appendChild(script);
        window[funcName] = function (data) {
            callback(data);
            delete window[funcName];
            document.body.removeChild(script);
        }
    }

    jsonp('http://localhost/jsonp/server.php', {id: 123}, function (res) {
        console.log(res);
    });
    jsonp('http://localhost/jsonp/server.php', {id: 123}, function (res) {
        console.log(res);
    })

案例:loading

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>主页面</title>
  <link rel="stylesheet" href="bootstrap.css">
  <link rel="stylesheet" href="../nprogress.css">
  <style>
    .loading {
      display: none;
      position: fixed;
      top: 0;
      left: 0;
      bottom: 0;
      right: 0;
      background-color: rgba(0, 0, 0, .6);
      font-size: 30px;
    }
  </style>
  <script src="../nprogress.js"></script>
</head>
<body>
  <div class="container pt-4">
    <h1>会员中心</h1>
    <hr>
    <div class="row">
      <aside class="col-md-3">
        <div class="list-group">
          <a class="list-group-item list-group-item-action" href="index.html">我的资料</a>
          <a class="list-group-item list-group-item-action" href="cart.html">我的购物车</a>
          <a class="list-group-item list-group-item-action" href="orders.html">我的订单</a>
        </div>
      </aside>
      <main id="main" class="col-md-9">
        <h2>我的个人资料</h2>
        <hr>
      </main>
    </div>
  </div>
  <div class="loading">正在玩命加载中...</div>
  <script src="../jquery.js"></script>
  <script>
    $(function ($) {
      $(document)
        .ajaxStart(function () {
          NProgress.start()
        })
        .ajaxStop(function () {
          NProgress.done()
        });

      // 有一个独立的作用域,顺便确保页面加载完成执行
      $('.list-group-item').on('click', function () {
        var url = $(this).attr('href');
        $('#main').load(url + ' #main > *');
        return false
      })
    })
  </script>
</body>
</html>


参考地址
https://github.com/Merbn/studyJs/blob/master/study-js-base/AJAX/%E6%A1%88%E4%BE%8B%EF%BC%9Aloading/index.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351