• 前端实现未读消息提醒小红点


    原理

    通过将消息是否查看的数据存写入localStorage中,点击查看后,更新localStorage的数据;

    文件结构: 

    index.html    --  列表    
    detail            --  详情
    remind          -- js组件

    调用方法:

    index.html说明:

    1.列表中红点相对定位在列表文本右上角,d为数据源,amGloble.Remind(d, 'text', 'id', 'list')调用方法;

    2.点击列表,会将每条数据中的文本text,唯一标识id在地址栏传给detial.html详情页;

    ul li {
        list-style: none;
        padding: 8px 0;
    }
    
    li span {
        position: relative;
    }
    
    .point {
        position: absolute;
        top: 0;
        right: -5px;
         6px;
        height: 6px;
        background: red;
        border-radius: 50%;
    }
    
    <ul id="list"></ul>
    
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script src="./remind.js"></script>
    <script>
        var d = [{ text: '亚瑟', id: 1 }, { text: '', id: 2 }, { text: '露娜', id: 3 }];
        // d:数据, text:数据中的文本, key:数据中的唯一标识, dom:插入DOM节点的id名
        amGloble.Remind(d, 'text', 'id', 'list');
    </script>

    detail.html 说明:

    1.获取地址栏参数文本text,唯一标识id;
    2.如果拿到本条数据id,说明用户已经进入详情页,则将localStorage中存储的查看数据更新;

    <div id="detail"></div>
    
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script src="./remind.js"></script>
    <script>
        var key = amGloble.GetQueryString('key');  // 获取地址栏参数
        amGloble.Updata(key);    // 更新查看数据
    
        var text = amGloble.GetQueryString('text');
        $('#detail').text(text);
    </script>

    remind.js说明:

    1.remind()方法是写入数据,在index.html页面中调用,默认全部初始化为false,未读;

    2.Update()方法更新数据,在detail.html页面中调用,查看过这条数据,这把这条数据改为true,已查看;

    3.GetQueryString(),是常见的获取地址栏参数的方法。

    (function () {
        window.amGloble = {
            Remind: function (d, text, key, dom) {    // d:数据,text:数据中的文本,key:数据中的唯一标识(id),dom:插入DOM节点的id名
                var checkData = JSON.parse(localStorage.getItem('checkData'));
                if (JSON.stringify(checkData) == 'null') {
                    checkData = {};
                };
                var html = '';
                for (i = 0, l = d.length; i < l; i++) {
                    var isChecked = false;
                    var isOwn = checkData.hasOwnProperty(d[i][key]);   // 判断是否包含这个属性
                    if (isOwn) {       // 如果包含这个订单属性,则取localStorage中的值
                        isChecked = checkData[d[i][key]];
                    } else {           // 初始化都为false
                        checkData[d[i][key]] = false;    // localStorage没有此订单查看状态,则赋值fasle未查看
                        localStorage.setItem('checkData', JSON.stringify(checkData));       // 转为JSON字符串,存储localStorage  
                    };
    
                    var point = isChecked ? '' : '<div class="point"></div>';   // 已查看不显示红点,未查看就显示红点
                    html += '<li><a href="./detail.html?key=' + d[i][key] + '&text=' + d[i].text + '"><span>' + d[i].text + point + '</span></a></li>';
                };
                $('#' + dom).html(html);
            },
            Updata: function (key) {
                if (key) {
                    var checkData = JSON.parse(localStorage.getItem('checkData'));
                    if (JSON.stringify(checkData) != 'null') {
                        checkData[key] = true;
                        localStorage.setItem('checkData', JSON.stringify(checkData));
                    }
                };
            },
            GetQueryString: function (name) {
                // 获取地址栏参数
                var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
                var r = window.location.search.substr(1).match(reg);
                if (r != null) return decodeURIComponent(r[2]); return null;
            }
        }
    })();

    再返回到index.html页面中,则显示:

    第一条我们点击过链接,已查看的数据,在index.html页面中,不再显示红点;

    localStorage中存储的数据是这样的:

  • 相关阅读:
    Java基础学习(五) String类
    Java基础学习(四) java8线程
    Java基础学习(三) IO
    Java基础学习(二) 集合
    Java基础学习(一) 基本数据类型和引用数据类型
    枚举类常见漏洞解决
    数据校验
    postman如何传递token进行接口测试
    Spring Cloud-OpenFegin
    SpringCloud-Eureka
  • 原文地址:https://www.cnblogs.com/hcxwd/p/8360285.html
Copyright © 2020-2023  润新知