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

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

今天寫了個很酷的實例:星級評分系統(tǒng)(可自定義星星個數(shù)、顯示信息)

sufuStar.star();使用默認值5個星星,默認信息

var msg = [........]; sufuStar.star(10,msg);自定義星星個數(shù)為10、顯示信息msg格式參考默認值,條數(shù)必須和星星個數(shù)一致; 

自己實現(xiàn)一些實例,有個好處,能增加應用各知識點的熟練度,還能檢驗出自己的薄弱項!一經發(fā)現(xiàn),立即翻API文檔惡補! 

先說下這個實例涉及的知識點:

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

2.學習如何用CSS來定位元素;

3.學習事件的代理;

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

5.String對象的match方法的應用,正則表達式的應用;

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

7.學習如何利用‘||'給變量設置默認值;

8.簡化代碼:將可能要重復寫的代碼拿出來,單獨寫成一個函數(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:;"; //阻止瀏覽器的點擊鏈接的默認行為

      frag.appendChild(a);

     }

     elem.appendChild(frag);

    }

    //主體函數(shù)

    function star(num,myMsg){

     var n = num||5; //當num有值則取其值,無值則取默認值5;

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

     var msg = myMsg||[

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

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

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

      "滿意|質量不錯,與賣家描述的基本一致,還是挺滿意的",

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

     ];

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

     appenStar(starContainer,n);

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

     addEvent(starContainer,'mouseout',out);

     addEvent(starContainer,'click',click);

     function over(event){

      if(getIndex(event)){ //若getIndex(event)取不到值,說明當前觸發(fā)事件的目標不是<a>標簽

       var index = getIndex(event);

       change(index);

       showInfo(index,msg);

      }

     }

     function out(event){

      change(); //將評分設為已點擊狀態(tài)clickStar

      gbyId('star-info').style.display = 'none'

     }

     function click(event) {

      if (getIndex(event)) {

       var index = getIndex(event);

       clickStar = index; //保存點擊狀態(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才能調用匿名函數(shù)的返回值star

   //調用執(zhí)行: sufuStar.star(num,myMsg),參數(shù)可為空,參數(shù)num,myMsg將設為默認值

   sufuStar.star();

  }

 </script>

</head>

<body>

<div id="star">

 <span>點擊星星打分:</span>

 <div id="star-div">

 </div>

 <span id="star-span"></span>

 <p id="star-info">

 </p>

</div>

</body>

</html>

以上就是本文的全部內容,希望對大家的學習有所幫助

更多信息請查看網絡編程

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權所有:易賢網