前端踩坑指南

一、使用原生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}'))  // 任意浏览器都返回正常
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值