JS實現五星好評效果
阿新 • • 發佈:2021-09-13
用實現面向物件方法實現京東的五星好評效果。
滑鼠滑過時的顯示:
當評價完成後,關閉瀏覽器重新開啟頁面,還是上次的評價結果。用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]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=>{ // 傳入標籤和對應的商品id let star = new Stars(item,"1001"); star.appendTo(".div1"); }) list.forEach(item=>{ let star = new Stars(item,"1002"); star.appendTo(".div2"); })
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。