很酷的星級(jí)評(píng)分系統(tǒng)原生JS實(shí)現(xiàn)
今天我又寫(xiě)了個(gè)很酷的實(shí)例:星級(jí)評(píng)分系統(tǒng)(可自定義星星個(gè)數(shù)、顯示信息)
sufuStar.star();使用默認(rèn)值5個(gè)星星,默認(rèn)信息
var msg = [........]; sufuStar.star(10,msg);自定義星星個(gè)數(shù)為10、顯示信息msg格式參考默認(rèn)值,條數(shù)必須和星星個(gè)數(shù)一致;
自己實(shí)現(xiàn)一些實(shí)例,有個(gè)好處,能增加應(yīng)用各知識(shí)點(diǎn)的熟練度,還能檢驗(yàn)出自己的薄弱項(xiàng)!一經(jīng)發(fā)現(xiàn),立即翻API文檔惡補(bǔ)!
不知道是不是我太笨,這個(gè)實(shí)例居然寫(xiě)了整整一天!
不廢話了,先說(shuō)下這個(gè)實(shí)例涉及的知識(shí)點(diǎn):
1.用CSS的border來(lái)畫(huà)個(gè)三角形,并用before來(lái)把它加到其它元素上;
2.學(xué)習(xí)如何用CSS來(lái)定位元素;
3.學(xué)習(xí)事件的代理;
4.如何優(yōu)化性能;
5.String對(duì)象的match方法的應(yīng)用,正則表達(dá)式的應(yīng)用;
6.注冊(cè)事件與事件處理,需要兼容IE的寫(xiě)法;
7.學(xué)習(xí)如何利用‘||'給變量設(shè)置默認(rèn)值;
8.簡(jiǎn)化代碼:將可能要重復(fù)寫(xiě)的代碼拿出來(lái),單獨(dú)寫(xiě)成一個(gè)函數(shù);
下面是帶注釋的完整代碼,碰到不懂得就查文檔吧,以我目前的水平只能寫(xiě)成這樣了,若有好的建議,歡迎前輩指出!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> *{ margin: 0; padding: 0; } #star{ position: absolute; left: 0; right: 0; top: 30px; bottom: 0; margin: auto; width: 80%; font-size: 12px; } #star-div{ margin:5px; font-size: 0; } #star-div a{ display: inline-block; width: 21px; height: 21px; background: url(http://files.cnblogs.com/files/susufufu/star0.gif) no-repeat; } #star-div .on{ background: url(http://files.cnblogs.com/files/susufufu/star1.gif) no-repeat; } #star-info{ position: absolute; top: 55px; left: -30px; display: none; width: 155px; height: 50px; padding: 2px; line-height: 17px; border-radius: 8px; background-color: gold; z-index: 5; } #star-info:before{ content: ''; border-bottom: 10px solid gold; border-left: 10px solid rgba(0,0,0,0); border-right: 10px solid rgba(0,0,0,0); position: absolute; left: 35px; top: -10px; } #star-span{line-height: 14px} #star-info strong,#star-span strong{ color: red; } </style> <script> window.onload = function(){ var sufuStar = function (){ //工具函數(shù) function gbyId(id){return document.getElementById(id);} function addEvent(elem,type,func){ //兼容IE if(elem.addEventListener){ elem.addEventListener(type,func,false) }else if(elem.attachEvent){ elem.attachEvent('on'+type,func) } } function getIndex(event) { //兼容IE var e = event || window.event; var t = e.target || e.srcElement; if (t.tagName.toLowerCase() === 'a') { return parseInt(t.innerHTML); } } function showInfo(index,msg){ var info = gbyId('star-info'); info.style.display = 'block'; info.style.left = index*21-51+'px'; info.innerHTML = "<strong> "+index+'分 '+msg[index-1].match(/(.+)\|/)[1]+'<br />'+'</strong>'+msg[index-1].match(/\|(.+)/)[1]; } function appenStar(elem,nums){ var frag = document.createDocumentFragment(); //為了提高性能,因使用DocumentFragment一次性append,這樣頁(yè)面只重新渲染一次 for(var i = 0;i<nums;i++){ var a =document.createElement('a'); a.innerHTML = i+1; a.href = "javascript:;"; //阻止瀏覽器的點(diǎn)擊鏈接的默認(rèn)行為 frag.appendChild(a); } elem.appendChild(frag); } //主體函數(shù) function star(num,myMsg){ var n = num||5; //當(dāng)num有值則取其值,無(wú)值則取默認(rèn)值5; var clickStar=curentStar=0; //clickStar保存點(diǎn)擊狀態(tài) var msg = myMsg||[ "很不滿意|差得太離譜,與賣(mài)家描述的嚴(yán)重不符,非常不滿", "不滿意|部分有破損,與賣(mài)家描述的不符,不滿意", "一般|質(zhì)量一般,沒(méi)有賣(mài)家描述的那么好", "滿意|質(zhì)量不錯(cuò),與賣(mài)家描述的基本一致,還是挺滿意的", "非常滿意|質(zhì)量非常好,與賣(mài)家描述的完全一致,非常滿意" ]; var starContainer = gbyId('star-div'); appenStar(starContainer,n); addEvent(starContainer,'mouseover',over); //采用事件代理模式(通過(guò)<a>標(biāo)簽的父元素starContainer來(lái)代理事件) addEvent(starContainer,'mouseout',out); addEvent(starContainer,'click',click); function over(event){ if(getIndex(event)){ //若getIndex(event)取不到值,說(shuō)明當(dāng)前觸發(fā)事件的目標(biāo)不是<a>標(biāo)簽 var index = getIndex(event); change(index); showInfo(index,msg); } } function out(event){ change(); //將評(píng)分設(shè)為已點(diǎn)擊狀態(tài)clickStar gbyId('star-info').style.display = 'none' } function click(event) { if (getIndex(event)) { var index = getIndex(event); clickStar = index; //保存點(diǎn)擊狀態(tài) gbyId('star-info').style.display = 'none'; gbyId('star-span').innerHTML = "<strong>" + index + '分 ' + msg[index - 1].match(/(.+)\|/)[1] + '</strong>'+'<br />'+ msg[index - 1].match(/\|(.+)/)[1]; } } function change(index){ curentStar = index||clickStar; for(var i=0;i<n;i++){ starContainer.children[i].className = i<curentStar ? 'on' : '' } } } return { star:star } }(); //這里的()表示函數(shù)立即執(zhí)行,這樣變量sufuStar才能調(diào)用匿名函數(shù)的返回值star //調(diào)用執(zhí)行: sufuStar.star(num,myMsg),參數(shù)可為空,參數(shù)num,myMsg將設(shè)為默認(rèn)值 sufuStar.star(); } </script> </head> <body> <div id="star"> <span>點(diǎn)擊星星打分:</span> <div id="star-div"> </div> <span id="star-span"></span> <p id="star-info"> </p> </div> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript幾種數(shù)組去掉重復(fù)值的方法推薦
下面小編就為大家?guī)?lái)一篇JavaScript幾種數(shù)組去掉重復(fù)值的方法推薦。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看2016-04-04實(shí)現(xiàn)JavaScript高性能的數(shù)據(jù)存儲(chǔ)
本文主要對(duì)JavaScript的數(shù)據(jù)存儲(chǔ),產(chǎn)生性能問(wèn)題的原因,內(nèi)存泄露的幾種情況等做了簡(jiǎn)要分析介紹,需要的朋友可以看下2016-12-12動(dòng)態(tài)生成的IFRAME,設(shè)置SRC時(shí)的問(wèn)題解決分析
動(dòng)態(tài)生成的IFRAME,設(shè)置SRC時(shí)的,不同位置帶來(lái)的影響。 以下所說(shuō)的是在IE7下運(yùn)行的。IE6下也是同樣。 在這個(gè)blog中,直接點(diǎn)擊運(yùn)行代碼,和把下面代碼保存到為網(wǎng)頁(yè)在運(yùn)行(以本地文件或域名訪問(wèn)),效果不一樣。 先看例子:2008-04-04通過(guò)Jscript中@cc_on 語(yǔ)句識(shí)別IE瀏覽器及版本的代碼
通過(guò)Jscript中@cc_on 語(yǔ)句識(shí)別IE瀏覽器及版本的代碼,需要的朋友可以參考下。2011-05-05你有必要知道的10個(gè)JavaScript難點(diǎn)
10個(gè)JavaScript難點(diǎn),你可能還不知道,不著急,本文為大家一一列出,一一攻破,感興趣的小伙伴們可以參考一下2017-07-07下載網(wǎng)站打開(kāi)頁(yè)面后間隔多少時(shí)間才顯示下載鏈接地址的代碼
有時(shí)候可能為了一些更好的廣告效果等原因,需要讓用戶等待一段時(shí)間以后,再顯示真實(shí)下載地址代碼,有利于緩解服務(wù)器壓力。2010-04-04