課程
/前端開發
/JavaScript
/星級評分原理和實現(上)
求源碼!我想改把它改成用原生 js 來實現,目前項目中沒有用到 jq,不想為了個星星而引入一個 jQuery。。。。。
2017-05-30
源自:星級評分原理和實現(上) 5-1
正在回答
https://typescript-zjhw7c.stackblitz.io
TypeScript代碼可以嗎?
/** *?星級評分條類 * *?@class?RatingBar */ class?RatingBar { /** ????*?默認設置 ????* ????*?@static ????*?@memberof?RatingBar ????*/ public?static?readonly?defaults?=?{ mode:?"LightEntire", maxStar:?5, star:?0, OnSelect:?()?=>?{?}, OnChosen:?()?=>?{?}, }; public?readonly?mode?=?{ "LightEntire":?this.LightEntire, "LightHalf":?this.LightHalf, } el:?JQuery<HTMLElement>; options:?{ mode?:?string,?maxStar?:?number,?star?:?number,?OnSelect?:?()?=>?void,?OnChosen?:?()?=>?void, }; constructor(el:?JQuery<HTMLElement>,?options:?{?mode?:?string,?maxStar?:?number,?star?:?number,?OnSelect?:?()?=>?void,?OnChosen?:?()?=>?void,?}) { options?=?$.extend({},?RatingBar.defaults,?options); options.mode?=?(!this.mode[options.mode])???"LightEntire"?:?options.mode; options.mode?=?(options.star?!=?Math.floor(options.star))???"LightHalf"?:?options.mode; this.el?=?el; this.options?=?options; //初始化星星顯示 this.LightHalf(options.star); //綁定事件 this.BindEvent(); } /** ????*?綁定事件 ????* ????*?@memberof?RatingBar ????*/ public?BindEvent() { this.el.on("mousemove",?".rating_item",?(e)?=> { this.OnMouseMove(e); }); this.el.on("click",?".rating_item",?(e)?=> { this.OnClick(e); }); this.el.on("mouseout",?".rating_item",?(e)?=> { this.OnMouseOut(e); }); } /** ????*?清除綁定事件 ????* ????*?@memberof?RatingBar ????*/ public?UnbindEvent() { this.el.off("mousemove"); this.el.off("click"); this.el.off("mouseout"); } /** ????*?點亮整顆星星 ????* ????*?@param?{number}?num?要點亮的星星數目 ????*?@memberof?RatingBar ????*/ public?LightEntire(num:?number) { num?=?Math.floor(num);?//防止傳入的數不是整數 let?item?=?this.el.find(".rating_item"); item.each(function(i) { item.eq(i).removeClass("show_half");?//清除半顆星 if?(i?<?num) { item.eq(i).addClass("show_entire"); } else { item.eq(i).removeClass("show_entire"); } }); } /** ????*?點亮半顆星星 ????* ????*?@param?{number}?num?要點亮的星星數目 ????*?@memberof?RatingBar ????*/ public?LightHalf(num:?number) { let?count:?number?=?Math.floor(num); let?isHalf:?boolean?=?count?!==?num;?//是否選擇半顆 let?item?=?this.el.find(".rating_item"); item.each((i)?=> { this.LightEntire(count); if?(isHalf) { item.eq(count).addClass("show_half"); } }); } private?OnMouseMove(e:?JQuery.MouseMoveEvent<HTMLElement,?undefined,?any,?any>) { let?$self?=?$(e.currentTarget); let?num:?number; if?(e.pageX?-?$self.offset().left?<?$self.width()?/?2?&&?this.options.mode?==?"LightHalf")?//半顆 { num?=?$self.index()?+?0.5; } else?//整顆 { num?=?$self.index()?+?1; } this.LightHalf(num); this.options.OnSelect(); } private?OnClick(e:?JQuery.ClickEvent<HTMLElement,?undefined,?any,?any>) { let?$self?=?$(e.currentTarget); let?num:?number; if?(e.pageX?-?$self.offset().left?<?$self.width()?/?2?&&?this.options.mode?==?"LightHalf")?//半顆 { num?=?$self.index()?+?0.5; } else?//整顆 { num?=?$self.index()?+?1; } this.options.star?=?num; this.options.OnChosen(); } private?OnMouseOut(e:?JQuery.MouseOutEvent<HTMLElement,?undefined,?any,?any>) { this.LightHalf(this.options.star); } } let?r1?=?new?RatingBar($("#r1"),?{ OnSelect:?()?=> { console.log("select"); }, OnChosen:?()?=> { r1.UnbindEvent(); } });
jq也就那么幾句,自己改一改唄
自己寫吧,思路都有了,差別不是太大。
沒有源碼 手打的可以嗎 功能都實現了
舉報
本課程主要講解如何使用不同的方式來實現星級評分的效果.
2 回答改進代碼--JS第二次嘗試,星級評分
4 回答自動生成魔人代碼
1 回答源代碼下載
3 回答我就想知道我都搞成一模一樣了,星星沒半點反應
2 回答能不能給下源碼
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2019-11-24
https://typescript-zjhw7c.stackblitz.io
2019-02-24
TypeScript代碼可以嗎?
2017-06-05
jq也就那么幾句,自己改一改唄
2017-06-02
自己寫吧,思路都有了,差別不是太大。
2017-06-01
沒有源碼 手打的可以嗎 功能都實現了