面對物件五星好評
面對物件京東五星好評(利用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
- 五星好評!基於uniapp開發的開源專案推薦APP
- 五星好評--cookie儲存上一次點選的資料Cookie
- 面對物件2物件
- 好程式設計師前端教程面對物件與原型原型鏈程式設計師前端物件原型
- Python第一個爬蟲,爬取噹噹網 Top 500 本五星好評書籍Python爬蟲
- PlayStation:《劍星》正式發售後的數個小時內PS商店評分4.8 五星好評率高達92%
- java面對物件程式設計的概念Java物件程式設計
- js+css+php實現點選五星進行評分JSCSSPHP
- 面對玩家差評,製作組應該如何應對?
- 面對物件3-回顧方法的呼叫物件
- 使用 Python 學習面對物件的程式設計Python物件程式設計
- 理解面對物件的六大原則物件
- 面試——談談你對Java 物件導向思想的理解面試Java物件
- 面對打差評的玩家,製作組該不該“認慫”?
- 組織沒有準備好面對雲安全威脅
- Java程式設計__Chap3 面對物件__程式設計題Java程式設計物件
- 天璣1200對比驍龍865哪個好?天璣1200與驍龍865對比評測
- 好評返現?在Steam上刷好評或許沒你想的那麼簡單
- 好程式設計師分享Java面試題:物件導向的四個基本特徵程式設計師Java面試題物件特徵
- iPhone X和Find X對比評測 OPPO Find X和iPhone X哪個好?iPhone
- 雷池 - 廣受好評的社群 WAF
- “好評返現”會被禁止嗎?
- 2019年3月手遊曝光度資料包告:香腸派對受好評
- 刷好評刪差評將被列入嚴重失信名單
- “遊戲好評,免費差評”:“用愛發電”做錯了?遊戲
- 對類物件的方法操作物件
- 我對JavaScript物件的理解JavaScript物件
- 物件對映 - Mapping.Mapster物件APP
- 小米MIX2S對比一加6對比評測 一加6和小米MIX2S哪個好?
- 確保使用者評價“真實可信” 大眾點評出新規制止“刷好評”
- 王垠對 JS 的評價JS
- r確保使用者評價“真實可信” 大眾點評出新規制止“刷好評”
- js對陣列中相同物件元素進行去重,裡面物件相同id,其他不同屬性進行文字疊加JS陣列物件
- 目前“好評返現”有幾個問題?
- 畫面巨人,玩法矮子?這款90%好評的橫版肉鴿到底有沒有亮點
- “面對面”的網路暴力