AJax

第一步/獲取瀏覽器內(nèi)置的ajax請求對象

//如果不適配IE5/IE6這種很老版本的瀏覽器的話
Ajax.js function createAjax() {
   var xhr = new XMLHttpRequest();
   return xhr;
}

//適配IE5/IE6
Ajax.js function createAjax() {
   var xhr ; 
   if(window.XMLHttpRequest){ 
          //所有現(xiàn)代瀏覽器 (IE7+披蕉、Firefox尚氛、Chrome、Safari 以及 Opera) 都內(nèi)建了 XMLHttpRequest 對象。
        xhr = new XMLHttpRequest();
   }else { //老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對象:
       xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
   } 
   return xhr;
}

第二步/ 使用xhr對象
1、使用這個XHR對象作同步的get請求

var xhr = new XMLHttpRequest();
xhr.open('get', 'url', false);
xhr.send(null);
if (xhr.status >= 200 && xhr.status < 300) || xhr.status(304) 
{
 alert(xhr.responseText);
} else {
 alert('Request was unsuccessful' + xhr.status);
}

首先用第一步的方法創(chuàng)建出一個xhr對象
然后調(diào)用xhr對象的open方法發(fā)起一個請求:xhr.open('get', 'example.php', false);第一個參數(shù)是請求類型(get/post),第二個參數(shù)是請求的url路徑,第三個參數(shù)代表是否是異步請求(true-異步茧吊,false-同步);
在然后就是調(diào)用xhr的send方法發(fā)送數(shù)據(jù):xhr.send(null);也可以把數(shù)據(jù)拼接在url后面八毯,比如:usl搓侄?username=root&passwrod=123
最后通過xhr的status屬性判斷是否發(fā)送成功:200 表示成功, 304 表示緩存话速,其他表示返回失敗讶踪。

2、使用這個XHR對象作異步的get請求

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() { 
if (xhr.status === 4) {
 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
 alert(xhr.responseText);
 } else {
 alert('Request was unsuccessful' + xhr.status);
 }
 }
};
xhr.open('get', 'example.txt', true);
xhr.send(null);

Ajax 請求都是異步發(fā)送的泊交,這個時候我們需要用到另外一個 XHR 對象的屬性 readtstatechange
乳讥,通常當(dāng)它的值為 4 的時候筹麸,表示所有數(shù)據(jù)已經(jīng)接受到了。

3雏婶、使用這個XHR對象作Post請求

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
   if (xhr.status === 4) {
       if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
       {
         alert(xhr.responseText);
       } else { 
        alert('Request was unsuccessful' + xhr.status); 
      } 
  }
};
xhr.open('post', 'example.php', true);
var form = document.getElementById('user-info');
xhr.send(serialize(form));

POST 請求是把數(shù)據(jù)作為請求的主體去提交的,所以我們的數(shù)據(jù)一般是在 send方法里面發(fā)出的

serialize()方法通過序列化表單值白指,創(chuàng)建標(biāo)準(zhǔn)的URL編碼文本字符串留晚,它的操作對象是代表表單元素集合的jQuery 對象。你可以選擇一個或多個表單元素(比如input或文本框)告嘲,或者 form 元素本身错维。序列化的值可在生成 AJAX 請求時用于 URL 查詢字符串中

第三步/ 關(guān)于send方法發(fā)送數(shù)據(jù)
1、用于發(fā)送數(shù)據(jù)的FormData類

var data = new FormData();
data.append('name', 'Steven');
xhr.send(data);

2橄唬、serialize方法序列化表單
可以選擇一個或多個表單元素(比如input或文本框)赋焕,或者 form 元素本身

var form = document.getElementById('user-info');
xhr.send(serialize(form));

重要的一點:
跨域請求
然而 Ajax 并不是萬能的,有時候我們想要異步獲取其他網(wǎng)站的數(shù)據(jù)的時候仰楚,就會返回失敗隆判,這是因為 XHR 對象只能訪問與包含它頁面位于同一個域中的資源。那我們要怎么辦呢僧界?
CORS
跨源資源共享標(biāo)準(zhǔn)通過新增一系列 HTTP 頭侨嘀,讓服務(wù)器能聲明哪些來源可以通過瀏覽器訪問該服務(wù)器上的資源。主要有三種:
通過使用 Origin 和 Access-Control-Allow-Origin 就可以完成最簡單的跨站請求捂襟。不過 Access-Control-Allow-Origin 需要為 * 或者包含由 Origin 指明的站點咬腕。

“預(yù)請求”要求必須先發(fā)送一個 OPTIONS 請求給目的站點,來查明這個跨站請求對于目的站點是不是安全可接受的葬荷。這樣做涨共,是因為跨站請求可能會對目的站點的數(shù)據(jù)造成破壞。

一般而言宠漩,對于跨站請求举反,瀏覽器是不會發(fā)送憑證信息的。但如果將XMLHttpRequest的一個特殊標(biāo)志位設(shè)置為true扒吁,瀏覽器就將允許該請求的發(fā)送照筑。

圖片Ping
在使用圖片的時候,我們的<img>
中的src
屬性也可以使用任何網(wǎng)頁的鏈接瘦陈,意味加載這一類請求無需擔(dān)心是否跨域凝危。常常用于動態(tài)創(chuàng)建圖像,或者跟蹤用戶點擊頁面晨逝,動態(tài)廣告曝光次數(shù)等蛾默。
JSONP
JSONP 是 JSON with padding 的縮寫,意思是填充式的 JSON捉貌,同圖片 Ping 一樣支鸡,<script>
的src
屬性也是可以跨域的冬念,因此通過動態(tài)創(chuàng)建一個<script>
元素獲取我們所需要的資源。
不同于圖像 Ping 只返回圖片牧挣,JSONP 可以直接訪問相應(yīng)文本急前。只需要在添加 URL 的時候添加查詢參數(shù)即可,看起來會像下面這個樣子:

http://freeeoip.net/json/?callback=handleResponse
// 或者 PHP 形式的
http://test.com/bookservice.php?callback=displayBooks

其中賦值給callback
的表示指定的調(diào)用函數(shù)瀑构,完整的 JSONP 如下:

// 處理返回數(shù)據(jù)的請求
function handleResponse(data){
 alert('Your city is in' + data.city + data.country);
}
// 動態(tài)生成 JSPONP 請求
var script = document.createElement('script');
script.src = 'http://freegeoip.net/json/?callback=handleResponse';
document.body.insertBefore(script, document.body.firstChild);

好處: 雙向通信裆针,可以跨域
壞處:無法識別惡意代碼,無法知道是否獲取失敗

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寺晌,一起剝皮案震驚了整個濱河市世吨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呻征,老刑警劉巖耘婚,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陆赋,居然都是意外死亡沐祷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門攒岛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戈轿,“玉大人,你說我怎么就攤上這事阵子∷急” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵挠进,是天一觀的道長色乾。 經(jīng)常有香客問我,道長领突,這世上最難降的妖魔是什么暖璧? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮君旦,結(jié)果婚禮上澎办,老公的妹妹穿的比我還像新娘。我一直安慰自己金砍,他們只是感情好局蚀,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恕稠,像睡著了一般琅绅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅巍,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天千扶,我揣著相機與錄音料祠,去河邊找鬼。 笑死澎羞,一個胖子當(dāng)著我的面吹牛髓绽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妆绞,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顺呕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摆碉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脓豪,失蹤者是張志新(化名)和其女友劉穎巷帝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫夜,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡楞泼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笤闯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堕阔。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颗味,靈堂內(nèi)的尸體忽然破棺而出超陆,到底是詐尸還是另有隱情,我是刑警寧澤浦马,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布时呀,位于F島的核電站,受9級特大地震影響晶默,放射性物質(zhì)發(fā)生泄漏谨娜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一磺陡、第九天 我趴在偏房一處隱蔽的房頂上張望趴梢。 院中可真熱鬧,春花似錦币他、人聲如沸坞靶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滩愁。三九已至,卻和暖如春辫封,著一層夾襖步出監(jiān)牢的瞬間硝枉,已是汗流浹背廉丽。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妻味,地道東北人正压。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像责球,于是被迫代替她去往敵國和親焦履。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容