• 原生js实现分页缓存


    前言

     内容涉及知识点:

      1.后台分页查询概念

      2.原生ajax请求

      3.闭包

    接口:https://api.apiopen.top/getJoke?page=1&count=2&type=video

    思路:

         利用js的内存机制 , 创建一个对象缓存池 ,通过闭包保证缓存池对象不会被GC回收 ,而且能被外界访问 

      读取数据时 , 判断缓存池中是否已经存在 , 不存在则发送ajax获取数据并缓存起来 ,

      否则直接在缓存池中获取数据  

    var cache=cacheData();
        function myAjax(opt){
            opt= opt || {};
            opt.method = opt.method  || 'GET';
            opt.url = opt.url || '';
            opt.async = opt.async || true;
            opt.data = opt.data || null ; 
            opt.dataType = opt.dataType    || 'JSON';
            opt.success = opt.success || function(){};
            var xmlHttp=null;
            if (new XMLHttpRequest) {
                xmlHttp =  new XMLHttpRequest();
            } else {
                xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
            }
            var params = [];
            for (var key in opt.data) params.push(key + '=' + opt.data[key]);
            var postData = params.join('&');
            if (opt.dataType == 'JSONP') {
                creatScript(opt.url , postData)
            }else{
                if (opt.method.toUpperCase() == 'POST') {
                    xmlHttp.open(opt.method, opt.url, opt.async);
                    xmlHttp.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
                    xmlHttp.send(postData);
                }else if (opt.method.toUpperCase() == 'GET') {
                    xmlHttp.open(opt.method, opt.url+'?' + postData , opt.async);
                    xmlHttp.send()
                }
                xmlHttp.onreadystatechange = function(){
                    if (xmlHttp.readyState==4 && xmlHttp.status == 200) {
                        if (opt.dataType == 'JSON') {
                            opt.success(xmlHttp.response)
                        }
                    }
                }
            }
        }
    
        function creatScript(url,data){
            var oScript = document.createElement('script');
            oScript.src = url + "?" + data + '&callback=getEn';
            document.body.appendChild(oScript);
        }
        function getData(page){
            var page = page || 1;
            myAjax({
                url:'https://api.apiopen.top/getJoke',
                data:{
                    page:page, //页码
                    count:2,    //条数       
                },
                success(rep){
                    var rep = JSON.parse(JSON.stringify(rep))
                    cache.set(page,rep)
                }
            })
        }
        
    //利用js的内存机制 创建缓存池  全局变量不会被回收
        function cacheData(){  //通过闭包 保证cache不会被GC回收 ,而且能被外界访问
            var cache={}; //声明一个缓存池变量
            return {
                set:function(page,data){//存储新数据
                    cache[page] = data;
                },
                get:function(page){  //读取数据
                    if (page in cache) {
                        console.log('数据已缓存,无需重复请求')
                    }else {
                        getData(page)
                    }
                }
            }
        }
    
        var cache_ul= document.querySelector('.cache_ul');
        cache_ul.addEventListener('click',function(e){
            var e = e || window.event;
            if (e.target.tagName.toLowerCase() == 'li') {
                var page = e.target.innerText;
                cache.get(page);
            }
        })

    ...

  • 相关阅读:
    设计模式之工厂模式
    在线预览插件pdf.js使用记录
    自学Python:自定义模块导入问题
    MVC流程
    关于django的一些基础知识
    day72 关于rbac组件的小部分面试题
    linux的简单操作和安装
    day71 菜单的排序 点击被选中
    day063 form 和modelform组件
    day051 django第二天 django初识代码
  • 原文地址:https://www.cnblogs.com/wxyblog/p/13518965.html
Copyright © 2020-2023  润新知