JS实现五星好评效果

用JS实现面向对象方法实现京东的五星好评效果。

鼠标滑过时的显示:

当评价完成后,关闭浏览器重新打开页面,还是上次的评价结果。用cookie实现。

具体实现如下:

import Componenet from "./Component.js";

export default class Stars extends Componenet {

    label;
    STARS_NUM = 5;
    starArr = [];
    score = 0;
    starsCon;
    faceIcon;
    scoreCon;
    index = -1;
    name;

    static STARS_LIST={};   //存储当前页面中所有的五星评价结果,一个商品为一组。用商品的id作为key,用商品评价组成一个数组,作为value。
    date=new Date();

    constructor(_label,_name) {
        super("div");
        this.name=_name;
        this.label = _label;
        Object.assign(this.elem.style, {
            width:"200px",
            height: "16px",
            float: "left",
            marginRight: "20px",
            marginBottom: "10px",
            fontSize: "12px",
            color: "#666",
            lineHeight: "16px",
            userSelect: "none",
            position: "relative",
            top: "20px",
            left: "20px",
        })
        // 解析cookie中存储的评论结果并在创建每个评论时初始化score的值。
        this.initScore();
        // 创建评价标签部分
        this.createLabel();
        // 创建星星部分
        this.createStars();
        // 创建分数部分
        this.createScore();
        // 初始化星星样式。
        this.changeStarStyle(this.score-1);
        // 初始化分数
        this.changeScore(this.score);
        // 添加鼠标滑过点击事件。
        this.starsCon.addEventListener("mouseenter", e => this.mouseHandler(e));
        this.starsCon.addEventListener("mouseleave", e => this.mouseHandler(e));
        this.starsCon.addEventListener("mouseover", e => this.mouseHandler(e));
        this.starsCon.addEventListener("click", e => this.clickHandler(e));
        this.date.setFullYear(2021);
    }
    appendTo(_parent){
        super.appendTo(_parent);
        if(!Stars.STARS_LIST[this.name]) Stars.STARS_LIST[this.name]=[];
        Stars.STARS_LIST[this.name].push(this.label+"="+this.score);
    }
    clickHandler(e){
        if(e.target.constructor!==HTMLLIElement) return
        this.index = this.starArr.indexOf(e.target);
        this.score = this.index+1;
        this.changeStarStyle(this.index);
        this.changeScore(this.index+1);
        // 每次点击都将评论的结果存储到cookie中,以便下次打开页面时读取。STARS_LIST中存储的是label作为key,score作为value的数据。
        this.storageScore();
    }
    storageScore(){
        for(let prop in Stars.STARS_LIST){
            if(prop === this.name){
                Stars.STARS_LIST[prop].forEach((item,index)=>{
                    if(item.includes(this.label)) Stars.STARS_LIST[prop][index] = this.label+"="+this.score;
                });
            }
        }
        document.cookie="comment="+ JSON.stringify(Stars.STARS_LIST)+";expires="+this.date.toUTCString();
    }
    mouseHandler(e) {
        switch (e.type) {
            case "mouseenter":
                this.faceIcon.style.display = "block";
                break;
            case "mouseleave":
                this.faceIcon.style.display = "none";
                this.changeStarStyle(this.index);
                this.changeScore(this.score);
                break;
            case "mouseover":
                let index = this.starArr.indexOf(e.target);
                this.changeStarStyle(index);
                this.changeScore(index + 1);
                this.changeFaceStyle(index);
                break;
        }
    }
    changeStarStyle(_i) {
        for (let n = 0; n < this.starArr.length; n++) {
            if (n <= _i || n < this.score) {
                this.starArr[n].style.backgroundPositionY = "-16px";
            } else {
                this.starArr[n].style.backgroundPositionY = "0px";
            }
        }
    }
    changeFaceStyle(_i) {
        this.faceIcon.style.left = _i * 16 + "px";
        this.faceIcon.style.backgroundPositionX = (_i + 1) * 20 + "px";
    }
    changeScore(_i) {
        this.scoreCon.textContent = _i + "分";
    }
    createLabel() {
        let label = document.createElement("span");
        Object.assign(label.style, {
            float: "left",
            padding: "0 5px",
        })
        label.textContent = this.label;
        this.elem.appendChild(label);
    }
    createStars() {
        this.starsCon = document.createElement("ul");
        Object.assign(this.starsCon.style, {
            margin: 0,
            padding: 0,
            listStyle: "none",
            width: "80px",
            height: "16px",
            float: "left",
            position: "relative",
        })
        for (let i = 0; i < this.STARS_NUM; i++) {
            let li = document.createElement("li");
            Object.assign(li.style, {
                width: "16px",
                height: "16px",
                float: "left",
                backgroundImage: "url(./star_img/commstar.png)",
            })
            this.starArr.push(li);
            this.starsCon.appendChild(li);
        }
        this.faceIcon = document.createElement("div");
        Object.assign(this.faceIcon.style, {
            width: "16px",
            height: "16px",
            backgroundImage: "url(./star_img/face-red.png)",
            backgroundPositionX: "-80px",
            position: "absolute",
            left: "0",
            top: "-16px",
            display: "none",
        })
        this.starsCon.appendChild(this.faceIcon);
        this.elem.appendChild(this.starsCon);
    }
    createScore() {
        this.scoreCon = document.createElement("div");
        Object.assign(this.scoreCon.style, {
            height: "16px",
            width:"20px",
            float: "left",
            padding: "0 5px",
        })
        this.scoreCon.textContent = this.score + "分",
        this.elem.appendChild(this.scoreCon);
    }
    initScore(){
        // 直接读取cookie显示如下
        // comment={"1001":["商品符合度=5","店家服务态度=0","快递配送速度=0","快递员服务=0","快递包装=0"],"1002":["商品符合度=0","店家服务态度=0","快递配送速度=0","快递员服务=0","快递包装=0"]}

        // 解析cookie中存储的评论结果。
        if(!document.cookie.includes("comment=")) return
        let o = JSON.parse(document.cookie.match(/(\{.*?\})/)[1]);
        if(!o) return
        // 解析后的o如下
        // ["商品符合度=1", "店家服务态度=0", "快递配送速度=0", "快递员服务=0", "快递包装=0"]
        for(let prop in o){
            if(this.name===prop){
                this.score=o[prop].reduce((value,item,index)=>{
                    let arr=item.split("=");
                    if(arr[0].includes(this.label)) value=parseInt(arr[1]);
                    return value;
                },0)
            }
        }
    }
}

使用时传入标签,新建实例。

import Stars from './js/Stars.js';
let list=["商品符合度","店家服务态度","快递配送速度","快递员服务","快递包装"];

        // let star = new Stars(list[0]);
        // star.appendTo("body");

        list.forEach(item=>{
            // 传入标签和对应的商品id
            let star = new Stars(item,"1001");
            star.appendTo(".div1");
        })
        list.forEach(item=>{
            let star = new Stars(item,"1002");
            star.appendTo(".div2");
        })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JavaScript实现商品评价五星好评

    本文实例为大家分享了JavaScript实现商品评价五星好评的具体代码,供大家参考,具体内容如下 一.效果展示 二.代码实现 1.html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>好评</title> <link rel="stylesheet" type="text/css" href

  • JS实现五星好评效果

    用JS实现面向对象方法实现京东的五星好评效果. 鼠标滑过时的显示: 当评价完成后,关闭浏览器重新打开页面,还是上次的评价结果.用cookie实现. 具体实现如下: import Componenet from "./Component.js"; export default class Stars extends Componenet { label; STARS_NUM = 5; starArr = []; score = 0; starsCon; faceIcon; scoreCo

  • Android自定义View实现五星好评效果

    本文实例为大家分享了Android实现五星好评效果的具体代码,供大家参考,具体内容如下 这个效果想必大家都非常熟悉,那么Android如何自定义实现这种效果呢? 首先自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="RatingStar"> <attr name="starNorm

  • JS实现五星好评案例

    本文实例为大家分享了JS实现五星好评案例的具体代码,供大家参考,具体内容如下 业务逻辑是我需要先创建出所有我需要用到的标签和样式再写出我们星星对应的行为,分数对应行为,笑脸对应行为,点击对应行为,抽象化出来,方便维护.并且在点击后我们抛出事件,记录下对应的name,分数等信息,保存在cookie中. 在编写过程中,一个是位置问题,很容易出现在没有创建就进行appendChild,第二个就是在添加行为时如何调整星星,笑脸的位置. <!DOCTYPE html> <html lang=&qu

  • JS+cookie实现购物评价五星好评功能

    本文实例为大家分享了JS+cookie实现购物评价五星好评功能的具体代码,供大家参考,具体内容如下 案例实现的是购物评价中五星点评功能. 通过JS面向对象方法实现 利用cookie实现历史点评保存的功能,在下一次打开页面仍保存上一次点评效果. 具体html,js代码如下: <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <

  • JS与JQuery分别实现淘宝五星好评特效

    本文实例为大家分享了JS与JQuery实现淘宝五星好评特效的具体代码,供大家参考,具体内容如下 我们经常用的五星好评是如何来的,主要就是三个Event 中的三个事件分别: onmouseover  指向事件 onmouseout  离开事件 onclick  点击事件 代码展示: <!DOCTYPE html> <html> <head>     <meta charset="utf-8" />     <title><

  • 微信小程序五星评分效果实现代码

    微信小程序五星评分效果实现代码 很多做过电商项目的朋友会经常用到评分的功能,我这里正好写了一个例子,发出来分享一下: 我写的是5分满分制的,首先,准备3个图片, ,像这样的,分别代表分数为0,0.5,1 时的状态, 效果图:(以3.5为例) 然后上代码: js: function pingfenxing(pingfen){ var that=this, //这里是图片的路径,自己需要改 data={ ling:"img/pingfen0.png", zheng:"img/pi

  • 小程序实现五星点评效果

    本文实例为大家分享了小程序实现五星点评效果展示的具体代码,供大家参考,具体内容如下 先看一下效果图: 如上图所示,这里我们要添加三个五星点评. 我们这里之讲解一下,"描述相符"的点评 WXML代码 <!--星星评价--> <view class="comment1-description" style="display:flex;flex-direction:row;"> <view class="comm

  • js定时器实现倒计时效果

    本文实例为大家分享了js定时器实现倒计时效果展示的具体代码,供大家参考,具体内容如下 日期函数 倒计时 =  用 将来的时间  -   现在的时间 问题:将来时间 距离 1970 毫秒数   -     现在距离 1970年1 用将来的毫秒数 -  现在的毫秒数   不断转换就可以了 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <t

  • 原生JS实现的放大镜效果实例代码

    这是我用原生js写的放大镜效果,与各种各样的框架技术相比,我喜欢使用原生的js,在这里,想和大家一起谈谈原生和框架技术的理解与个人喜好. <!DOCTYPE HTML> <html> <head> <title>js放大镜效果</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <style

随机推荐