面對物件五星好評
面對物件京東五星好評(利用cookie來儲存資料)
大家好,今天給大家帶來的是京東五心好評案例,及使用cookie儲存好評的資料案例
效果預覽
- 當我們滑鼠懸浮再小星星上時候,小星星將會被點亮,之前的星星也會被點亮並且在所懸浮的星星之上出現對應的表情,同時分數也會改變。
- 當我們單擊是中星星後,滑鼠一移出會改變星星亮度。且之前的星星在滑鼠移入後不改變,之後的會隨之改變。
- 在我們重新開啟頁面時,或者重新整理頁面時,上次評分仍然儲存。
所用資源
- 星星圖片
- 表情圖片
程式碼實現。
- 首先介紹下所用到的兩個檔案Component.js和Utils.js:
Component.js為通用類
export default class Component extends EventTarget{
//這裡繼承了EventTarget是希望其能丟擲事件
elem;
constructor(){
super();//代表父類的構建函式,但是返回的是子類的例項,內部this指向子類的例項
//相當於 EventTarget.prototype.constructor.cll(this),Es6要求
this.elem=this.createElem();//建立容器
}
createElem(){
if(this.elem) return this.elem;//如果傳入則不執行下面程式碼
let div=document.createElement("div");
//將
return div;
}
appendTo(parent){
if(typeof parent==="string")parent=document.querySelector(parent);
parent.appendChild(this.elem);
//將其插入頁面出
}
}
- Utils.js為自行封裝的一些方法,後面用到哪些方法在做解釋說明
程式碼實現
fiveStar.js檔案:
import Component from "./Component.js"//引入Component.js
export default class fiveStar extends Component {
//繼承Component類以便使用其方法
static STAR_NUM = 5//設定一個靜態的常量,因為星星有5個所有常量初始值為5
starCon //存放星星的容器
face //笑臉
date //cookie的時效
score //分數
pos//用來控制滑鼠移開星星變化的變數和存放cookie
starArr = []//陣列,儲存每個裝星星的div
constructor(_lable) {
//通過函式傳參的方式傳入文字資料—如‘商品符合度’
super();
this.date = new Date();
this.date.setMonth(11);//設定date的時間
//給window新增頁面開啟事件。
window.addEventListener('load', () => {
if(isNaN((document.cookie.split('=')[1])-0)){
this.setCookie({'pos':this.pos},this.date)
};//頁面開啟是我們獲取cookie判斷cookie是否存在,不存在則將其設定為-1
this.pos = (document.cookie.split('=')[1])-0
this.chageStar(this.pos)//使其執行chageStar並將cookie值傳入
this.chageScore(this.pos)//使其執行chageScore將cookie傳入
this.chageFace(-1)//使其執行chageFace傳入-1
})
//執行創造結構的函式
this.createlable(_lable)
//因為前面執行了super()所有擁有了elem'元素,將其作為整個容器給其設定樣式。
Object.assign(this.elem.style, {
width: "auto",
float: "left",
height: "16px",
paddingBottom: "10px",
marginRight: "20px",
paddingTop: "16px"
})
this.createstar()//建立小星星
this.createscore()//建立分數
//建立文字,為圖中的‘商品符合度’位置
createlable(_lable) {
let lable = document.createElement("span")
//將傳入的資料文字插入span標籤
lable.textContent = _lable
//再將span標籤插入容器
this.elem.appendChild(lable)
Object.assign(lable.style, {
float: "left",
height: "16px",
lineHeight: "16px",
marginRight: "10px",
overflow: "hidden",
whiteSpace: "nowrap",
textOverflow: "ellipsis",
font: '12px/150% tahoma,arial,Microsoft YaHei,Hiragino Sans GB,"\u5b8b\u4f53",sans-serif',
color: "#666"
});
}
createstar() {
//與上方插入文字同理,不作贅述
this.starCon = document.createElement("div")
Object.assign(this.starCon.style, {
float: "left",
height: "16px",
position: "relative",
marginTop: "1px"
})
//利用迴圈建立星星
for (let i = 0; i < fiveStar.STAR_NUM; i++) {
let star = document.createElement("div")
Object.assign(star.style, {
width: "16px",
height: "16px",
float: "left",
backgroundImage: "url(./img/commstar.png)",
})
this.starCon.appendChild(star)
//將建立的星星儲存到已經準備好的陣列裡
this.starArr.push(star)
}
//給星星容器做事件委託,新增事件
this.starCon.addEventListener('mouseover', e => this.mouseHandler(e))
this.starCon.addEventListener('click', e => this.mouseHandler(e))
this.starCon.addEventListener('mouseleave', e => this.mouseHandler(e))
//建立笑臉
this.face = document.createElement('div')
Object.assign(this.face.style, {
width: "16px",
height: "16px",
backgroundImage: "url(./img/face-red.png)",
position: "absolute",
top: "-16px",
display: "none"
})
this.starCon.appendChild(this.face)
this.elem.appendChild(this.starCon)
}
createscore() {
//建立分數
this.score = document.createElement('div')
Object.assign(this.score.style, {
position: "relative",
width: "30px",
height: "16px",
float: 'left',
top: "1px",
marginLeft: "10px",
lineHeight: "16px",
textAlign: "right",
color: "#999",
font: '12px/150% tahoma,arial,Microsoft YaHei,Hiragino Sans GB,"\u5b8b\u4f53",sans-serif',
});
this.score.textContent = "0分";
this.elem.appendChild(this.score)
}
//事件處理函式使用swich判斷事件型別
mouseHandler(e) {
switch (e.type) {
//因為click和mouseover事件有部分程式碼重複。為簡化程式碼不加break做穿透
case "click":
case 'mouseover':
let index = this.starArr.indexOf(e.target);//再儲存有星星的陣列裡查詢事件源星星target的下標位置
if (index < 0) return
//判斷事件型別
if (e.type === "click") {
// 給pos賦值為index,並且將pos儲存在cookie裡
this.pos = index;
//此處為自行封裝設定cookie的函式
this.setCookie({ 'pos': this.pos }, this.date)
}
else {
this.chageStar(index)
this.chageScore(index)
this.chageFace(index + 1)
}
break;
case 'mouseleave':
this.chageStar(this.pos)
this.chageScore(this.pos)
this.chageFace(-1)
break;
}
}
//事件觸發時改變星星的函式
chageStar(index) {
迴圈遍歷所有的星星
for (let i = 0; i < this.starArr.length; i++) {
//因為index為單擊或者移入的星星的位置,pos為單擊星星時的位置,故設定一下條件使其自己和前面的星星都變亮
if (i <= index || i <= this.pos) { this.starArr[i].style.backgroundPositionY = '16px' }
else { this.starArr[i].style.backgroundPositionY = '0px' }
}
}
chageScore(index) {
//改變分數,因為標從0開始所以分數加一
this.score.textContent = index + 1 + '分'
}
chageFace(n) {
//改變表情的位置和不同表情及滑鼠移出星星容器時隱藏
// 因為圖片是反的,使其順過來
let index = fiveStar.STAR_NUM - n
this.face.style.left = (n - 1) * 16 + "px"
this.face.style.backgroundPositionX = (20 * -index) + "px"
this.face.style.display = "block"
if (n < 0) {
this.face.style.display = "none"
}
}
setCookie(data, date) {
//此為設定cookie的函式當未傳入有效期自動設定
var str = date === undefined ? "" : ";expires=" + date.toUTCString();
//cookie以物件形式傳入,然後遍歷如果物件有多則使用json.stringigy()方法對其進行深拷貝
for (var prop in data) {
var value = data[prop]
if (typeof value === "object" && value !== null) value = JSON.stringify(value);
document.cookie = prop + "=" + value + str;
}
}
}
- 接下來就是html檔案了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="module">
import fiveStar from './js/fiveStar.js'
//此處可有一個陣列為要傳入的資料,遍歷陣列將資料傳入可批量生成各種型別的五星好評
let star = new fiveStar('商品符合度')
star.appendTo("body")
</script>
</body>
</html>
相關文章
- 利用cookie做五星好評Cookie
- 五星好評!這門Python神作刷爆朋友圈Python
- 面對物件2物件
- 五星好評--cookie儲存上一次點選的資料Cookie
- 五星好評!基於uniapp開發的開源專案推薦APP
- 好程式設計師前端教程面對物件與原型原型鏈程式設計師前端物件原型
- 面對物件的思考 (轉)物件
- Python第一個爬蟲,爬取噹噹網 Top 500 本五星好評書籍Python爬蟲
- PlayStation:《劍星》正式發售後的數個小時內PS商店評分4.8 五星好評率高達92%
- 面對物件的思考(二) (轉)物件
- 複習java面對物件(方法重寫)Java物件
- 用面對物件方式定tab標籤物件
- java面對物件程式設計的概念Java物件程式設計
- JS五星級評分效果(類似與淘寶打分效果)JS
- 面對物件3-回顧方法的呼叫物件
- js+css+php實現點選五星進行評分JSCSSPHP
- 理解面對物件的六大原則物件
- 語言學與面對物件的設計 (轉)物件
- 使用 Python 學習面對物件的程式設計Python物件程式設計
- 組織沒有準備好面對雲安全威脅
- 紅米Pro和小米4區別對比評測 哪個好?
- 評測小米手環2與樂心MAMBO2對比評測,買哪個好?
- Java程式設計__Chap3 面對物件__程式設計題Java程式設計物件
- 榮耀7與華為G9青春版對比評測 哪個好?
- 評價物件抽取綜述物件
- 好物件的 7 大美德物件
- “面對面”的網路暴力
- 小米6和小米5對比評測 小米6與小米5哪個好
- HTC Vive和Oculus Rift哪個好?htc vive和oculus rift對比評測
- 華為榮耀8和OPPOA59s區別對比評測 哪個好?
- iPhone X和Find X對比評測 OPPO Find X和iPhone X哪個好?iPhone
- 華為P9和vivo X7區別對比評測 哪個好?
- 魅族PRO6與魅藍note3對比評測 哪個好?
- 努比亞Z11 mini與小米Max對比評測 哪個配置好?
- 小米MAX和錘子T3引數配置對比評測 哪個好?
- 2345 好壓軟體評價
- 雷池 - 廣受好評的社群 WAF
- 結對程式設計:肩並肩還是面對面程式設計