慕课网 星级评分原理和实现(上)

源码下载

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>星级评分--第一种实现方式</title>
    <style>
    body,
    ul,
    li {
        padding: 0;
        margin: 0;
        display: block;
    }

    li {
        list-style-type: none;
    }

    .rating {
        width: 165px;
        height: 40px;
        margin: 100px auto;
        overflow: hidden;
    }

    .rating-item {
        float: left;
        width: 33px;
        height: 33px;
        background: url(star.png) no-repeat;
        cursor: pointer;
    }
    </style>
</head>

<body>
    <!-- 第一种实现方式 -->
    <ul class="rating" id="rating">
        <li class="rating-item" title="很不好1"></li>
        <li class="rating-item" title="不好1"></li>
        <li class="rating-item" title="一般1"></li>
        <li class="rating-item" title="好1"></li>
        <li class="rating-item" title="很好1"></li>
    </ul>
    <ul class="rating" id="rating2">
        <li class="rating-item" title="很不好"></li>
        <li class="rating-item" title="不好"></li>
        <li class="rating-item" title="一般"></li>
        <li class="rating-item" title="好"></li>
        <li class="rating-item" title="很好"></li>
    </ul>
    <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
    <script type="text/javascript">

        var rating = (function(){
            //继承
            var extend = function(subClass,superClass){
                var F = function(){};
                F.prototype = superClass.prototype;
                subClass.prototype = new F();
                subClass.prototype.construtor = subClass;
            }

            //点亮
            var Light = function(el,options){
                this.$el = $(el);
                this.$item = this.$el.find(‘.rating-item‘);
                this.opts = options;
                this.add = 1;
                this.selectEvent = ‘mouseover‘;
            }
            Light.prototype.init = function(){
                this.lightOn(this.opts.num);
                if(!this.readOnly){
                    this.bindEvent();
                }

            }
            Light.prototype.lightOn =function(num){

                var num = parseInt(num);

                this.$item.each(function(index){
                    if (index < num){
                        $(this).css(‘background-position‘,‘0 -40px‘);
                    }else{
                        $(this).css(‘background-position‘,‘0 0‘);
                    }
                });
            }
            Light.prototype.bindEvent = function(e){
                var self = this,
                    itemLength = self.$item.length;

                self.$el.on(self.selectEvent, ‘.rating-item‘, function(e) {
                    var $this = $(this),
                        num = 0;

                    self.select(e,$this);
                    num = $(this).index() + self.add;
                    self.lightOn(num);

                    (typeof self.opts.select === ‘function‘) && self.opts.select.call(this,num,itemLength);
                    self.$el.trigger(‘select‘,[num,itemLength]);
                }).on(‘click‘, ‘.rating-item‘, function() {
                    self.opts.num = $(this).index() + self.add;
                    (typeof self.opts.chosen === ‘function‘) && self.opts.chosen.call(this,self.opts.num,itemLength);
                    self.$el.trigger(‘chosen‘,[self.opts.num,itemLength]);
                }).on(‘mouseout‘, function() {
                    self.lightOn(self.opts.num);
                })
            }
            Light.prototype.select = function(){
                throw new Error(‘子类必须重写此方法‘);
            }
            Light.prototype.unbindEvent = function(){
                this.$el.off();
            }

            //点亮整颗
            var LightEntire = function(el,options){
                Light.call(this,el,options)
                this.selectEvent = ‘mouseover‘;
            }

            extend(LightEntire,Light);
            LightEntire.prototype.lightOn =function(num){
                Light.prototype.lightOn.call(this,num);
            }
            LightEntire.prototype.select = function(){
                self.add = 1;
            }

            //点亮半颗
            var LightHalf = function(el,options){
                Light.call(this,el,options)
                this.selectEvent = ‘mousemove‘;
            }
            extend(LightHalf,Light);
            LightHalf.prototype.lightOn =function(num){

                var count = parseInt(num),
                isHalf = count !== num;

                Light.prototype.lightOn.call(this,count);
                if(isHalf){
                    this.$item.eq(count).css(‘background-position‘,‘0 -80px‘);
                }
            }
            LightHalf.prototype.select = function(e,$this){
                if(e.pageX - $this.offset().left < $this.width() / 2){
                    this.add = 0.5;
                }else{
                    this.add = 1;
                }
            }

            // 默认参数
            var defaults = {
                mode:‘LightEntire‘,
                num:0,
                readOnly:false,
                select:function(){},
                chosen:function(){}

            }
            var mode = {
                ‘LightEntire‘:LightEntire,
                ‘LightHalf‘:LightHalf
            }
            //初始化
            var init = function(el,option){
                var $el = $(el),
                rating = $el.data(‘rating‘),
                    options = $.extend({},defaults,typeof option === ‘object‘ && option);
                if(!mode[options.mode]){
                    options.mode = ‘LightEntire‘;
                }
                // new LightHalf(el,options).init();
                // new LightHalf(el,options).init();
                if(!rating){
                    $el.data(‘rating‘,(rating = new mode[options.mode](el,options)));
                    rating.init();
                }
                if(typeof option === ‘string‘){
                   rating[option]();
                } 

            }
            $.fn.extend({
                rating:function(option){
                    return this.each(function(){
                        init(this,option);
                    })
                }
            })
            return {
                init:init
            };

        })();

        rating.init(‘#rating‘,{
            mode:‘LightHalf‘,
            num: 2.5,
            chosen: function(){
                rating.init(‘#rating‘,‘unbindEvent‘);
            }
            // select:function(num,total){
            //     console.log(this);
            //     console.log(num + ‘/‘ + total)
            // }
        })

        // $(‘#rating‘).rating({
        //     mode:‘LightEntire‘,
        //     num : 2
        // });
        $(‘#rating2‘).rating({
            mode:‘LightHalf‘,
            num:3.5
        })
        // $(‘#rating2‘).on(‘chosen‘,function(){
        //     $(‘#rating2‘).rating(‘unbindEvent‘);
        // })

        $(‘#rating‘).on(‘select‘,function(e,num,total){
            console.log(num + ‘/‘ + total)
        }).on(‘chosen‘,function(e,num,total){
            console.log(num + ‘/‘ + total);
        })
    </script>
</body>

</html>

原文地址:https://www.cnblogs.com/fazero/p/8316926.html

时间: 2024-12-28 21:04:32

慕课网 星级评分原理和实现(上)的相关文章

慕课网上的星级评分--学习视频后模仿实现

1.本人观看了慕课网上的星级评分视频,课程免费,老师讲的特别棒!视频链接:https://www.imooc.com/learn/842 2.在学习完视频后找到了一位大神手敲的代码,在他的Github上下载后,自己手动实现了一遍.源代码稍后贴出原作者的给的链接:http://www.cnblogs.com/fazero/p/8316926.html 3.本人手动模仿实现了一遍代码,学习了好多,再次只贴出最终的可以点亮整颗星与半颗星的javascript代码,如有雷同版权为原作者所有: <scri

我也不知道这算不算bug了,单纯记录,没别的意思,图片是上传在慕课网的,所以预览不了。。0.0

无意发现慕课网修改个人签名功能性bug 修改个人签名失败的问题 图片 经过测试,像这样两行文字中间有换行的话,保存会提示error,如图: 图片 而如果不换行,就能成功: 图片 图片 浏览器用的Chrome 0.0 可能是慕课网不允许这样操作吧..除了让我改了两次信息没成功外也没啥影响.已提交反馈. 原文地址:https://www.cnblogs.com/famine/p/9514978.html

慕课网视频下载

1.使用js脚本批量下载慕课网视频 慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下载到本地,离线看视频是非常不错的选择.慕课网上没提供下载视频的入口,想下载到本地怎么办? 如果一次下载一个视频,那是very very easy,不用第三方工具就能搞定. 1.打开谷歌或谷歌内核的浏览器,按F12键,打开开发人员工具,地址栏输入http://www

夜空中最亮的星:慕课网新手学习指南_慕课手记

首先标题是为了凑够标准的十个字,如果你这会去数了一下然后想评论说不是十个字,那我佩服你的求知精神...进来的肯定不是看我瞎扯淡的,我们步入正题. 慕课网作为国内不能说是最大,但是起码口碑最好的一个IT学习的网站,受到了很多人的欢迎,但是在推荐给朋友的过程中,我就发现了一些问题,那就是纯小白根本不知道怎么开始学习.这里我要说一下什么叫做纯小白,你以为不知道变量,命令提示符,HTTP协议,这些就是小白了吗?那你就错了,我今天要说的是连怎么设置IP地址,怎么设置百度为首页,连自己的操作系统是winxp

ExtJS(3)- 自定义组件(星级评分)

今天介绍ExtJS的组件开发,这里以星级评分为示例,首先来看看效果图: 然后是功能操作:鼠标移动到五个星星上面时,会有tooltip显示当前的分值.如图:鼠标悬停在第四颗星星时前四颗星星显示高亮笑脸,当点击下去时锁定笑脸并且设定份数为4. 然后我们来说一下实现原理,Ext的组件基本单元是Ext.Component,所以自定义组件可以继承Component,然后显示部分直接用html来显示,包括css和动态事件都可以直接在html上编辑添加. 接下来我们来看代码: Ext.define('Pact

慕课网课程学习--JS事件探秘

事件流 事件冒泡(IE):事件最先被最具体的元素(文档中嵌套层次最深的节点)接受,然后逐级向上传播至最不具体的节点(.. -> body ->html -> document): 事件捕获(网景):不具体的节点更早接收到事件,最具体的节点最后接收到事件,和事件冒泡相反. 事件处理程序 1.HTML事件处理程序 原理:把事件直接在HTML结构中的HTML元素上. 方法一. <input type="button" value="click" o

以慕课网日志分析为例 进入大数据 Spark SQL 的世界

详情请交流  QQ  709639943 01.以慕课网日志分析为例 进入大数据 Spark SQL 的世界 02.漫谈spring cloud分布式服务架构 03.Spring Cloud微服务实战视频课程 04.漫谈spring cloud 与 spring boot 基础架构 05.Java秒杀系统方案优化 高性能高并发实战 06.Java深入微服务原理改造房产销售平台 07.快速上手Linux 玩转典型应用 08.快速上手Ionic3 多平台开发企业级问答社区 09.Java Sprin

慕课网160部破解实战收费课程_共892G百度云盘]

以下课程,需要的可以加我微*信:hgh813210,备注你需要的课程 Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享 前端成长必经之路 基于Storm构建实时热力分布项目实战 Spark Streaming实时流处理项目实战 以慕课网日志分析为例 进入大数据 Spark SQL 的世界 手工测试企业项目实践及面试提升 Webpack + React全栈工程架构项目实战精讲 深度学习之神经网络核心原理与算法 Android应用发展趋势必备武器 热修复与插件化

超多慕课网实战教程破解自学教程百度云盘分享-Python/Java/前端后端/小程序/运维测试/人工智能

以下课程,需要的可以加我微*信:hgh813210,备注你需要的课程 Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享 前端成长必经之路 基于Storm构建实时热力分布项目实战 Spark Streaming实时流处理项目实战 以慕课网日志分析为例 进入大数据 Spark SQL 的世界 手工测试企业项目实践及面试提升 Webpack + React全栈工程架构项目实战精讲 深度学习之神经网络核心原理与算法 Android应用发展趋势必备武器 热修复与插件化