原生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 JavaScript获取Url参数,src属性参数
Mar 09 Javascript
文本框获得焦点和失去焦点的判断代码
Mar 18 Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 Javascript
javaScript中Math()函数注意事项
Jun 18 Javascript
函数window.open实现关闭所有的子窗口
Aug 03 Javascript
详解javascript实现瀑布流列式布局
Jan 29 Javascript
vue子父组件通信的实现代码
Jul 09 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
Sep 20 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 Javascript
原生js实现公告滚动效果
Jan 10 Javascript
jQuery编写QQ简易聊天框
Aug 27 jQuery
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 页面执行时间计算代码
2008/12/04 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
jQuery 位置插件
2008/12/25 Javascript
Prototype ObjectRange对象学习
2009/07/19 Javascript
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
js文字横向滚动特效
2015/11/11 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
Node.js学习入门
2017/01/03 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
webpack4简单入门实例
2018/09/06 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
vue实现购物车案例
2020/05/30 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
python爬虫常用的模块分析
2014/08/29 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
python实现简单加密解密机制
2019/03/19 Python
python实现日志按天分割
2019/07/22 Python
pymysql的简单封装代码实例
2020/01/08 Python
Python程序慢的重要原因
2020/09/04 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
线程同步的方法
2016/11/23 面试题
计算机网络毕业生自荐信
2013/10/01 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
道歉信范文
2015/05/12 职场文书