本次分享的组件是购物车商品数量的加减组件。利用该组件可以很方便的实现购物车商品数量的调节。效果图如下。
组件JS源码:
- var alignmentFns = {
- inputs: [],
- init: function (input, step, max, min, digit) {
- var width = input.width() - 3;
- var height = input.width() / 4;
- var _this = this;
- width += 3;
- input.attr("readonly", "readonly");
- input.css("border", "none");
- input.css("width", width - height * 2 - 2);
- input.css("height", height);
- input.css("padding", "0px");
- input.css("margin", "0px");
- input.css("text-align", "center");
- input.css("vertical-align", "middle");
- input.css("line-height", height + "px");
- input.wrap("<div id = '" + input.attr('id') + "div' style = 'overflow:hidden;width:" + width + "px;height:" +
- height + "px;border: 1px solid #CCC;'></div>");
- input.before("<div id = '" + input.attr('id') +
- "l' onselectstart = 'return false;' style = '-moz-user-select:none;cursor:pointer;text-align:center;width:" +
- height + "px;height:" + height + "px;line-height:" + height +
- "px;border-right: 1px solid #CCC;float:left'>-</div>");
- input.after("<div id = '" + input.attr('id') +
- "r' onselectstart = 'return false;' style = '-moz-user-select:none;cursor:pointer;text-align:center;width:" +
- height + "px;height:" + height + "px;line-height:" + height +
- "px;border-left: 1px solid #CCC;float:right'> + </div>");
- $("#" + input.attr('id') + "l").click(function () {
- _this.execute(input, step, max, min, digit, true);
- });
- $("#" + input.attr('id') + "r").click(function () {
- _this.execute(input, step, max, min, digit, false);
- });
- },
- execute: function (input, step, max, min, digit, _do) {
- var val = parseFloat(this.format(input.val(), digit));
- var ori = val;
- if (_do) val -= step;
- if (!_do) val += step;
- if (val < min) {
- val = min;
- } else if (val > max) {
- val = max;
- }
- input.val(this.format(val, digit)).change();
- },
- format: function (val, digit) {
- if (isNaN(val)) {
- val = 0;
- }
- return parseFloat(val).toFixed(digit);
- },
- data: {
- default_data: {
- "step": 1,
- "min": 0,
- "max": 10000,
- "digit": 0
- }
- },
- initialize: function () {
- var inputs = $(
- "input[user_data], input[data-digit], input[data-step], input[data-min], input[data-max], input.alignment");
- inputs.each(function () {
- alignmentFns.inputs.push(this.outerHTML);
- var data = alignmentFns.data;
- var user_data = eval("data." + $(this).attr("user_data"));
- if (user_data == null) {
- user_data = JSON.parse(JSON.stringify(data.default_data));
- }
- var digit = $(this).data("digit");
- if (digit != null && !isNaN(parseFloat(digit))) {
- digit = parseFloat(digit).toFixed(0);
- user_data.digit = parseFloat(digit);
- }
- var step = $(this).data("step");
- if (step != null && !isNaN(parseFloat(step))) {
- user_data.step = parseFloat(step);
- }
- var min = $(this).data("min");
- if (min != null && !isNaN(parseFloat(min))) {
- user_data.min = parseFloat(min);
- }
- var max = $(this).data("max");
- if (max != null && !isNaN(parseFloat(max))) {
- user_data.max = parseFloat(max);
- }
- alignmentFns.init($(this), user_data.step, user_data.max, user_data.min, user_data.digit);
- var data_edit = $(this).data("edit");
- if (data_edit) {
- $(this).attr("readonly", null);
- }
- });
- },
- destroy: function () {
- var inputs = this.inputs;
- $.each(inputs, function (index, obj) {
- var input = $(obj)[0];
- var id = input.id;
- $("#" + id + "div").replaceWith(input);
- });
- },
- createType: function (types) {
- $.each(types, function (index, obj) {
- alignmentFns.data[obj.type] = obj.data;
- });
- }
- };
使用方式:
第一种如果应用场景的模式比较固定,可以将上述文件52~57行配置修改后写死即可。
第二种方式适合应用场景不固定的情况下支持自由配置。
参考示例如下:
- <input id="1" class="alignment" data-edit="true" data-max="100" data-digit="0" value="0" />
“data-edit”:是否支持编辑。
“data-max”:最大值。
“data-digit”:小数位。
“data-step”:步进值,每次加减的变动值。
“data-min”:最小值。
引用示例参考:
引用JS的方式很多,下面列举其一仅供参考。
- require(['numanimate','jquery'],function(){
- alignmentFns.initialize();
- })
OK,结束!需要注意的是如果一个页面引用多次该插件,必须为input框添加id属性。