文章评分评级jquery插件

居于jquery框架的文章评分评级插件,效果如下

文章评分评级jquery插件

数据库设计很简单,就用一个字段存储score,记录1-5星投票的人数,用“|”分隔开。循序为5星|4星|3星|2星|1星

注意:这个字段的默认值要设置为“0|0|0|0|0

 

测试源代码及相关使用说明如下

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<style>
.codescore{font-size:12px;position:absolute;width:270px;border:solid 1px #cccccc;z-index:10;display:none;}
.codescore .top{height:23px;line-height:23px; vertical-align:middle;padding-left:20px;background:url(/images/startop.gif) repeat-x;}
.codescore .top img{position:absolute;right:2px;top:2px;cursor:pointer;}
.codescore .dt{height:140px;background:url(/images/starbg.gif) repeat-x;width:100%;}
.codescore .dt ul{margin:0px;list-style:none;padding:13px 0px 0px 10px;}
.codescore .dt ul li{height:22px;}
.codescore .dt ul li span{display:block;float:left;}
.codescore .dt ul li span.star{width:65px;}
.codescore .dt ul li span.picnum{width:120px;border:solid 1px #bbbbbb;height:14px;}
.codescore .dt ul li span.picnum img{height:100%;}
.codescore .dt ul li span.num{width:60px;height:20px;overflow:hidden;padding-left:10px;line-height:20px;vertical-align:bottom;}
.codescore .dt .giveScore{padding-left:10px;}
</style>
<span id="spScore"></span>
<script>
    var comm = {//cookie操作,用于记录已经打分过文章
        GetCookie: function (name) { var m = new RegExp(name + '=([^;]+)', 'i').exec(document.cookie); if (m) return unescape(m[1]); return ""; },
        SetCookie: function (name, value, cfgTime) { var d; if ("undefined" != typeof (icfgTime)) { d = new Date(); if (cfgTime.y) d.setFullYear(d.getFullYear() + cfgTime.y); if (cfgTime.M) d.setMonth(d.getMonth() + cfgTime.M); if (cfgTime.d) d.setDate(d.getDate() + cfgTime.d); if (cfgTime.h) d.setHours(d.getHours() + cfgTime.h); if (cfgTime.m) d.setMinutes(d.getMinutes() + cfgTime.m); if (cfgTime.s) d.setSeconds(d.getSeconds() + cfgTime.s); } document.cookie = name + "=" + value + ";path=/;" + (d ? "expires=" + d.toGMTString() : ''); }
    };
    window.onload = function () {
        (function ($) {
            /*cfg配置
            *red:红色星星url
            *gray:灰色星星url
            *half:红灰个半星星url地址
            *up:打分下拉箭头url地址
            *close:关闭打分弹出层下拉地址
            *ptimg:分数比例图片地址
            *url:分数保存地址
            *score:分数
            *pos:打分弹出层位置,1:居于下拉箭头左边  2:居于下拉箭头右边,默认2
            ******************上面的可以省略,会自动分配默认值
            *id:要打分评级的文章唯一id,不能省略
            */
            $.fn.score = function (cfg) {
                function computePercent() {
                    if (_totalnum == 0) return;
                    for (var i = 0; i < 5; i++) _ptArr[i] = comm.round(_numArr[i] / _totalnum, 2) * 100;
                }
                function init() {
                    if (!cfg.red) cfg.red = '/images/star_red.gif';
                    if (!cfg.gray) cfg.gray = '/images/star_gray.gif';
                    if (!cfg.half) cfg.half = '/images/star_half.gif';
                    if (!cfg.up) cfg.up = '/images/btnup.gif';
                    if (!cfg.down) cfg.down = '/images/btndown.gif';
                    if (!cfg.close) cfg.close = '/images/close.gif';
                    if (!cfg.ptimg) cfg.ptimg = '/images/startiao.gif';
                    if (!cfg.url) cfg.url = '/ashx/score.ashx';
                    if (!/^\d+(\|\d+){4}$/.test(cfg.score)) cfg.score = '0|0|0|0|0';
                    _numArr = cfg.score.split('|');
                    var i = 0, m;
                    for (m = _numArr.length; i < m; i++) {
                        _numArr[i] = parseInt(_numArr[i], 10);
                        _totalnum += _numArr[i];
                        _totalscore += _numArr[i] * (5 - i);
                    }
                    computePercent();
                }
                function reset(e) {
                    var o = e ? $(this) : false, idx = e ? parseInt(o.attr('title'), 10) - 1 : 0, et = e ? e.type : 'mouseout';
                    clearTimeout(timer);
                    timer = setTimeout(function () {
                        if (et == 'mouseout') _stars.attr('src', cfg.gray);
                        else {
                            o.attr('src', cfg.red);
                            _stars.filter(':lt(' + idx + ')').attr('src', cfg.red);
                            _stars.filter(':gt(' + idx + ')').attr('src', cfg.gray);
                        }
                    }, 100);
                }
                function callserver() {
                    var o = $(this), idx = 5 - parseInt(o.attr('title'), 10), sp = o.parent().next();
                    _stars.unbind();
                    sp.show();
                    $.ajax({
                        url: cfg.url,
                        type: 'POST',
                        data: 'id=' + cfg.id + '&idx=' + idx,
                        complete: function (xhr) {
                            var r = comm.evalJSON(xhr);
                            sp.hide();
                            if (r.success) {
                                _totalnum += 1;
                                _numArr[idx] += 1;
                                _totalscore += 5 - idx;
                                initDOM();
                                _spTotal.html(_totalnum);
                                _ul.find('li:eq(' + idx + ') span:last').html(_numArr[idx] + '人');
                                computePercent();
                                for (var i = 0; i < 5; i++) _ul.find('li:eq(' + i + ') img:last').css('width', _ptArr[i] + '%');
                                comm.SetCookie('code' + cfg.id, 5 - idx, {
                                    y: 1
                                });
                                _stars.parent().find('label').html('您的评分为');
                            } else {
                                alert(r.err);
                                reset();
                                _stars.mouseover(reset).mouseout(reset).click(callserver);
                            }
                        }
                    });
                }
                function initDOM() {
                    var avg, it, html = '';
                    avg = _totalnum == 0 ? 0 : comm.round(_totalscore / _totalnum, 1);
                    it = Math.floor(avg);
                    for (var i = 1; i <= it; i++) html += '<img src="' + cfg.red + '" />';
                    if (avg > eval(it + '.3')) html += '<img src="' + cfg.half + '" />';
                    _fontScore.html(avg);
                    _lbStar.html(html);
                }
                function InitGUI() {
                    if (!/^\d+$/.test(cfg.id) || !me.get(0)) return false;
                    var html = '', i, j, _dt, _score = comm.GetCookie('code' + cfg.id);
                    init();
                    me.html('<b>推荐:</b><font class="score"></font>星<label></label> <img src="' + cfg.down + '" alt="查看详情"/>');
                    _fontScore = me.find('font');
                    _lbStar = me.find('label');
                    initDOM();
                    _btn = me.find('img:last');
                    _btn.mouseover(function () {
                        if (!_setpos) {
                            _pop.css({
                                left: _btn.offset().left + _btn.width() - (cfg.pos==1?0:_pop.width()),
                                top: _btn.offset().top + _btn.height()
                            });
                            _setpos = true;
                        }
                        this.src = cfg.up;
                        _pop.fadeIn(100);
                    });
                    _pop = $('<div class="codescore"></div>').appendTo(document.body);
                    _pop.mouseout(function (e) {
                        var o = e.toElement || e.relatedTarget;
                        if (this.contains(o)) return false;
                        _pop.fadeOut(100);
                        _btn.attr('src', cfg.down);
                    });
                    _pop.html('<div class="top">评分详情(<span>' + _totalnum + '</span>人)<img alt="关闭" src="' + cfg.close + '"></div>');
                    _pop.find('img').click(function () {
                        _pop.fadeOut(100);
                        _btn.attr('src', cfg.down);
                    });
                    _spTotal = _pop.find('span');
                    if (/^[1-5]$/.test(_score)) _score = parseInt(_score, 10);
                    else _score = 0;
                    html = '<ul>';
                    for (i = 0; i < 5; i++) {
                        html += '<li><span class="star">';
                        for (j = i; j < 5; j++) html += '<img src="' + cfg.red + '"/>';
                        for (j = 5 - i; j < 5; j++) html += '<img src="' + cfg.gray + '"/>';
                        html += '</span><span class="picnum"><img src="' + cfg.ptimg + '" width="' + _ptArr[i] + '%"/></span><span class="num">' + _numArr[i] + '人</span></li>';
                    }
                    html += '</ul>';
                    html += '<div class="giveScore"><span><label>' + (_score == 0 ? '请给出' : '您的') + '评分' + (_score == 0 ? '' : '为') + '</label>:';
                    if (_score == 0) {
                        for (i = 0; i < 5; i++) html += '<img src="' + cfg.gray + '" title="' + (i + 1) + '星"/>';
                        html += "</span><span style='display:none;'>正在更新,请等待...</span></div>";
                    } else {
                        for (i = 0; i < _score; i++) html += '<img src="' + cfg.red + '"/>';
                        for (i = _score; i < 5; i++) html += '<img src="' + cfg.gray + '"/>';
                    }
                    _dt = $('<div class="dt"></div>').appendTo(_pop);
                    _dt.html(html);
                    if (_score == 0) {
                        _ul = _dt.find('ul');
                        _stars = _dt.find('div.giveScore img');
                        _stars.mouseover(reset).mouseout(reset).click(callserver);
                    }
                }
                var _totalnum = 0, _totalscore = 0, _numArr, _ptArr = [0, 0, 0, 0, 0], _fontScore, _btn, _lbStar, _pop, _spTotal, _stars, _ul, me = this, _setpos = false, timer = null;
                InitGUI();
            }
        })(jQuery);
        $('#spScore').score({ id: 123, score: '0|0|0|0|0',pos:1 });
    }
</script>

 


下面给出动态页更新的方法C#方法


 private void Update()
    {
        string Id = Request.Form["id"], star = Request.Form["star"];
        if (UserCheck.IsInt(Id))//因为提交到同一个页面,所以判断下是浏览还是ajax提交
        {//UserCheck.IsInt就是一个判断字符串是否为数字的函数,这里不贴出来了
            string msg = "";
            int s = 5;
            if (!UserCheck.IsInt(star)) msg += "{success:false,err:'星级为数字!'}";
            else {
                s = int.Parse(star);
                if (s > 5 || s < 1) msg += "{success:false,err:'星级为1-5的数字!'}";
            }
            if (msg == "")
            {
                s = 5 - s;//注意这里循序是从5-1,所以要处理下
//==============使用自己的dbhelper类获取
                DBHelper db = new DBHelper();
                object ss = DBHelper.ExecScalar("select 存储分数的字段 from 表 where 唯一id字段=" + Id,db.CN);
//===============
                if (ss == null) msg = "{success:false,err:'要评分的软件不存在!'}";
                else
                {
                    string[] arr = ss.ToString().Split('|');
                    for (int i = 0; i < 5; i++) if (i == s) { arr[i] = (int.Parse(arr[i]) + 1).ToString(); break; }//遍历分数数组更新对应的人数
                    string UpStar = arr[0] + "|" + arr[1] + "|" + arr[2] + "|" + arr[3] + "|" + arr[4];//转换为字符串
                    DBHelper.ExecNoNQuery("update 表 set 存储分数的字段='" + UpStar + "' where 唯一id字段=" + Id, db.CN);//更新
                    msg = "{success:true}";
                }
                db.CloseDB();
            }
            Response.Write(msg);
            Response.End();
        }
    }

下面这个是asp版本的update.asp

Id = Request.Form("id")&"":star = Request.Form("star")&""
if isnumeric(id) then'sql注入判断
  if not isnumeric(star) then
    response.write "{success:false,err:'星级为数字!'}"
  else
   s=cint(star)
   if s>5 or s<1 then
     response.write "{success:false,err:'星级为1-5的数字!'}"
   else
     s = 5 - s'注意这里循序是从5-1,所以要处理下
     set cn=server.createobject("adodb.connection")
     cn.open "驱动字符串"
     set rs=server.createobject("adodb.recordset")
     rs.open "select 存储分数的字段 from 表 where 唯一id字段=" & Id,cn,1,3
     if rs.eof or rs.bof then
       response.write "要评分的软件不存在!"
     else
       arr=split(rs(0),"|")
       for i = 0 to 4'遍历分数数组更新对应的人数
         if i=s then
           arr(i)= cint(arr(i)) + 1):exit for
         end if
       next
       rs(0)=arr(0)&"|"&arr(1)&"|"&arr(2)&"|"&arr(3)&"|"&arr(4)
       rs.update
       response.write "{success:true}"
     end if
     rs.close:set rs=nothing:cn.close:set cn=nothing
   end if
  end if
else
  response.write "{success:false,err:'要评论的软件Id为数字!'}"
end if
 

jquery.score.js源代码

(function($) {
    $.fn.score = function(cfg) {
        function computePercent() {
            if (_totalnum == 0) return;
            for (var i = 0; i < 5; i++) _ptArr[i] = comm.round(_numArr[i] / _totalnum, 2) * 100;
        }
        function init() {
            if (!cfg.red) cfg.red = '/images/star_red.gif';
            if (!cfg.gray) cfg.gray = '/images/star_gray.gif';
            if (!cfg.half) cfg.half = '/images/star_half.gif';
            if (!cfg.up) cfg.up = '/images/btnup.gif';
            if (!cfg.down) cfg.down = '/images/btndown.gif';
            if (!cfg.close) cfg.close = '/images/close.gif';
            if (!cfg.ptimg) cfg.ptimg = '/images/startiao.gif';
            if (!cfg.url) cfg.url = '/ashx/score.ashx';
            if (!/^\d+(\|\d+){4}$/.test(cfg.score)) cfg.score = '0|0|0|0|0';
            _numArr = cfg.score.split('|');
            var i = 0,
            m;
            for (m = _numArr.length; i < m; i++) {
                _numArr[i] = parseInt(_numArr[i], 10);
                _totalnum += _numArr[i];
                _totalscore += _numArr[i] * (5 - i);
            }
            computePercent();
        }
        function reset(e) {
            var o = e ? $(this) : false,
            idx = e ? parseInt(o.attr('title'), 10) - 1 : 0,
            et = e ? e.type: 'mouseout';
            clearTimeout(timer);
            timer = setTimeout(function() {
                if (et == 'mouseout') _stars.attr('src', cfg.gray);
                else {
                    o.attr('src', cfg.red);
                    _stars.filter(':lt(' + idx + ')').attr('src', cfg.red);
                    _stars.filter(':gt(' + idx + ')').attr('src', cfg.gray);
                }
            },
            100);
        }
        function callserver() {
            var o = $(this),
            idx = 5 - parseInt(o.attr('title'), 10),
            sp = o.parent().next();
            _stars.unbind();
            sp.show();
            $.ajax({
                url: cfg.url,
                type: 'POST',
                data: 'id=' + cfg.id + '&idx=' + idx,
                complete: function(xhr) {
                    var r = comm.evalJSON(xhr);
                    sp.hide();
                    if (r.success) {
                        _totalnum += 1;
                        _numArr[idx] += 1;
                        _totalscore += 5 - idx;
                        initDOM();
                        _spTotal.html(_totalnum);
                        _ul.find('li:eq(' + idx + ') span:last').html(_numArr[idx] + '人');
                        computePercent();
                        for (var i = 0; i < 5; i++) _ul.find('li:eq(' + i + ') img:last').css('width', _ptArr[i] + '%');
                        comm.SetCookie('code' + cfg.id, 5 - idx, {
                            y: 1
                        });
                        _stars.parent().find('label').html('您的评分为');
                    } else {
                        alert(r.err);
                        reset();
                        _stars.mouseover(reset).mouseout(reset).click(callserver);
                    }
                }
            });
        }
        function initDOM() {
            var avg, it, html = '';
            avg = _totalnum == 0 ? 0 : comm.round(_totalscore / _totalnum, 1);
            it = Math.floor(avg);
            for (var i = 1; i <= it; i++) html += '<img src="' + cfg.red + '" />';
            if (avg > eval(it + '.3')) html += '<img src="' + cfg.half + '" />';
            _fontScore.html(avg);
            _lbStar.html(html);
        }
        function InitGUI() {
            if (!/^\d+$/.test(cfg.id) || !me.get(0)) return false;
            var html = '',
            i, j, _dt, _score = comm.GetCookie('code' + cfg.id);
            init();
            me.html('<b>推荐:</b><font class="score"></font>星<label></label> <img src="' + cfg.down + '" alt="查看详情"/>');
            _fontScore = me.find('font');
            _lbStar = me.find('label');
            initDOM();
            _btn = me.find('img:last');
            _btn.mouseover(function() {
                if (!_setpos) {
                    _pop.css({
                        left: _btn.offset().left + _btn.width() - _pop.width(),
                        top: _btn.offset().top + _btn.height()
                    });
                    _setpos = true;
                }
                this.src = cfg.up;
                _pop.fadeIn(100);
            });
            _pop = $('<div class="codescore"></div>').appendTo(document.body);
            _pop.mouseout(function(e) {
                var o = e.toElement || e.relatedTarget;
                if (this.contains(o)) return false;
                _pop.fadeOut(100);
                _btn.attr('src', cfg.down);
            });
            _pop.html('<div class="top">评分详情(<span>' + _totalnum + '</span>人)<img alt="关闭" src="' + cfg.close + '"></div>');
            _pop.find('img').click(function() {
                _pop.fadeOut(100);
                _btn.attr('src', cfg.down);
            });
            _spTotal = _pop.find('span');
            if (/^[1-5]$/.test(_score)) _score = parseInt(_score, 10);
            else _score = 0;
            html = '<ul>';
            for (i = 0; i < 5; i++) {
                html += '<li><span class="star">';
                for (j = i; j < 5; j++) html += '<img src="' + cfg.red + '"/>';
                for (j = 5 - i; j < 5; j++) html += '<img src="' + cfg.gray + '"/>';
                html += '</span><span class="picnum"><img src="' + cfg.ptimg + '" width="' + _ptArr[i] + '%"/></span><span class="num">' + _numArr[i] + '人</span></li>';
            }
            html += '</ul>';
            html += '<div class="giveScore"><span><label>' + (_score == 0 ? '请给出': '您的') + '评分' + (_score == 0 ? '': '为') + '</label>:';
            if (_score == 0) {
                for (i = 0; i < 5; i++) html += '<img src="' + cfg.gray + '" title="' + (i + 1) + '星"/>';
                html += "</span><span style='display:none;'>正在更新,请等待...</span></div>";
            } else {
                for (i = 0; i < _score; i++) html += '<img src="' + cfg.red + '"/>';
                for (i = _score; i < 5; i++) html += '<img src="' + cfg.gray + '"/>';
            }
            _dt = $('<div class="dt"></div>').appendTo(_pop);
            _dt.html(html);
            if (_score == 0) {
                _ul = _dt.find('ul');
                _stars = _dt.find('div.giveScore img');
                _stars.mouseover(reset).mouseout(reset).click(callserver);
            }
        }
        var _totalnum = 0,
        _totalscore = 0,
        _numArr, _ptArr = [0, 0, 0, 0, 0],
        _fontScore,
        _btn,
        _lbStar,
        _pop,
        _spTotal,
        _stars,
        _ul,
        me = this,
        _setpos = false,
        timer = null;
        InitGUI();
    }
})(jQuery);




 

加支付宝好友偷能量挖...


原创文章,转载请注明出处:文章评分评级jquery插件

评论(1)Web开发网
阅读(340)喜欢(0)JavaScript/Ajax开发技巧