ajax(Asynchronous JavaScript And XML)
async:異步執(zhí)行
javascript:使用XMLHttpRequest對象
XML:負責(zé)數(shù)據(jù)交換和存儲牌里,現(xiàn)在使用最多的是json
不用刷新和重新加載網(wǎng)頁的情況下,動態(tài)的與服務(wù)器交換數(shù)據(jù)
直接對dom元素進行操作,缺點是不利于seo
總結(jié)下:ajax就是不用重新加載或刷新網(wǎng)頁庐镐,就能和服務(wù)器交換數(shù)據(jù)的一項技術(shù)儡首,這種技術(shù)使用xml或者json作為前后端數(shù)據(jù)交換的載體票顾;
如何使用ajax
創(chuàng)建XMLHttpRequest對象
準備創(chuàng)建連接
發(fā)送請求
處理響應(yīng)
創(chuàng)建
var xhr = new XMLHttpRequest;
建立連接
//如果method是GET桃犬,則url = url?queryString
//queryString是查詢字符串
xhr.open(method,url,async);
發(fā)送請求
//如果method是POST
xhr.setRequetHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(queryString);//查詢字符串做參數(shù)
//如果method是GET
xhr.send();
處理響應(yīng)
xhr.onreadystatechange = function(){//請求響應(yīng)函數(shù)
if(readyState === 4){//readyState響應(yīng)狀態(tài)碼1-4恋拍;4表示請求處理完畢
if(status === 200){//http狀態(tài)碼200表示ok
//todo....
}
}
}
對于ajax函數(shù)的簡單封裝
/**
* ajax封裝
* ajax->option{
* mothed:"",//以什么方式傳遞數(shù)據(jù)
* url:"",//api接口路徑
* data:{username:"",password:""},//需要提交的數(shù)據(jù)
* returndatatype:"json",//服務(wù)器返回的數(shù)據(jù)格式
* success:function(data){},//請求成功之后執(zhí)行的函數(shù)
* error:function(err){}//請求失敗執(zhí)行的函數(shù)
* }
*/
function ajax(option){
option = option || {};//判斷有沒有傳遞參數(shù)隧土,如果沒有提针,那就置空;
var url = option.url;
if(!url) return ;//如果沒有傳遞url那就直接結(jié)束程序曹傀;
var mothed = (option.mothed||"get").toUpperCase();//如果沒有傳遞mothed辐脖,那就將它設(shè)置為默認get;
// console.log(mothed);
var queryString = null;//查詢字符串使用data數(shù)據(jù)拼接;
if(option.data){//如果傳入data數(shù)據(jù)
queryString = [];
for(var index in option.data){//遍歷data,并將data格式化之后存入querystring皆愉;
queryString.push(index + "=" + option.data[index]);
}
// console.log(queryString);
queryString = queryString.join("&");//將數(shù)組元素用&拼接
// console.log(queryString);
}
if(mothed === "GET" && queryString){//如果mothed的方法為get并且查詢字符串不是空嗜价,那么對URL進行拼接
url += "?" + queryString;
queryString = null ;//因為url已經(jīng)存儲querystring的值,所以將它清空幕庐;
}
// --------------
//創(chuàng)建ajax對象
var xhr = new XMLHttpRequest();
//打開連接
xhr.open(mothed,url,true);
//判斷method是否是POST久锥,如果是執(zhí)行setrequestheader
if(mothed === "POST"){
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
}
xhr.send(queryString);
xhr.onreadystatechange = function(){//觸發(fā)請求事件的時候執(zhí)行
if(xhr.readyState === 4){//請求處理完畢
if(xhr.status === 200){//狀態(tài)碼為ok,請求成功
var data = xhr.responseText;//獲取api返回文本
if(option.returndatatype === "json"){//如果文本是json格式
// console.log(data);
data = JSON.parse(data);//轉(zhuǎn)為數(shù)組
// console.log(data);
}
option.success && option.success(data);//如果還存在回調(diào)函數(shù)則執(zhí)行异剥;
}else{
option.error && option.error(xhr.status);//如果請求失敗瑟由,執(zhí)行請求出錯函數(shù)
}
}
}
}
使用ajax對api進行訪問
function sel(attr,boolean){
if(boolean){
return document.querySelector(attr);
}
return document.querySelectorAll(attr);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<style>
.bigbox{
width: 970px;
margin: 0 auto;
position: relative;
margin: 0 auto;
}
.bigbox div{
width: 300px;
border: 1px solid #eee;
border-radius: 5px;
position: absolute;
left: 0px;
right: 0px;
text-align: center;
}
.bigbox div img{
width: 300px;
}
</style>
<body>
<div class="bigbox">
</div>
</body>
<script src="ajax.js"></script>
<script>
var url = "http://route.showapi.com/819-1?showapi_appid=58891&showapi_sign=6436340432ff47a38a91ed481d090541&type=36&num=50&page=1";
var html = "";
var div_ = sel(".bigbox",true);
ajax({
url:url,
mothed:"GET",
returndatatype:"json",
success:function(data){
var data_ = data.showapi_res_body;
for (var attr in data_) {
var data_attr = data_[attr];
if(data_attr){
html += `<div>
<p>${data_attr.title}</p>
<a href="${data_attr.url}"><img src="${data_attr.thumb}"></a>
</div>`
}
}
div_.innerHTML = html;
}
});
setTimeout(function() {
// 待定位元素
var divs = sel(".bigbox div",false);
// 盒子個數(shù)
console.log(divs)
var len = divs.length;
// 列寬度
var colWidth = divs[0].offsetWidth;
// 水平間距
var spacing = 20;
// 列高度數(shù)組
var height = [0, 0, 0];
// 最短列定位
for (var i = 0; i < len; i++) {
// 當(dāng)前定位元素在其行中的列索引
var colIndex = minIndex(height);
// 定位
divs[i].style.left = colIndex * colWidth + (colIndex + 1) * spacing + "px";
divs[i].style.top = height[colIndex] + 10 + "px";
// 將當(dāng)前定位元素的高度及間距累加到列總高度中
height[colIndex] += divs[i].offsetHeight + 10;
}
function minIndex(array) {
// 假定第一個元素最小,記錄下標
var min = array[0], index = 0;
// 循環(huán)判斷
for (var i = 1; i < array.length; i++) {
if (min > array[i]) {
min = array[i];
index = i;
}
}
// 返回下標
return index;
}
},1000)
</script>
</html>