26.1顶岸、同步/異步請求、混編叫编、Ajax辖佣、封裝Ajax

  • 同步、異步請求
    • 點擊一個超鏈接搓逾、打開一個網(wǎng)站都屬于同步請求
    • JSP卷谈、ASP大多數(shù)情況屬于混編模式,通過事件觸發(fā)http請求霞篡,服務器根據(jù)請求的參數(shù)世蔗,重新組裝頁面,然后將頁面返回給瀏覽器朗兵。這種屬于混編+同步請求污淋,

Ajax

  • ajax全稱:Async javascript and xml表示異步的js和xml
  • readyState代表http請求處于哪個階段
  • status代表http狀態(tài)碼
        function xhrequest (url) {
            let xhr = null;

            if (XMLHttpRequest) { // 使用XMLHttpRequest實例化對象可以操作ajax
                xhr = new XMLHttpRequest();
            } else { // ie5 ie6 需要使用ActiveXObject
                xhr = new ActiveXObejct("Microsoft.XMLHTTP");
            }

            console.log(xhr.readyState); // 0 代表xhr未初始化
            xhr.open('get', url, true); // true代表異步的方式,false代表同步
            console.log(xhr.readyState); // 1 代表http連接已建立
            xhr.send(); // 如果是post請求余掖,send里需要寫"a=1&b=2"格式的字符串參數(shù)寸爆,此方式為傳統(tǒng)的post表單格式,更多類型見1-1例盐欺。 

            xhr.onreadystatechange = () => {
                console.log(xhr.readyState); // 2 代表請求已接受 3 代表請求處理中 4代表請求已處理完畢
                console.log(xhr.status);
                if(xhr.status == 200 && xhr.readyState == 4){
                    console.log(xhr.responseText);
                }
            }

        }

        xhrequest('http://www.webqd.top:8080');
  • extends 1-1
      function send(type) {
            url = "http://127.0.0.1:8080/";
            xhr = new XMLHttpRequest();
            xhr.open("post", url, true);
            var data;
            if (type === "formdata") {
                data = new FormData();
                data.append("key", "value");
            } else if (type === "json") {
                xhr.setRequestHeader("Content-Type", "application/json");
                data = JSON.stringify({"key": "value"});
            } else if (type === "text") {
                data = "key=value";
            } else if (type === "www") {
                // 這個header 其實是 傳統(tǒng)post 表單的格式
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                data = "key=value";
            }
            xhr.send(data);
        }

封裝ajax

var $ = function (w) {

  function formatData (data) {
    if(!data) return null;

    var str = '',
        toStr = Object.prototype.toString;

    for( var key in data ) {
      if ( toStr.call(data[key]) === '[object Object]' 
        || toStr.call(data[key]) === '[object Array]' ) {
          // 待實現(xiàn)
      }
      str += key + '=' + data[key] + '&';
    }
    str = str.replace(/&$/, '');
    return str;
  }

  function _doAjax(opt) {
    var xhr = null;
    if (w.XMLHttpRequest) {
      xhr = new XMLHttpRequest();
    } else {
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }

    opt = opt || {};

    if (!opt.url) throw new Error("url為必填項");

    let url = opt.url,
      type = (opt.type || 'GET').toUpperCase(),
      data = opt.data || null,
      contentType = opt.contentType || 'application/x-www-form-urlencoded', // 只有post請求時赁豆,需要設置請求的數(shù)據(jù)類型
      dataType = (opt.dataType || 'json').toLowerCase(), // 服務器返回的數(shù)據(jù)類型
      async = (opt.async + '') === 'false' ? false : true,
      timeout = opt.timeout || 30000, // 如果設置0,默認為30秒 todo:封裝其他類型  回調等 
      success = opt.success || function () {},
      error = opt.error || function () {},
      complete = opt.complete || function () {},
      tId = null;


    xhr.onreadystatechange = function () { // 此函數(shù)必須在send方法執(zhí)行前進行定義冗美,否則無法實現(xiàn)同步
      if (xhr.readyState === 4) {

        if (xhr.status === 304 || (xhr.status >= 200 && xhr.status < 300)) {

          switch (dataType) {
            case 'json': 
              success(JSON.parse(xhr.responseText));
              break;
            case 'text':
              success(xhr.responseText);
              break;
            case 'xml':
            case 'html':
              success(xhr.responseXml);
              break;
            default :
              success(xhr.responseText); 
          }

        } else {
          error(xhr.statusText);
        }

        clearTimeout(tId);
        tId = null;
        xhr = null;
        complete("The request of " + url + " has completed");

      }
    }

    tId = setTimeout(function () {
      clearTimeout(tId);
      xhr.abort(); // 終止已發(fā)出的請求
      tId = null;
      xhr = null;
      throw new Error('The request has time out');
    }, timeout);

    xhr.open(type, url, async);
    if (type === 'POST') xhr.setRequestHeader('Content-Type', contentType);
    // xhr.setResponseType = dataType;  // TOOD: 待優(yōu)化魔种,將xml html轉為document 設置blob、arrayBuffer粉洼、ms-stream务嫡、"" 類型
    xhr.send(formatData(data)); // 如果是同步甲抖,send方法會等待readyState為4的時候才會繼續(xù)執(zhí)行后面的代碼
  }

  return {
    ajax: function (options) {
      _doAjax(options);
    },
    post: function (url, data, cb) {
      this.ajax({
        url: url,
        type: 'post',
        data: data,
        success: cb,
      });
    },
    get: function (url, cb) {
      this.ajax({
        url: url,
        success: cb,
      });
    }
  };
}(window);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市心铃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挫剑,老刑警劉巖去扣,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異樊破,居然都是意外死亡愉棱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門哲戚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奔滑,“玉大人,你說我怎么就攤上這事顺少∨笃洌” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵脆炎,是天一觀的道長梅猿。 經常有香客問我,道長秒裕,這世上最難降的妖魔是什么袱蚓? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮几蜻,結果婚禮上喇潘,老公的妹妹穿的比我還像新娘。我一直安慰自己梭稚,他們只是感情好颖低,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哨毁,像睡著了一般枫甲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扼褪,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天想幻,我揣著相機與錄音,去河邊找鬼话浇。 笑死脏毯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的幔崖。 我是一名探鬼主播食店,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼渣淤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吉嫩?” 一聲冷哼從身側響起价认,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎自娩,沒想到半個月后用踩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡忙迁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年脐彩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姊扔。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡惠奸,死狀恐怖,靈堂內的尸體忽然破棺而出恰梢,到底是詐尸還是另有隱情佛南,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布删豺,位于F島的核電站共虑,受9級特大地震影響,放射性物質發(fā)生泄漏呀页。R本人自食惡果不足惜妈拌,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蓬蝶。 院中可真熱鬧尘分,春花似錦、人聲如沸丸氛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缓窜。三九已至定续,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禾锤,已是汗流浹背私股。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恩掷,地道東北人倡鲸。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像黄娘,于是被迫代替她去往敵國和親峭状。 傳聞我的和親對象是個殘疾皇子克滴,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359