Ajax的封装
function ajax(obj){
if(!obj.url){
throw Error("url属性不能为空")
}
if(!obj.success){
throw Error("success属性不能为空")
}
let option={
url:obj.url,
type:obj.type||"get",
data:obj.data||"",
async:obj.async||true,
success:obj.success,
error:obj.error||function(err){
conlose.log(err);
},
};
if(!option.type=="get"||option.type=="post"){
throw Error("type的属性取值 暂时只支持get和post")
}
let datatype=Object.prototype.toString.call(option.data);
if(!(datatype == "[object Object]" || datatype == "[object String]")){
throw Error("data参数的格式 暂时只支持对象或者字符串");
}
if (!(Object.prototype.toString.call(option.async) == "[object Boolean]")) {
throw Error("async的取值只能为布尔值(true|| false)");
}
if (!(Object.prototype.toString.call(option.success) == "[object Function]")) {
throw Error("success 必须是一个函数");
}
if (!(Object.prototype.toString.call(option.error) == "[object Function]")) {
throw Error("error 必须是一个函数");
}
if((Object.prototype.toString.call(option.data) == "[object Object]")){
let str="";
for(let key in option.data){
str+=key+"="+option.data[key]+"&";
}
option.data=str.substr(0,str.length-1);
}
let xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&/^[23]\d{2}$/.test(xhr.status)){
option.success(xhr.responseText)
}
if(/^[45]\d{2}$/.test(xhr.status)){
option.error(xhr.responseText)
}
};
if(option.type=="get"){
xhr.open(option.type, `${option.url}?${option.data}`, option.async);
xhr.send();
return;
]
xhr.open(option.type, option.url, option.async);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(option.data);
}
ajax({
url: './ajax.php',
type: "get",
data: { name: "老谢", age: 48 },
async: false,
success: function (res) {
console.log(res);
},
});
pagination(分页封装)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="./pagination.js"></script>
</head>
<body>
<div class="box">
</div>
<script>
let box = document.querySelector(".box");
new Pagination(box, {
pageInfo: {
pagenum: 1,
pagesize: 5,
total: 100,
totalpage: 20,
},
textInfo: {
first: "首页",
prev: "上一页",
next: "下一页",
last: "末页",
},
change: function (index) {
console.log(index);
},
});
</script>
</body>
</html>
class Pagination {
constructor(ele, options) {
if (!ele) {
throw new Error('方法必须传递参数,第一个为dom元素,第二个为对象');
}
this.ele = ele;
this.options = options || {};
this.default = {
pageInfo: {
pagenum: 1,
pagesize: 10,
total: 1000,
totalpage: 100
},
textInfo: {
first: 'first',
prev: 'prev',
list: '',
next: 'next',
last: 'last'
}
};
this.change = this.options.change || function () {};
this.list = null;
this.init();
}
init() {
this.setDefault();
this.setStyle();
this.dongcidaci();
}
setDefault() {
if (this.options.pageInfo) {
for (let attr in this.options.pageInfo) {
this.default.pageInfo[attr] = this.options.pageInfo[attr];
}
}
if (this.options.textInfo) {
for (let attr in this.options.textInfo) {
this.default.textInfo[attr] = this.options.textInfo[attr];
}
}
}
setStyle() {
this.ele.innerHTML = '';
setCss(this.ele, {
display: 'flex',
justifyContent: 'center',
alignItems: 'center'
});
this.createEle();
this.creteList();
this.go();
this.isDis();
}
createEle() {
for (let attr in this.default.textInfo) {
const div = document.createElement('div');
div.className = attr;
if (attr === 'list') {
this.list = div;
setCss(div, {
display: 'flex',
justifyContent: 'center',
alignItems: 'center'
});
} else {
setCss(div, {
border: '1px solid #333',
padding: '0 5px',
margin: '0 5px'
});
}
div.innerHTML = this.default.textInfo[attr];
this.ele.appendChild(div);
}
}
creteList() {
const pagenum = this.default.pageInfo.pagenum;
const totalpage = this.default.pageInfo.totalpage;
if (totalpage <= 9) {
for (let i = 1; i <= this.default.pageInfo.totalpage; i++) {
const p = this.crealeP(i);
this.list.appendChild(p);
}
} else {
if (pagenum < 5) {
for (let i = 1; i <= 5; i++) {
this.list.appendChild(this.crealeP(i));
}
const span = document.createElement('span');
span.innerHTML = '...';
this.list.appendChild(span);
for (let i = totalpage - 1; i <= totalpage; i++) {
this.list.appendChild(this.crealeP(i));
}
} else if (pagenum === 5) {
for (let i = 1; i <= 7; i++) {
this.list.appendChild(this.crealeP(i));
}
const span = document.createElement('span');
span.innerHTML = '...';
this.list.appendChild(span);
for (let i = totalpage - 1; i <= totalpage; i++) {
this.list.appendChild(this.crealeP(i));
}
} else if (pagenum > 5 && pagenum < totalpage - 4) {
for (let i = 1; i <= 2; i++) {
this.list.appendChild(this.crealeP(i));
}
const span = document.createElement('span');
span.innerHTML = '...';
this.list.appendChild(span);
for (let i = pagenum - 2; i <= pagenum + 2; i++) {
this.list.appendChild(this.crealeP(i));
}
const span2 = document.createElement('span');
span2.innerHTML = '...';
this.list.appendChild(span2);
for (let i = totalpage - 1; i <= totalpage; i++) {
this.list.appendChild(this.crealeP(i));
}
} else if (pagenum === totalpage - 4) {
for (let i = 1; i <= 2; i++) {
this.list.appendChild(this.crealeP(i));
}
const span = document.createElement('span');
span.innerHTML = '...';
this.list.appendChild(span);
for (let i = totalpage - 6; i <= totalpage; i++) {
this.list.appendChild(this.crealeP(i));
}
} else if (pagenum > totalpage - 4) {
for (let i = 1; i <= 2; i++) {
this.list.appendChild(this.crealeP(i));
}
const span = document.createElement('span');
span.innerHTML = '...';
this.list.appendChild(span);
for (let i = totalpage - 4; i <= totalpage; i++) {
this.list.appendChild(this.crealeP(i));
}
}
}
}
crealeP(i) {
const p = document.createElement('p');
p.innerHTML = i;
setCss(p, {
border: '1px solid #333',
margin: '0 5px',
padding: '0 5px'
});
if (i === this.default.pageInfo.pagenum) {
setCss(p, {
backgroundColor: 'orange'
});
}
return p;
}
go() {
const inp = document.createElement('input');
const btn = document.createElement('button');
setCss(inp, {
outline: 'none',
width: '50px',
height: '20px'
});
inp.value = this.default.pageInfo.pagenum;
inp.type = 'number';
inp.setAttribute('min', '1');
inp.setAttribute('max', this.default.pageInfo.totalpage);
setCss(btn, {
outline: 'none',
width: '30px',
height: '24px',
marginLeft: '5px'
});
btn.innerHTML = 'go';
this.ele.appendChild(inp);
this.ele.appendChild(btn);
}
isDis() {
if (this.default.pageInfo.pagenum === 1) {
this.ele.children[0].style.backgroundColor = '#ccc';
this.ele.children[1].style.backgroundColor = '#ccc';
}
if (this.default.pageInfo.pagenum === this.default.pageInfo.totalpage) {
this.ele.children[3].style.backgroundColor = '#ccc';
this.ele.children[4].style.backgroundColor = '#ccc';
}
}
dongcidaci() {
this.ele.addEventListener('click', e => {
e = e || window.event;
const target = e.target;
if (target.className === 'first' && this.default.pageInfo.pagenum !== 1) {
this.default.pageInfo.pagenum = 1;
this.setStyle();
}
if (target.className === 'prev' && this.default.pageInfo.pagenum !== 1) {
this.default.pageInfo.pagenum--;
this.setStyle();
}
if (target.className === 'next' && this.default.pageInfo.pagenum !== this.default.pageInfo.totalpage) {
this.default.pageInfo.pagenum++;
this.setStyle();
}
if (target.className === 'last' && this.default.pageInfo.pagenum !== this.default.pageInfo.totalpage) {
this.default.pageInfo.pagenum = this.default.pageInfo.totalpage;
this.setStyle();
}
if (target.nodeName === 'P' && target.innerHTML - 0 !== this.default.pageInfo.pagenum) {
this.default.pageInfo.pagenum = target.innerHTML - 0;
this.setStyle();
}
if (target.nodeName === 'BUTTON' && target.previousElementSibling.value - 0 !== this.default.pageInfo.pagenum) {
this.default.pageInfo.pagenum = target.previousElementSibling.value - 0;
this.setStyle();
}
this.change(this.default.pageInfo.pagenum);
});
}
}
function setCss(ele, options) {
for (let attr in options) {
ele.style[attr] = options[attr]
}
}```