在現(xiàn)代瀏覽器上寫AJAX主要依靠XMLHttpRequest對象:
-------------------------------------------------------------------------------------------------------------
function success(text) {
? ? var textarea = document.getElementById('test-response-text');
? ? textarea.value = text;
}
function fail(code) {
? ? var textarea = document.getElementById('test-response-text');
? ? textarea.value = 'Error code: ' + code;
}
var request = new XMLHttpRequest(); // 新建XMLHttpRequest對象
request.onreadystatechange = function () { // 狀態(tài)發(fā)生變化時肝谭,函數(shù)被回調(diào)
? ? if (request.readyState === 4) { // 成功完成
? ? ? ? // 判斷響應(yīng)結(jié)果:
? ? ? ? if (request.status === 200) {
? ? ? ? ? ? // 成功蛋铆,通過responseText拿到響應(yīng)的文本:
? ? ? ? ? ? return success(request.responseText);
? ? ? ? } else {
? ? ? ? ? ? // 失敗,根據(jù)響應(yīng)碼判斷失敗原因:
? ? ? ? ? ? return fail(request.status);
? ? ? ? }
? ? } else {
? ? ? ? // HTTP請求還在繼續(xù)...
? ? }
}
// 發(fā)送請求:
request.open('GET', '/api/categories');
request.send();
alert('請求已發(fā)送腾降,請等待響應(yīng)...');
----------------------------------------------------------------------------------------------------
當(dāng)創(chuàng)建了XMLHttpRequest對象后,要先設(shè)置onreadystatechange的回調(diào)函數(shù)垫挨。在回調(diào)函數(shù)中宛徊,通常我們只需通過readyState === 4判斷請求是否完成,如果已完成镰惦,再根據(jù)status === 200判斷是否是一個成功的響應(yīng)。
XMLHttpRequest對象的open()方法有3個參數(shù)犬绒,第一個參數(shù)指定是GET還是POST旺入,第二個參數(shù)指定URL地址,第三個參數(shù)指定是否使用異步凯力,默認(rèn)是true茵瘾,所以不用寫。
注意咐鹤,千萬不要把第三個參數(shù)指定為false拗秘,否則瀏覽器將停止響應(yīng),直到AJAX請求完成慷暂。如果這個請求耗時10秒聘殖,那么10秒內(nèi)你會發(fā)現(xiàn)瀏覽器處于“假死”狀態(tài)。
最后調(diào)用send()方法才真正發(fā)送請求行瑞。GET請求不需要參數(shù)奸腺,POST請求需要把body部分以字符串或者FormData對象傳進(jìn)去。
-------------------------------------------------------------------------------------------------------------
安全策略
默認(rèn)情況下血久,JavaScript在發(fā)送AJAX請求時突照,URL的域名必須和當(dāng)前頁面完全一致。
完全一致的意思是氧吐,域名要相同(www.example.com和example.com不同)讹蘑,協(xié)議要相同(http和https不同),端口號要相同(默認(rèn)是:80端口筑舅,它和:8080就不同)座慰。有的瀏覽器口子松一點,允許端口不同翠拣,大多數(shù)瀏覽器都會嚴(yán)格遵守這個限制版仔。