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

今天我又写了个很酷的实例:星级评分系统(可自定义星星个数、显示信息)
 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、javascript 原生ajax、javascript原生代码、原生javascript插件、原生javascript做动画,以便于您获取更多的相关知识。

时间: 2024-10-03 11:21:49

很酷的星级评分系统原生JS实现_javascript技巧的相关文章

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

今天我又写了个很酷的实例:星级评分系统(可自定义星星个数.显示信息) sufuStar.star(); 使用默认值5个星星,默认信息 var msg = [........]; sufuStar.star(10,msg); 自定义星星个数为10.显示信息msg格式参考默认值,条数必须和星星个数一致: 自己实现一些实例,有个好处,能增加应用各知识点的熟练度,还能检验出自己的薄弱项!一经发现,立即翻API文档恶补! 不知道是不是我太笨,这个实例居然写了整整一天! 不废话了,先说下这个实例涉及的知识点

jQuery实现随意改变div任意属性的名称和值(部分原生js实现)_javascript技巧

一些简单的例子,用原生js和jQuery实现随意改变div属性,和重置.代码如下: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>函数传参,改变Div任意属性的值</title> <style type="text/css"> body,p{margin:0;padding:0;} bo

JS将所有对象s的属性复制给对象r(原生js+jquery)_javascript技巧

原生写法: 复制代码 代码如下: /**   * 将所有 s 的属性复制给 r   * @param r {Object}   * @param s {Object}   * @param is_overwrite {Boolean} 如指定为 false ,则不覆盖已有的值,其它值   *   包括 undefined ,都表示 s 中的同名属性将覆盖 r 中的值   */  mix: function (r, s, is_overwrite) { //TODO:   if (!s || !r

基于逻辑运算的简单权限系统(实现) JS 版_javascript技巧

作者: slightboy, 时间: 2006-10-17 此篇为 JS 实现版本, 以前作已交待原理 故不在此多做解释 如需原理介绍 请查看 VBS 版. var PermissionType = {     Read : 1,     Write : 2,     Delete : 4 } function PermissionSetComponent(value) {     this.Value = value;     this.getRead = function()     {  

JS实现拖动滚动条评分的效果代码分享_javascript技巧

小编教你JS特效拖动滚动条可以评分效果,小编感觉挺不错,用时候可能需要ASP/PHP或其它语言配合取值并写入数据库,这是前台的实现. 直接上代码 看看JS的神奇吧! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head>

JS实现的系统调色板完整实例_javascript技巧

本文实例讲述了JS实现的系统调色板.分享给大家供大家参考,具体如下: 运行效果图如下: 整体页面代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>DW调色板</title> <script type="text/javascript" langu

判定是否原生方法的JS代码_javascript技巧

浏览器的趋势是加入越来越多对象,像Worker,同时也为旧有的对象添加新方法.如何兼容它的第一步就是检测它们是否存在,没有则补上自己的兼容代码.这时问题就来了,有的类库是给你做了这一步,但有时没有,有时是做了,但并不符合标准.因此单纯是typeof Array.prototype.map === "function"可能不够用.这时isNative方法就要登场了. 我一直用的版本,自己写的: 复制代码 代码如下: var isNative = function(method){//判定

js点亮星星评分并获取参数的js代码_javascript技巧

,站长必备的高质量网页特效和广告代码. 服务 default level 1 2 3 4 5 价格 default level 1 2 3 4 5 质量 default level 1 2 3 4 5

封装属于自己的JS组件_javascript技巧

一.扩展已经存在的组件1.需求背景很多时候,我们使用jquery.ajax的方式向后台发送请求,型如 $.ajax({ type: "post", url: "/User/Edit", data: { data: JSON.stringify(postdata) }, success: function (data, status) { if (status == "success") { toastr.success('提交数据成功'); $(