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

原理

通过将消息是否查看的数据存写入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;
    width: 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中存储的数据是这样的:

 

转载于:https://www.cnblogs.com/hcxwd/p/8360285.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值