JavaScript 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>

实现点赞的js函数

/*
* 实现点赞功能
* @param    资源id
* */
function addStar(id){
    var star=getCookieById("star",id);
    if(star==""){
        addCookieById("star",id,365);
        //后台点赞操作
        $.ajax({
            .....
        })
    }else{
        alert("您已经点赞过啦!");
    }
}

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;
}

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

<body onload="starInit()">
...
</body>

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hober.z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值