• JavaScript cookie操作实现点赞功能


    JavaScript cookie操作实现点赞功能

    参考实现原理,但是代码不够简洁,简洁代码参考:js操作cookie

    实现一个点赞功能十分简单,主要问题在于不能重复点赞。 
      若是一个有用户的网站,可以通过数据库设计记录用户的点赞,这是可行的。 
    但是若是一个不记名的网站,如何记录一个用户呢? 
    这里有两种方法: 
      第一种是利用IP,维护一个IP表,记录点赞过的用户,防止该IP重复点赞,问题是IP可能会更换。 
      第二种是利用cookie,通过一个cookie标注一个用户,防止重复点赞,问题是cookie是可以修改的。 
    对于一个单纯的只需要展示热度的网站,利用IP或cookie实现点赞都是可以接受的。因为很少有人会无聊的利用这些缺陷刷赞。 
    这里给出利用js操作cookie实现点赞的代码。

    首先约定cookie中点赞的格式为

    “star”:”1,2,3…”

    前台html(这里使用了TP的模板渲染,并用了bootstrap图标)

    <div class="file-star" onclick="addStar({$f[id]})">
        <a href="javascript:void(0)">
            <span id="star{$f[id]}" class="glyphicon glyphicon-star-empty"> {$f[star]}</span>
        </a>
    </div>
    • 1
    • 2
    • 3
    • 4
    • 5

    实现点赞的js函数

    /*
    * 实现点赞功能
    * @param    资源id
    * */
    function addStar(id){
        var star=getCookieById("star",id);
        if(star==""){
            addCookieById("star",id,365);
            //后台点赞操作
            $.ajax({
                .....
            })
        }else{
            alert("您已经点赞过啦!");
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    addstar中调用的操作cookie的函数如下

    /*
    * 获取特定cookie的值
    * @param    cookie键
    * @return   cookie该键对应的值
    * */
    function getCookie(cname){
        var name=cname+"=";
        var ca=document.cookie.split(';');
        for(var i=0;i<ca.length;i++){
            var c=ca[i].trim();
            if(c.indexOf(name)==0)
                return c.substring(name.length,c.length);
        }
        return "";
    }
    
    /*
    * 判断cookie键中是否有某个资源的id
    * @param    cookie键
    * @param    查询资源id
    * @return   存在返回true,否则返回""
    * */
    function getCookieById(cname,id){
        var name=cname+"=";
        var ca=document.cookie.split(';');
        var cValue="";
        for(var i=0;i<ca.length;i++){
            var c=ca[i].trim();
            if(c.indexOf(name)==0)
                cValue=c.substring(name.length,c.length);
        }
        if(cValue!=""){
            var cArray=cValue.split(",");
            for(var i=0;i<cArray.length;i++){
                var c=cArray[i].trim();
                if(c.indexOf(id)==0){
                    return true;
                }
            }
        }
        return "";
    }
    
    
    /*
    * 添加某个资源id到cookie键中
    * @param    cookie键名
    * @param    资源id
    * @param    cookie过期时间
    * */
    function addCookieById(cname,id,exdays){
        var cvalue=getCookie(cname);
        if(cvalue==""){
            cvalue=id;
        }else {
            var cArray=cvalue.split(",");
            var flag=0;
            for(var i=0;i<cArray.length;i++){
                var c=cArray[i].trim();
                if(c.indexOf(id)==0){
                    flag=1;
                    break;
                }
            }
            if(flag==0) {
                cvalue += "," + id;
            }
        }
    
        var d=new Date();
        d.setTime(d.getTime()+(exdays*24*60*60*1000));
        var expires="expires="+d.toGMTString();
        document.cookie=cname+"="+cvalue+"; "+expires;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    当用户重新刷新后,也要正确显示是否点赞否个资源,所以在body的onload中添加starInit()函数

    <body onload="starInit()">
    ...
    </body>
    • 1
    • 2
    • 3

    starInit函数

    /*
    * 页面刷新时正确显示是否点赞了某个资源
    * */
    function starInit(){
        var star=getCookie("star");
        if(star!=""){
            var cArray=star.split(",");
            for(var i=0;i<cArray.length;i++){
                var id=cArray[i].trim();
                $("#star"+id).attr("class","glyphicon glyphicon-star");
            }
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这里展示一个演示网址,请大家手下留情

  • 相关阅读:
    来自Jakob Jenkov的Jackson教程
    Linux查看某个端口的连接数
    Linux查看某个进程的线程
    Jackson反序列JSON为实体对象出现:no String-argument constructor/factory method to deserialize from String value的问题
    软路由OpenWrt教程收集(插件开发教程,opkg安装软件教程)
    软路由系统收集
    Linux防止“rm -rf /”误删除
    Mac 10.12原生方法对NTFS分区进行读写的配置
    Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)
    微服务实施Spring Boot/Spring Cloud中踩过的坑(转)
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/8993075.html
Copyright © 2020-2023  润新知