一、使用原生js开发分页功能
// 分页逻辑
const pagination = function (option, fun) {
this.parentId = option.id; //容器
this.pageSize = option.pageSize || 1; //每页显示多少条
this.totals = option.totals || 0; //总条目数
this.currentPage = option.currentPage || 1; //当前页
this.showFirstBtn = option.showFirstBtn || false; //显示首页按钮
this.showLastBtn = option.showLastBtn || false; //显示尾页按钮
this.totalPage = Math.ceil(this.totals / this.pageSize);//总页数
this.firstText = '首页';
this.lastText = '尾页';
// this.preText = '上一页';
this.preText = '<';
// this.nextText = '下一页';
this.nextText = '>';
this.goText = '跳转至';
if(this.totalPage==0){ //最少一页
this.totalPage = 1;
}
/**
* 创建dom元素
*/
this.createDom = function (nodeName, attr, text) {
let el = document.createElement(nodeName);
if (attr) {
for (let key in attr) {
el.setAttribute(key, attr[key]);
}
}
if (text) {
el.innerText = text;
}
return el;
}
/**
* 添加className
*/
this.addClass = function (ele, className) {
let oldClass = ele.className.split(' ');
if (oldClass.indexOf(className) < 0) {
oldClass.push(className);
ele.className = oldClass.join(' ');
}
}
/**
* 删除class
*/
this.delClass = function (ele, className) {
let classArr = ele.className.split(' ');
classArr.forEach(function (name, i) {
if (name == className) {
classArr.replace(i, 1);
}
});
ele.className = classArr;
}
/**
* 是否包含class
*/
this.hasClass = function (ele, className) {
let classArr = ele.className.split(' ');
return classArr.indexOf(className) < 0 ? false : true;
}
let self = this;
this.refshPage = function (index) {
self.currentPage = index;
fun(index);
self.renderPage();
let pageParent = document.getElementById(self.parentId);
if (index == 1) {
self.addClass(pageParent.querySelector('.preBtn'), 'btnDisabled');
} else if (index == self.totalPage) {
self.addClass(pageParent.querySelector('.nextBtn'), 'btnDisabled');
} else {
self.delClass(pageParent.querySelector('.preBtn'), 'btnDisabled');
self.delClass(pageParent.querySelector('.nextBtn'), 'btnDisabled');
}
}
/**
* 生成分頁dom
*/
this.getPageDom = function (index, totalPage) {
let pageBox = self.createDom('div', {class: 'pageBox'});
let totalShow = self.createDom('span', {class: 'totalShow'},'共'+ self.totals+'条');
let totalPages = self.createDom('span', {class: 'totalPage'},'共'+ totalPage+'页');
let firstBtn = self.createDom('span', {class: 'firstBtn'}, self.firstText);
let lastBtn = self.createDom('span', {class: 'lastBtn'}, self.lastText);
let preBtn = self.createDom('span', {class: 'preBtn'}, self.preText);
let nextBtn = self.createDom('span', {class: 'nextBtn'}, self.nextText);
let firstPro = self.createDom('span', {class: 'firstPro'}, '到');
let jumpInput = document.createElement("input");
jumpInput.type = 'number';
jumpInput.className = 'jumpInput';
jumpInput.name = "totalPage";
jumpInput.value = index;
let lastPro = self.createDom('span', {class: 'lastPro'}, '页');
pageBox.appendChild(totalShow);
if (self.showFirstBtn) {
pageBox.appendChild(firstBtn);
}
if (self.showLastBtn) {
pageBox.appendChild(lastBtn);
}
firstBtn.onclick = function () {
self.refshPage(1);
}
lastBtn.onclick = function () {
self.refshPage(totalPage);
}
jumpInput.onblur = function () {
// if (txtInput.value.length === 0 判断字符串的值是否为空时常用
let val = jumpInput.value;
if (jumpInput.value.length === 0||jumpInput.value<0 ) {
self.refshPage(1);
}else if(val>totalPage){
self.refshPage(totalPage);
}else{
self.refshPage(val);
}
}
preBtn.onclick = function () {
let index = --self.currentPage;
if (index < 1) index = 1;
self.refshPage(index);
}
nextBtn.onclick = function () {
let index = ++self.currentPage;
if (index > totalPage) index = totalPage;
self.refshPage(index);
}
pageBox.appendChild(preBtn);
if (totalPage <= 10) {
for (let i = 1; i <= totalPage; i++) {
let page = self.createDom('span', {class: 'pageNum'}, i);
if (i == index) {
self.addClass(page, 'pageActive');
}
pageBox.appendChild(page);
(function (i) {
page.onclick = function () {
self.refshPage(i);
}
})(i);
}
pageBox.appendChild(nextBtn);
} else {
if (index <= 5) {
for (let i = 1; i < 9; i++) {
let page = self.createDom('span', {class: 'pageNum'}, i);
if (i == index) self.addClass(page, 'pageActive');
pageBox.appendChild(page);
(function (i) {
page.onclick = function () {
self.refshPage(i);
}
})(i);
}
pageBox.appendChild(self.createDom('span', {class: 'dots'}, '...'));
let lastPage = self.createDom('span', {class: 'pageNum'}, totalPage);
pageBox.appendChild(lastPage);
lastPage.onclick = function () {
self.refshPage(totalPage);
}
pageBox.appendChild(nextBtn);
}
if (index >= (totalPage - 4)) {
let firstPage = self.createDom('span', {class: 'pageNum'}, 1);
firstPage.onclick = function () {
self.refshPage(1);
}
pageBox.appendChild(firstPage);
pageBox.appendChild(self.createDom('span', {class: 'dots'}, '...'));
for (let i = totalPage - 9; i <= totalPage; i++) {
let page = self.createDom('span', {class: 'pageNum'}, i);
if (i == index) self.addClass(page, 'pageActive');
pageBox.appendChild(page);
(function (i) {
page.onclick = function () {
self.refshPage(i);
}
})(i);
}
pageBox.appendChild(nextBtn);
}
if (index > 5 && index < (totalPage - 4)) {
let firstPage = self.createDom('span', {class: 'pageNum'}, 1);
firstPage.onclick = function () {
self.refshPage(1);
}
pageBox.appendChild(self.createDom('span', {class: 'dots'}, '...'));
for (let i = index - 3; i <= index*1 + 3; i++) {
let page = self.createDom('span', {class: 'pageNum'}, i);
if (i == index) self.addClass(page, 'pageActive');
pageBox.appendChild(page);
(function (i) {
page.onclick = function () {
self.refshPage(i);
}
})(i);
}
pageBox.appendChild(self.createDom('span', {class: 'dots'}, '...'));
let lastPage = self.createDom('span', {class: 'pageNum'}, totalPage);
pageBox.appendChild(lastPage);
lastPage.onclick = function () {
self.refshPage(totalPage);
}
pageBox.appendChild(nextBtn);
}
}
if (index == 1) {
self.addClass(preBtn, 'btnDisabled');
}
if (index == totalPage||totalPage==0) {
self.addClass(nextBtn, 'btnDisabled');
}
if (self.showLastBtn) {
pageBox.appendChild(lastBtn);
}
pageBox.appendChild(totalPages);
pageBox.appendChild(firstPro);
pageBox.appendChild(jumpInput);
pageBox.appendChild(lastPro);
return pageBox;
};
/**
* 渲染page
*/
this.renderPage = function () {
let pageParent = document.getElementById(self.parentId);
let pagesDom = self.getPageDom(self.currentPage, self.totalPage);
pageParent.innerHTML = '';
pageParent.appendChild(pagesDom);
}
this.renderPage();
};
// 分页调用示例
new pagination({
id:dataStore.pageId,
pageSize:dataStore.pageSize,
totals:data.length,
currentPage:1
},function(index){
let startNum = (index - 1 ) * dataStore.pageSize;
let endNun = index * dataStore.pageSize;
let listData = data.slice(startNum,endNun);
renderMain(listData);
});
<!-- 分页代码 -->
<div id="pagination"></div>
/*分页 开始*/
#pagination{
padding: 17px 0;
color: #595959;
display: flex;
justify-content: center;
}
#pagination .totalShow{
margin-right:10px;
}
#pagination .totalPage{
margin: 0 10px;
}
#pagination .pageNum,#pagination .preBtn,#pagination .nextBtn{
width: 30px;
height: 30px;
background: #FFFFFF;
border: 1px solid #DFDFDF;
border-radius: 4px;
display: inline-block;
text-align: center;
line-height: 30px;
cursor:pointer;
margin: 0 4px;
}
#pagination .pageActive{
border-color: #0177D5;
background: #0177D5;
color: #fff;
}
#pagination .pageNum:hover,#pagination .preBtn:hover,#pagination .nextBtn:hover{
border-color: #0177D5;
background: #0177D5;
color: #fff;
}
#pagination .btnDisabled{
cursor: Auto;
color: #999;
}
#pagination .btnDisabled:hover{
border-color: #DFDFDF;
background: #FFFFFF;
color: #999;
}
#pagination .jumpInput{
width: 36px;
height: 30px;
background: #FFFFFF;
border: 1px solid #DFDFDF;
border-radius: 4px;
-webkit-text-fill-color: #595959;
text-align: center;
line-height: 30px;
margin: 0 10px;
caret-color:#595959;
}
#pagination .jumpInput::-webkit-outer-spin-button,
#pagination .jumpInput::-webkit-inner-spin-button {
-webkit-appearance: none;
}
#pagination .jumpInput {
-moz-appearance: textfield;
}
#pagination .jumpInput:focus {
border-color: #41A9F2;
-webkit-text-fill-color: #41A9F2;
}
/*分页 结束*/
每次查询请求都要重新调用下分页
二、单页面引入Vue
在onclick等原生js事件中使用vue methods 中定义的函数时要在前面加上’vueApp.‘,vueApp是定义的Vue构造器
<div class="iframe-ct" id="vue-app">
<div onclick="go();vueApp.show()">点击按钮</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
function go(){
console.log(123)
}
let vueApp = new Vue({
el: '#vue-app',
data() {
return {
val:'888'
}
},
mounted() {
},
methods: {
show(){
console.log(this.val)
},
}
})
</script>
需要注意的是假如vue-app div里渲染有问题,整个vue-app div都会被隐藏掉
三、每次打开新窗口打开同一个页面
当需要每次打开新窗口都是同一个时, target=“framename” 可以轻松实现这个功能(framename 在指定的框架中打开被链接文档)
<body>
<a href="./canvas动效.html" target="firstView">打开新窗口</a>
</body>
四、如何解决上层div元素将下层div元素盖住,但是下层div里的点击事件仍可以进行的问题?
对上层元素使用:pointer-events: none;这样点击事件就能穿透上层元素,找到下层的点击事件。
如果想让上层元素也能得到点击事件,只需要在你需要获得点击的上层元素子元素中加入:pointer-events: auto;
五、Echarts geo地图 全屏后地图区域点击事件不生效
解决方案:不再监听click事件,监听mousedown事件
this.myChart.on('mousedown', params => {
if(params.name == "大兴区") {
this.$emit("changeMap", 3);
}
});
六、火狐浏览器时间直接处理变成0-0-0
案例:
// 日期格式化
function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(/-/gm, '/').replace('T', ' ').replace(/\.[\d]{3}/gm, '')
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
// 使用parseTime格式化时间组件中选取的时间 timeVal
console.log(parseTime(timeVal, '{y}-{m}-{d}')) // 返回‘0-0-0’
非火狐浏览器时,比如谷歌、360等都是正常的。解决方法是在进行时间格式化前对时间参数进行处理,解决方案如下:
// 日期格式化
function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
time = new Date(time) //在进行时间格式化前对时间参数进行处理
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(/-/gm, '/').replace('T', ' ').replace(/\.[\d]{3}/gm, '')
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
// 使用parseTime格式化时间组件中选取的时间 timeVal
console.log(parseTime(timeVal, '{y}-{m}-{d}')) // 任意浏览器都返回正常