1、認識Ajax
- AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。功能:在不刷新頁面的狀況下,實現與後臺的數據交互。
- AJAX 不是新的編程語言,而是一種使用現有標準的新方法。 Ajax技術核心是XMLHttpRequest對象(簡稱XHR)。
- Ajax不能跨域,瀏覽器的同源策略。要想跨域,可使用jsonp,或者後臺開放端口。
2、MLHttpRequest 對象方法
- 新建一個Ajax對象:
new XMLHttpRequest();
。ie 6如下版本new ActiveXObject('Msxml2.XMLHttp.3.0')
或 new ActiveXObject('Msxml2.XMLHTTP.6.0')
。
new XMLHttpRequest() || new ActiveXObject('Msxml2.XMLHTTP.3.0')||new ActiveXObject('Msxml2.XMLHTTP.6.0');
複製代碼
- 打開資源:
open(method, url, asynch, [username],[password])
。指定和服務器端交互的HTTP方法,URL地址,即其餘請求信息。method:http請求方法,通常使用」GET「,」POST「.。url:請求的服務器的地址。asynch:是否採用異步方法,true爲異步,false爲同步,默認是異步。後邊兩個能夠不指定,username和password分別表示用戶名和密碼,提供http認證機制須要的用戶名和密碼。
- GET請求是最多見的請求類型,最經常使用於向服務器查詢某些信息。必要時,能夠將查詢字符串參數追加到URL的末尾,以便提交給服務器。URL的長度是有限制的,因此不能發送大量數據。特殊字符(eg:&等),傳參產生的問題可使用
encodeURIComponent()
進行編碼處理,中文字符的返回及傳參,能夠將頁面保存和設置爲utf-8
格式便可。或者使用提交url通用方法。
xhr.open('get', 'demo.php?rand=' + Math.random() + '&name=Koo', true);
複製代碼
- POST請求能夠包含很是多的數據,咱們在使用表單提交的時候,不少就是使用的POST傳輸方式。
xhr.open(‘post’, ‘demo.php’, true);
。而發送POST請求的數據,不會跟在URL的尾巴上,而是經過send()方法向服務器提交數據xhr.send(‘name=Lee&age=100’);
。通常來講,向服務器發送POST請求因爲解析機制的緣由,須要進行特別的處理。由於POST請求和Web表單提交是不一樣的,須要使用XHR來模仿表單提交。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
複製代碼
setRequestHeader(String header,String Value)
若是是POST方式,須要設置請求頭。設置HTTP請求中的指定頭部header的值爲value。此方法需在open方法之後調用,通常在post方式中使用。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
複製代碼
send(data)
:向服務器發出請求,若是採用異步方式,該方法會當即返回。data能夠指定爲null表示不發送數據,其內容能夠是DOM對象,輸入流或字符串。
Abort()
:中止當前http請求。對應的XMLHttpRequest對象會復位到未初始化的狀態。
3、XMLHttpRequest對象屬性
onreadystatechange
:請求狀態改變的事件觸發器(readyState變化時會調用這個屬性上註冊的javascript函數)。
readyState
:表示XMLHttpRequest對象的狀態。0:未初始化。XMLHttpRequest對象已建立,未調用open。1:open方法成功調用,但send方法未調用。2:send方法已經調用,還沒有開始接受數據。3:正在接受數據。Http響應頭信息已經接受,但還沒有接收完成。4:響應數據接受完成。
response
| responseText
| responseXML
。response
:後臺返回什麼就是什麼。responseText
:responseType
設置的是''或者'text',服務器響應的文本內容。responseXML
:服務器響應的XML內容對應的DOM對象。
status
:服務器返回的http狀態碼。200表示「成功」, 404表示「未找到」, 500表示「服務器內部錯誤」等。經過xhr.getResponseHeader(「Content-Type」);
能夠獲取單個響應頭信息 。xhr.getAllResponseHeaders();
獲取整個響應頭信息。
var xhr = new XMLHttpRequest();
console.log(xhr);
console.log(xhr.readyState);
xhr.open("GET",'/test.php?user=emmmm&age=18');
console.log(xhr.readyState);
xhr.onreadystatechange = function () {
console.log(this.readyState);
console.log(this.status);
console.log(this.response);
if(this.readyState === 4){
if(this.status >= 200 && this.status < 300 || this.status === 304){
console.log(this.response)
}
}
}
xhr.send();
複製代碼
<?php
var_dump($_GET);
複製代碼
var _data = 'user=xxxx&age=18';
var xhr = new XMLHttpRequest();
xhr.open('POST','/testpost.php');
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send(_data);
xhr.onreadystatechange = function(){
if(this.readyState === 4){
if(this.status >= 200 && this.status < 300 || this.status === 304){
console.log(this.response);
}
}
}
複製代碼
<?php
var_dump($_POST);
複製代碼
4、Ajax封裝
ajax({
url : '/test.php',
type : 'post',
data : {
user : '韓梅梅',
age : 18
},
success : function (data) {
console.log(data)
}
});
function ajax(options) {
options.type = /post/i.test(options.type) ? 'POST' : 'GET';
options.async = options.async===false ? false : true;
var xhr = new XMLHttpRequest();
var data = '';
for(var k in options.data){
data+=k+'='+ encodeURIComponent(options.data[k])+'&';
}
if(options.type === 'GET'){
if(!/\?/.test(options.url)){
options.url+='?';
}else{
if(!/(&\s*)$/.test(options.url)){
options.url+='&';
}
}
options.url += data+'_='+new Date().getTime();
data = null;
}
xhr.open(options.type,options.url,options.async);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');
xhr.onreadystatechange = function(){
if(this.readyState === 4){
if(this.status >= 200 && this.status < 300 || this.status===304){
options.success && options.success.call(this,strJsonCode(this.response));
}else{
options.error && options.error.call(this,this.status);
}
}
};
xhr.send(data);
}
function strJsonCode(str) {
try {
return JSON.parse(str);
}catch (e) {
return str;
}
}
複製代碼
<?php
exit(json_encode(array(
'get' => $_GET,
'post' => $_POST
)));
複製代碼
5、jsonp
- jsonp是一種數據的傳輸技巧,解決Ajax跨域的問題,src沒有跨域問題。
- p是填充的意思,json的填充。jsonp返回的數據形式是
callback({age:30,name:'二狗'})
而不是{age:30,name:'二狗'}
是用括號包裹,前面的名稱就是‘填充’,也就是jsonp的p。由於script接受的數據若是是一個json沒辦法保存,而調用一個函數,{}數據做爲實參傳遞,這樣就能夠拿到json中的數據。
<script type="text/javascript"> function jQuery11020815081152774352_1530968010825(data){ console.log(data) </script>
<script type="text/javascript" src="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=%E5%85%BB%E7%8C%AA%20&json=1&p=3&sid=1466_21100_20927&req=2&csor=3&pwd=%E5%85%BB%E7%8C%AA&cb=jQuery11020815081152774352_1530968010825&_=1530968010835"></script>
複製代碼
- jsonp前端代碼看起來像這樣。
<script> function callback(data){ console.log( data); } </script>
<script src='./jsonp.php?jsonp=callback'></script>
//我須要後臺返回一個callback({數據})這樣的一個值,實質就是調用上面的函數
複製代碼
- jsonp中jsonp.php後臺中的代碼。
<?php
$val = $_GET['jsonp'];
$arr = array(
"name"=>"二狗",
"age"=>50
);
echo $val."(".json_encode($arr).")";
?>
複製代碼