17|Ajax和Comet

其中在Ajax中最重要的就是XMLHttpRequest對象

// ajax
let xhr = new XMLHttpRequest(); // 創(chuàng)建xhr對象

// 第一個方法:open(get | post等, "exam.php", false) 參數(shù)為請求類型,請求url,是否異步的boolean
xhr.open("get","exam.php", false); // 調(diào)用該方法并不是真正的請求幸海,而是請求一個請求以備發(fā)送

// 發(fā)送真正的請求馅扣,接收一個參數(shù),即作為請求主體要發(fā)送的數(shù)據(jù)丘薛,不發(fā)送數(shù)據(jù)時必須傳遞null,因為對于某些瀏覽器來說該參數(shù)是必須的
xhr.send(null)

// 檢驗響應的狀態(tài)--->針對同步
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
    let data = xhr.responseText;
}else{
    console.log(xhr.status);
}

// 異步方案
xhr.onreadystatechange = function(){
    // xhr.readyStatus表示請求/響應過程的當前活動階段
    // 0 未初始化,還沒調(diào)用open()
    // 1 啟動缅糟,已調(diào)用open()方法但未調(diào)用send()
    // 2 發(fā)送魔吐, 已調(diào)用send()方法,但未收到響應
    // 3 接收综慎,已接收到部分響應數(shù)據(jù)
    // 4 完成涣仿,已接受到全部響應數(shù)據(jù)
    if(xhr.readyStatus == 4){
        if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
            let data = xhr.responseText;
        }else{
            console.log(xhr.status);
        }
    }
}
xhr.open("get","exam.php", false);
xhr.send(null);

// 在接收到響應之前還可以取消異步請求
xhr.abort() // 在停止請求之后還應該進行解引用操作,防止內(nèi)存堆積

// 設置http請求頭示惊,必須放在open和send中間
xhr.open("get","exam.php", false);

xhr.setRequestHeader("accept", "application/json; charset=utf-8")

xhr.send(null);

// 獲取響應頭信息
xhr.getResponseheader("accept");
xhr.getAllResponseHeaders();

// get請求:向現(xiàn)有url中添加查詢字符串
function addUrlParam(url, name, value){
    url += (url.indexOf("?") == -1 ? "?" : "&");
    url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
}

// post請求:模擬表單提交
xhr.open("get","exam.php", false);
// 設置提交時的內(nèi)容類型
xhr.setRequestHeader("content-Type", "application/x-www-form-urlencoded")
// 假設表單form對象已獲取
xhr.send(serialize(form));

// XHR2級 -- formData --序列化表單以及創(chuàng)建和表單格式相同的數(shù)據(jù)(用于通過xhr傳輸)
let data = new FormData();
data.append(key,value);
// 也就可以用表單元素的數(shù)據(jù)預先填入數(shù)據(jù)
let data = new FormData(document.forms[0]);
//使用FormData的好處在于不必明確地在xhr上設置請求頭部
xhr.send(new FormData(form));

// 進度事件
loadStart/progress/error/abort/load

/*
跨域資源共享CORS
核心思想: 使用自定義的http頭部讓瀏覽器和服務器進行溝通好港,從而決定請求是成功還是失敗
原理:
1.請求頭指定源:Origin: http://www.baidu.com
2.如果服務器認為這個請求可以接受,就在Access-Control-Allow-Origin頭部回發(fā)相同的源信息
Access-Control-Allow-Origin:http://www.baidu.com
(如果是公共資源米罚,可以回發(fā)“*”)
3.如果沒有這個頭部钧汹,或者有這個頭部但是源信息不匹配,瀏覽器就會駁回請求
*/

// 主流瀏覽器對cros的實現(xiàn)方式: 在url中使用絕對路徑录择,但有限制:不能設置自定義頭部拔莱,不能發(fā)送和接收cookie,獲取不到getAllResponseHeaders()的返回值

// 帶憑據(jù)的請求
withCredentials屬性設置為true
// 服務器接收到帶憑據(jù)的請求后碗降,會用下面的頭部來請求,如果響應不包含這個頭部塘秦,瀏覽器將不會把響應數(shù)據(jù)交給js
Access-Control-Allow-Credentials: true

// 跨瀏覽器的cros
function createCORSRequest(method,url){
    let xhr = new XMLHttpRequest();
    if("withCredentials" in xhr){
        xhr.open(method,url,true);
    }else if(typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method,url);
    }else{
        xhr = null;
    }
    return xhr
}
let req = createCORSRequest("get","http://www.baidu.com/page/");
if(req){
    req.onload = function(){
        // 對響應數(shù)據(jù)進行處理
    };
    req.send();
}
/* 以上提供的公共方法有
 abort() 用于停止正在進行的請求
 onerror 用于替代onreadystatechange檢驗錯誤
 onload 用于替代onreadystatechange檢驗成功
 responseText 用于取得響應內(nèi)容
 send() 用于發(fā)送請求
*/


// 其他跨域技術(shù)
1.圖像ping---常用于跟蹤用戶點擊頁面和動態(tài)廣告曝光數(shù)讼渊,只能get請求
    var img = new Image();
    img.onload = img.onerror = function(){
        // 操作
    }
    img.src = "http://baidu.com?name=xujaing";

2.JSONP---可以直接訪問響應文本,可以在瀏覽器和服務器之間進行雙向通信尊剔,但有安全隱患
    function handleResponse(data){
        console.log(data);
    }
    var script = document.createElement("script");
    script.src = "http://a.net/json/?callback=handleResponse";
    document.body.insertBefore(script, document.body.firstChild);

3.Comet (服務器推送SSE)
    常用的技術(shù)有長輪詢和流
4.Web Sockets
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爪幻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子须误,更是在濱河造成了極大的恐慌挨稿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霹期,死亡現(xiàn)場離奇詭異叶组,居然都是意外死亡,警方通過查閱死者的電腦和手機历造,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門甩十,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吭产,你說我怎么就攤上這事侣监。” “怎么了臣淤?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵橄霉,是天一觀的道長。 經(jīng)常有香客問我邑蒋,道長姓蜂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任医吊,我火速辦了婚禮钱慢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卿堂。我一直安慰自己束莫,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布草描。 她就那樣靜靜地躺著览绿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穗慕。 梳的紋絲不亂的頭發(fā)上饿敲,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音逛绵,去河邊找鬼诀蓉。 笑死栗竖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的渠啤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼添吗,長吁一口氣:“原來是場噩夢啊……” “哼沥曹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碟联,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妓美,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲤孵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壶栋,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年普监,在試婚紗的時候發(fā)現(xiàn)自己被綠了贵试。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯正,死狀恐怖毙玻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情廊散,我是刑警寧澤桑滩,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站允睹,受9級特大地震影響运准,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缭受,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一胁澳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贯涎,春花似錦听哭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至败明,卻和暖如春隘马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妻顶。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工酸员, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜒车,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓幔嗦,卻偏偏與公主長得像酿愧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邀泉,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355