美文网首页前端学习饥人谷技术博客
AJAX 加载更多(加数据锁)

AJAX 加载更多(加数据锁)

作者: 辉夜乀 | 来源:发表于2017-04-25 12:50 被阅读37次

jsbin展示

  • 有时候网络延时,用户多次点击按钮发送请求,后端接收到多个重复的请求,浪费流量。
  • 在前端加个数据锁就能解决这个问题。
  • 下面是对封装的ajax加数据锁的例子

前端html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        ul,
        li {
            list-style: none;
            padding: 0;
            margin: 0;
        }

        #news>li {
            width: 600px;
            border: 1px solid #000080;
            border-radius: 5px;
            font-size: 1.25rem;
            margin: 0 auto;
            text-align: center;
            padding: 5px;
            margin-top: 10px;
        }

        .btn {
            width: 200px;
            display: block;
            margin: 0 auto;
            margin-top: 20px;
            font-size: 1.5rem;
            padding: 10px;
            background: #AFEEEE;
        }
    </style>
</head>

<body>
    <ul id="news">
        <li>新闻1</li>
        <li>新闻2</li>
        <li>新闻3</li>
        <li>新闻4</li>
        <li>新闻5</li>
    </ul>
    <button id="more" class="btn">加载更多</button>
</body>
<script>
    var btn = $("#more");
    var newsList = $("#news");
    var dataLock = true;   // 数据锁初始是打开的

    btn.addEventListener("click", function() {
        if (!dataLock) {
            return
        }                  // 查看数据锁是否关闭,如果关闭就退出函数
        dataLock = false;
        ajax({
            type: "get",   //可以改为post请求哦!
            url: "/loadMore",
            data: {
                index: newsList.children.length,
                needPage: 3
            },
            success: function (callback){
                addNews(callback);
                dataLock = true;    // 后端发回数据后,打开数据锁

            },
            error: function() {
                console.log("出错了")
            }
        })
    })

    function addNews(arr) {
        var frag = document.createDocumentFragment();
        for (var i = 0; i < arr.length; i++) {
            var list = document.createElement("li");
            list.innerText = arr[i];
            frag.appendChild(list);
        }
        news.appendChild(frag)
    }

    function ajax(opt) {
        var xhr = new XMLHttpRequest();
        //  /loadMore?index=5&needPage=3&
        var url = "";
        for (var key in opt.data) {
            url += key + "=" + opt.data[key] + "&";
        }

        console.log("url:", url)

        if (opt.type === "post") {
            xhr.open(opt.type, opt.url, true)
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
            setTimeout(function(){    // 模拟网络延时,2秒后发送请求
                xhr.send(url)
            }, 2000)

        }
        if (opt.type === "get") {
            xhr.open(opt.type, opt.url + "?" + url, true)
            setTimeout(function() {    // 模拟网络延时,2秒后发送请求
                xhr.send()
            }, 2000)

        }

        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {

                if (xhr.status === 200 || xhr.status === 304) {
                    var result = JSON.parse(xhr.responseText)
                    console.log(result)
                    opt.success(result)
                } else {
                    opt.error()
                }
            }
        }
    }

    function $(str) {
        return document.querySelector(str);
    }
</script>

</html>

app.get("/loadMore", function(req, res) {
    var idx = req.query.index;
    var ndpg = req.query.needPage;
    var news = [];
    for (var i = 0; i < ndpg; i++) {
        news.push("新闻get" + (parseInt(idx) + i + 1))
    }
    res.send(news)
})



app.post("/loadMore", function(req, res) {
        var idx = req.body.index;
        var ndpg = req.body.needPage;
        var news = [];
        for (var i = 0; i < ndpg; i++) {
            news.push("新闻post" + (parseInt(idx) + i + 1))
        }
        res.send(news)
        // setTimeout(function(){
        //     res.send(news)
        // }, 1000)
    })

相关文章

  • AJAX 加载更多(加数据锁)

    jsbin展示 有时候网络延时,用户多次点击按钮发送请求,后端接收到多个重复的请求,浪费流量。 在前端加个数据锁就...

  • JavaScript Ajax 和 JSON(八)

    Ajax: 允许加载数据而无需刷新整个页面 Ajax 采用异步( 或称非阻塞 )处理模型, 所以浏览器在等待数据加...

  • AJAX 加载更多

    jsbin展示 封装的ajax函数,post、get请求都可以使用 前端html 后端router.js

  • 滚动条滚动到可视区域加载数据

    实现功能:页面某版块,当滚动条滚动到该区域时加载数据,否则不加载,节省页面加载时间 加一个开关,当ajax请求成功...

  • ajax(实现加载更多)

    题目1:ajax 是什么?有什么作用? ajax是异步的javascript和xml 1优点 实现网页的异步加载,...

  • ajax点击加载更多

    ajax实现点击加载更多效果逻辑还是相对比较简单,点击按钮累加分页数据即可。 一、说明 首先,通过后端程序猿欧巴提...

  • 简单的loading加载

    数据正在加载中... $.ajax({url:"ajax_Video",d...

  • 2019-01-14 ajax,jsonp,jQuery-jso

    ajax() 方法通过 HTTP 请求加载远程数据。AJAX = 异步 JavaScript 和 XML(Asyn...

  • 118.获取网页的方式

    一。Ajax的动态加载数据(requests库) 美团网(ajax动态,一次性加载完数据,在开发者工具的Netwo...

  • 18. 项目实战:首页开发(四)

    实现加载更多功能 这里我们想做一个加载更多按钮的功能,点击按钮,page加1,然后调接口显示数据。1.写一个加载更...

网友评论

    本文标题:AJAX 加载更多(加数据锁)

    本文链接:https://www.haomeiwen.com/subject/tblvzttx.html