很酷的星级评分系统原生JS实现


Posted in Javascript onAugust 25, 2016

今天我又写了个很酷的实例:星级评分系统(可自定义星星个数、显示信息)

 sufuStar.star();使用默认值5个星星,默认信息
 var msg = [........]; sufuStar.star(10,msg);自定义星星个数为10、显示信息msg格式参考默认值,条数必须和星星个数一致; 

自己实现一些实例,有个好处,能增加应用各知识点的熟练度,还能检验出自己的薄弱项!一经发现,立即翻API文档恶补! 

不知道是不是我太笨,这个实例居然写了整整一天! 

不废话了,先说下这个实例涉及的知识点:
 1.用CSS的border来画个三角形,并用before来把它加到其它元素上;
 2.学习如何用CSS来定位元素;
 3.学习事件的代理;
 4.如何优化性能;
 5.String对象的match方法的应用,正则表达式的应用;
 6.注册事件与事件处理,需要兼容IE的写法;
 7.学习如何利用‘||'给变量设置默认值;
 8.简化代码:将可能要重复写的代码拿出来,单独写成一个函数; 

下面是带注释的完整代码,碰到不懂得就查文档吧,以我目前的水平只能写成这样了,若有好的建议,欢迎前辈指出!

<!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 (){
  //工具函数
  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);
  }
  //主体函数
  function star(num,myMsg){
   var n = num||5; //当num有值则取其值,无值则取默认值5;
   var clickStar=curentStar=0; //clickStar保存点击状态
   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)取不到值,说明当前触发事件的目标不是<a>标签
    var index = getIndex(event);
    change(index);
    showInfo(index,msg);
   }
   }
   function out(event){
   change(); //将评分设为已点击状态clickStar
   gbyId('star-info').style.display = 'none'
   }
   function click(event) {
   if (getIndex(event)) {
    var index = getIndex(event);
    clickStar = index; //保存点击状态
    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
  }
  }(); //这里的()表示函数立即执行,这样变量sufuStar才能调用匿名函数的返回值star

  //调用执行: sufuStar.star(num,myMsg),参数可为空,参数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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中2个感叹号的用法实例详解
Sep 04 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
Apr 17 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
jQuery实现进度条效果代码
Dec 17 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
vue用addRoutes实现动态路由的示例
Sep 15 Javascript
Express系列之multer上传的使用
Oct 27 Javascript
Node.js之readline模块的使用详解
Mar 25 Javascript
pageGroup.js实现分页功能
Jul 27 Javascript
微信小程序仿通讯录功能
Apr 09 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
Aug 25 #Javascript
轻松掌握JavaScript策略模式
Aug 25 #Javascript
Javascript 6里的4个新语法
Aug 25 #Javascript
Javascript实现代码折叠功能
Aug 25 #Javascript
深入浅出ES6之let和const命令
Aug 25 #Javascript
PhotoSwipe异步动态加载图片方法
Aug 25 #Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 #Javascript
You might like
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
PHP 转义使用详解
2013/07/15 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
openlayers实现地图测距测面
2020/09/25 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
python网络编程之文件下载实例分析
2015/05/20 Python
Java及python正则表达式详解
2017/12/27 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
用python发送微信消息
2020/12/21 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
超市仓管员岗位职责
2014/04/07 职场文书
毕业设计说明书
2014/05/07 职场文书
社区春季防火方案
2014/06/02 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers