如何根据投票填写星级评分

时间:2015-10-27 12:00:33

标签: javascript php jquery

我如何填充星级评分的星星已经运行计算的所有内容并且它在变量计算中得到一个回声以查看他将返回我的结果他是我回来但是我无法让它填满举例说明3.3产品并填充它的三颗星和第四颗的30%就像我一样吗?在哪里我必须播放我的变量以在星星中显示它? 代码:

<form id="rating" action"rating.php" method="post">

       <input type="hidden" name="id" id="idd" value="$idprod" />
        <div class="vote">
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="1" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="2" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="3" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="4" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="5" />
          <i class="fa" id="fa"></i>
         </label>
       </div>
  </form>

jquery的:

$('.vote label i.fa').on('click mouseover',function(){
    // remove classe ativa de todas as estrelas
    $('.vote label i.fa').removeClass('active');
    // pegar o valor do input da estrela clicada
    var val = $(this).prev('input').val();
    //percorrer todas as estrelas
    $('.vote label i.fa').each(function(){
        /* checar de o valor clicado é menor ou igual do input atual
        *  se sim, adicionar classe active
        */
        var $input = $(this).prev('input');
        if($input.val() <= val){
            $(this).addClass('active');
        }
    });
    $("#voto").html(val); // somente para teste
});
//Ao sair da div vote
$('.vote').mouseleave(function(){
    //pegar o valor clicado
    var val = $(this).find('input:checked').val();
    //se nenhum foi clicado remover classe de todos
    if(val == undefined ){
        $('.vote label i.fa').removeClass('active');
    } else { 
        //percorrer todas as estrelas
        $('.vote label i.fa').each(function(){
            /* Testar o input atual do laço com o valor clicado
            *  se maior, remover classe, senão adicionar classe
            */
            var $input = $(this).prev('input');
            if($input.val() > val){
                $(this).removeClass('active');
            } else {
                $(this).addClass('active');
            }
        });
    }
    $("#voto").html(val); // somente para teste
});

PHP:

$id = $_GET['cod'];
$sql = mysql_query("SELECT * FROM produtos WHERE id_produto = $id");
$test = mysql_query("SELECT votos, pontos FROM produtos WHERE id_produto = $id");
$aux = mysql_fetch_array($sql);
$idprod = $aux['id_produto'];
$row = mysql_fetch_array($test);
$voto = $row['votos'];
$ponto = $row['pontos'];
$calc = round(($ponto/$voto),1);

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你不确定如何从PHP值中动态填充星星以获得计算出的评分。

我把这个解决方案放在一起,小提琴是here。执行此操作(在AJAX之外)的最佳方法是将计算的评级传递给rating元素上的data属性。然后根据jQuery中显示的那样让你的JS填充星星。我还展示了如何使用click事件填充隐藏的输入字段并重新评估星形填充以表示所点击的内容。

如果稍后未提交表单,您可以通过ajax发布新评级(最佳解决方案是为了避免页面更改只是为了添加新评级)。或者如果提交了表单,只需确保div在元素内部。

这里是代码:

PHP:

//Do your calcuations
$calc = round(($ponto/$voto),1);

HTML

<div class="rating" data-calc="<?php echo $calc; ?>">
    <div class="star" data-seq="1">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />

    </div>
    <div class="star" data-seq="2" >
        <div class="cnt">
            <img class="full2" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <div class="star" data-seq="3">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <div class="star" data-seq="4">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <div class="star" data-seq="5">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <input type="hidden" name="rating" value="" />
</div>

的jQuery

function fillStarOnPercent(star, percent)
{   var fill = 25 *  percent;
    star.children('.cnt').css({'width' : fill +'px'});
}

function fillStars(parent, fullStars, percent){
    for(var i = 1; i < 6; i++)
    {
        var star = parent.find('.star[data-seq="'+i+'"]');
        if(i < fullStars)
            fillStarOnPercent(star, 1);

        if(i == fullStars)
            fillStarOnPercent(star, percent);

        if(i > fullStars)
            fillStarOnPercent(star, 0);
    }
}

$(document).ready(function() {

    jQuery('.rating').each(function() {

        var calc   = jQuery(this).data('calc');
        var fullStars = Math.floor(calc);
        if(fullStars == calc)
            var percent = 1
        else
            var percent = calc - fullStars;

        fillStars( jQuery(this), fullStars, percent );

    });

    jQuery('.rating').on('click', '.star', function() {
       var rating = jQuery(this).data('seq');
        fillStars(jQuery(this).parent(), rating, 1 );

       jQuery(this).parent().children('input[name="rating"]').val(rating);
    });
});

CSS

.star {width:25px;height:25px; position:relative; float:left;}
.star img {display:block; position:absolute; top:0; left:0; width:25px; height:25px;}
.cnt {position:absolute; top:0; left:0; overflow:hidden; width:25px; height:25px}