知识点1:css滚动条

父元素设置固定高度超出隐藏 若子元素高度超出 则出现滚动条

知识点2:类数组如何使用数组方法:

  1. Array.prototype.slice.call(arr) :将类数组转换位数组<br /> Array.prototype.forEach.call(arr): 把要使用的数组方法call通过放到类数组上使用

知识点3:缓存池

1.定义一个cache对象 cache = {}, page=0
2.每次将success回调函数里请求回的data数据放进缓存池: cache[page] = data;
3.要再次请求数据前判断缓存池里是否有数据 如果有则直接使用缓存池的数据进行数据渲染 如果没有 则请求数据

cache[page] ? getCacheCourses(page) : getAjaxCourses(page);

//缓存池数据渲染
function getCacheCourses(page) {
       var data = cache[page];
       render(data);
}

    //  ajax数据请求
    function getAjaxCourses(page) {
        $.ajax({
            url: 'http://study.jsplusplus.com/Lfcourses/getCourses',
            type: 'post',
            dataType: 'JSON',
            data: {
                page: page
            },
            success: function (data) {
                console.log(data);
                cache[page] = data;
                oLoading.className += ' show'
                setTimeout(function () {
                    render(data);
                    oLoading.className = 'loading J_loading'
                }, 500)
            },
            error: function () {
                console.log('获取失败');
            }
        })

    }
<!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>
    <link rel="stylesheet" href="./css/index.css">
</head>

<body>
    <div class="wrap">
        <div class="header">
            <h3>课程列表</h3>
        </div>
        <!-- load模块 -->
        <div class="course">
            <div class="loading J_loading">正在加载中...</div>
            <!-- 列表内容 -->
            <ul class="list J_list"></ul>
        </div>
        <!-- 页码脚注 -->
        <div class="footer">
            <div class="btn-group J_btnGroup">
                <div class="btn-item cur">
                    <a href="javascript:;" class="page-lk">1</a>
                </div>
                <div class="btn-item">
                    <a href="javascript:;" class="page-lk">2</a>
                </div>
                <div class="btn-item">
                    <a href="javascript:;" class="page-lk">3</a>
                </div>
                <div class="btn-item">
                    <a href="javascript:;" class="page-lk">4</a>
                </div>
                <div class="btn-item">
                    <a href="javascript:;" class="page-lk">5</a>
                </div>
            </div>
        </div>
    </div>

    <script type="text/html" id="J_itemTpl">
        <li class="list-item">
            <div class="inner">
                <div class="img">
                    <img src="http://10.url.cn/qqcourse_logo_ng/ajNVdqHZLLAibZAsw0xhFpUeJmHcOGzXwIMu8d3tz5388Tod9zfTYzKRr3Yum8M4ibBHtXGn3iaH34/356?tp=webp" />
                </div>
                <div class="info">
                    <h4>{{classname}}</h4>
                    <p class="row-2">{{name}}老师</p>
                    <p class="row-3">{{watched}}人学习</p>
                  </div>
            </div>
        </li>
    </script>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/utils.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
</body>

</html>
h1,
h2,
h3,
h4,
h5,
h6,
p {
    margin: 0;
    font-weight: normal;
}

a {
    text-decoration: none;
}

ul {
    padding: 0;
    margin: 0;
    list-style: none;
}

.wrap {
    position: relative;
    width: 375px;
    height: 667px;
    margin: 100px auto;
    box-shadow: 0 0 5px #999;
}

.header {
    height: 44px;
    background-color: #000;
    text-align: center;
    line-height: 44px;
    color: #fff;
}

.course .loading {
    display: none;
    height: 44px;
    background-color: #eee;
    text-align: center;
    line-height: 44px;
    font-size: 14px;
}
.course .loading.show{
    display: block;
}

/* 父元素设置超出隐藏 若子元素高度超出 则出现滚动条 */
.course .list {
    height: 579px;
    overflow: auto;
}

.course .list-item {
    height: 100px;
    padding: 10px;
    box-sizing: border-box;
    border-bottom: 1px solid #ddd;
}

.course .list-item .inner {
    position: relative;
    height: 100px;
}

.course .list-item .img {
    position: absolute;
    top: 0;
    left: 0;
    width: 141px;
}

.course .list-item .img img {
    width: 100%;
    height: 100%;
}

.course .list-item .info {
    width: 195px;
    padding: 0 0 0 151px;
    box-sizing: border;

}

.course .list-item .info p {
    font-size: 14px;
    margin-top: 7px;
}

.course .list-item .info p.row-2 {
    color: green;
}

.course .list-item .info p.row-3 {
    color: #999;
}

.footer .btn-item {
    float: left;
    width: 20%;
    height: 100%;
}

.footer .btn-item .page-lk {
    display: block;
    width: 30px;
    height: 30px;
    margin: 7px auto;
    background-color: #000;
    text-align: center;
    line-height: 30px;
    color: #fff;
}

.footer .btn-item.cur .page-lk {
    background-color: #eee;
    color: #000;
}
;
(function () {
    var oBtnGroup = document.getElementsByClassName('J_btnGroup')[0],
        oBtnItems = document.getElementsByClassName('btn-item'),
        tpl = document.getElementById('J_itemTpl').innerHTML,
        oList = document.getElementsByClassName('J_list')[0],
        oLoading = document.getElementsByClassName('J_loading')[0],
        page = 0,
        cache = {};

    var init = function () {
        bindEvent();
        getAjaxCourses(page);
    }

    function bindEvent() {
        oBtnGroup.addEventListener('click', btnClick, false);
    }

    function btnClick(e) {
        var e = e || window.event,
            tar = e.target || e.srcElement,
            oParent = tar.parentNode,
            className = oParent.className;
        if (className === 'btn-item') {
            var thisIdx = Array.prototype.indexOf.call(oBtnItems, oParent);
            page = thisIdx;
            // 此处知识点 类数组不能使用数组方法:
            // Array.prototype.slice.call(arr) :将类数组转换位数组
            // Array.prototype.forEach.call(arr): 把数组方法放到类数组上使用
            Array.prototype.forEach.call(oBtnItems, function (elem) {
                elem.className = 'btn-item';
            });

            oParent.className += ' cur';

            // 如果缓存池池有数据则调用缓存池的数据
            // if (cache[page]) {
            //     getCacheCourses(page);
            //     // 否则使用ajax请求
            // } else {
            //     getAjaxCourses(page);
            // }
            cache[page] ? getCacheCourses(page) : getAjaxCourses(page);
        }
    }

    // 列表渲染
    function render(data) {
        var list = '';
        data.forEach(function (elem) {
            list += tpl.replace(/{{(.*?)}}/gim, function (node, key) {
                return {
                    folder: elem.folder,
                    classname: elem.classname,
                    name: elem.name,
                    watched: elem.watched
                } [key];
            });
        });
        oList.innerHTML = list;
    }
    //  ajax数据请求
    function getAjaxCourses(page) {
        $.ajax({
            url: 'http://study.jsplusplus.com/Lfcourses/getCourses',
            type: 'post',
            dataType: 'JSON',
            data: {
                page: page
            },
            success: function (data) {
                console.log(data);
                cache[page] = data;
                oLoading.className += ' show'
                setTimeout(function () {
                    render(data);
                    oLoading.className = 'loading J_loading'
                }, 500)
            },
            error: function () {
                console.log('获取失败');
            }
        })

    }
    // 缓存池
    function getCacheCourses(page) {
        var data = cache[page];
        render(data);
    }
    init();
})();