很酷的星級(jí)評(píng)分系統(tǒng)原生JS實(shí)現(xiàn)
來源:易賢網(wǎng) 閱讀:1383 次 日期:2016-08-30 14:09:35
溫馨提示:易賢網(wǎng)小編為您整理了“很酷的星級(jí)評(píng)分系統(tǒng)原生JS實(shí)現(xiàn)”,方便廣大網(wǎng)友查閱!

這篇文章主要weidajiaxiangxi介紹了很酷的星級(jí)評(píng)分系統(tǒng)原生JS實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

今天寫了個(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í)例涉及的知識(shí)點(diǎn):

1.用CSS的border來畫個(gè)三角形,并用before來把它加到其它元素上;

2.學(xué)習(xí)如何用CSS來定位元素;

3.學(xué)習(xí)事件的代理;

4.如何優(yōu)化性能;

5.String對(duì)象的match方法的應(yīng)用,正則表達(dá)式的應(yīng)用;

6.注冊(cè)事件與事件處理,需要兼容IE的寫法;

7.學(xué)習(xí)如何利用‘||'給變量設(shè)置默認(rèn)值;

8.簡(jiǎn)化代碼:將可能要重復(fù)寫的代碼拿出來,單獨(dú)寫成一個(gè)函數(shù); 

下面是帶注釋的完整代碼,碰到不懂得就查文檔吧,以我目前的水平只能寫成這樣了,若有好的建議,歡迎前輩指出!

<!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,這樣頁面只重新渲染一次

     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有值則取其值,無值則取默認(rèn)值5;

     var clickStar=curentStar=0; //clickStar保存點(diǎn)擊狀態(tài)

     var msg = myMsg||[

      "很不滿意|差得太離譜,與賣家描述的嚴(yán)重不符,非常不滿",

      "不滿意|部分有破損,與賣家描述的不符,不滿意",

      "一般|質(zhì)量一般,沒有賣家描述的那么好",

      "滿意|質(zhì)量不錯(cuò),與賣家描述的基本一致,還是挺滿意的",

      "非常滿意|質(zhì)量非常好,與賣家描述的完全一致,非常滿意"

     ];

     var starContainer = gbyId('star-div');

     appenStar(starContainer,n);

     addEvent(starContainer,'mouseover',over); //采用事件代理模式(通過<a>標(biāo)簽的父元素starContainer來代理事件)

     addEvent(starContainer,'mouseout',out);

     addEvent(starContainer,'click',click);

     function over(event){

      if(getIndex(event)){ //若getIndex(event)取不到值,說明當(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í)有所幫助

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:很酷的星級(jí)評(píng)分系統(tǒng)原生JS實(shí)現(xiàn)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)