原生JS实现-星级评分系统的简单实例


Posted in Javascript onAugust 21, 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>

以上这篇原生JS实现-星级评分系统的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
顶部缓冲下拉菜单导航特效的JS代码
Aug 27 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
Nov 14 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
Mar 17 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
Aug 15 Javascript
Javascript实现单张图片浏览
Dec 18 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
Jan 13 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
js实现拖动缓动效果
Jan 13 Javascript
Vue双向绑定实现原理与方法详解
May 07 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
Oct 31 Javascript
JSONP和批量操作功能的实现方法
Aug 21 #Javascript
全面解析标签页的切换方式
Aug 21 #Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 #Javascript
JS实现图片局部放大或缩小的方法
Aug 20 #Javascript
JS获取及验证开始结束日期的方法
Aug 20 #Javascript
jquery弹出框插件jquery.ui.dialog用法分析
Aug 20 #Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 #Javascript
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
js控制分页打印、打印分页示例
2014/02/08 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
js实现秒表计时器
2019/12/16 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
详解Python中namedtuple的使用
2020/04/27 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
《月亮湾》教学反思
2014/04/14 职场文书
关于责任的演讲稿
2014/05/20 职场文书
教师群众路线心得体会
2014/11/04 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
运动会班级前导词
2015/07/20 职场文书
清明节随笔
2015/08/15 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书