1. 程式人生 > 程式設計 >JS實現五星好評效果

JS實現五星好評效果

用實現面向物件方法實現京東的五星好評效果。

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_LI
ST[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]www.cppcns.com
.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",}) for (let i = 0; i < this.STARS_NUM; i++) { let li = document.createElement("li"); Object.assign(li.style,{ width: "16px",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",backgroundImage: "url(./star_img/face-red.png)",backgroundPositionX: "-80px",position: "abylENQkmsolute",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",}) this.scoreCon.textContent = this.score + "分",this.elem.appendChild(this.scoreCon); } initScore(){ // 直接讀取cookie顯示如下 // comment={"1001":["商品符合度=5","店家服務態度=0","快遞配送速度=0","快遞員服務=0","快遞包裝=0"],"1002":["商品符合度=0","快遞包裝=0"]} // 解析cookie中儲存的評論結果。 if(!document.cookie.includes("comment=")) return let o = JSON.parse(document.cookie.match(/(\{.*?\})/)[1]); if(!o) return // 解析後的o如下 // ["商品符合度=1","快遞包裝=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=&gt;{
            // 傳入標籤和對應的商品id
            let star = new Stars(item,"1001");
            star.appendTo(".div1");
        })
        list.forEach(item=>{
            let star = new Stars(item,"1002");
            star.appendTo(".div2");
        })

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。