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

原理

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

 

posted @ 2018-01-26 17:50  清风晰心  阅读(24138)  评论(1编辑  收藏  举报