求源码!我想改把它改成用原生 js 来实现。
求源码!我想改把它改成用原生 js 来实现,目前项目中没有用到 jq,不想为了个星星而引入一个 jQuery。。。。。
求源码!我想改把它改成用原生 js 来实现,目前项目中没有用到 jq,不想为了个星星而引入一个 jQuery。。。。。
2017-05-30
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();
}
});举报