barice
barice
  • 发布:2015-12-11 02:54
  • 更新:2018-10-29 20:21
  • 阅读:17692

可接收小数点的数字输入框 NumberBox

分类:MUI
mui

因为项目需要能步进小数点的数字输入框,但是mui 的数字输入框只能步进整数
原本是打算参考 mui 源码自已写一个
後来发现只要把 parseInt 改成 parseFloat 就搞定

感谢官方,感谢工作人员

以下代码除了 parseInt 改成 parseFloat 之外,其馀都没有变动
放在 js 文档内,可直接使用

/**  
 * 数字输入框  
 * varstion 1.0.1  
 * by Houfeng  
 * Houfeng@DCloud.io  
 */  

(function($) {  

    var touchSupport = ('ontouchstart' in document);  
    var tapEventName = touchSupport ? 'tap' : 'click';  
    var changeEventName = 'change';  
    var holderClassName = 'mui-numbox';  
    var plusClassName = 'mui-numbox-btn-plus';  
    var minusClassName = 'mui-numbox-btn-minus';  
    var inputClassName = 'mui-numbox-input';  

    var Numbox = $.Numbox = $.Class.extend({  
        /**  
         * 构造函数  
         **/  
        init: function(holder, options) {  
            var self = this;  
            if (!holder) {  
                throw "构造 numbox 时缺少容器元素";  
            }  
            self.holder = holder;  
            options = options || {};  
            options.step = parseFloat(options.step || 1);  
            self.options = options;  
            self.input = $.qsa('.' + inputClassName, self.holder)[0];  
            self.plus = $.qsa('.' + plusClassName, self.holder)[0];  
            self.minus = $.qsa('.' + minusClassName, self.holder)[0];  
            self.checkValue();  
            self.initEvent();  
        },  
        /**  
         * 初始化事件绑定  
         **/  
        initEvent: function() {  
            var self = this;  
            self.plus.addEventListener(tapEventName, function(event) {  
                var val = parseFloat(self.input.value) + self.options.step;  
                self.input.value = val.toString();  
                $.trigger(self.input, changeEventName, null);  
            });  
            self.minus.addEventListener(tapEventName, function(event) {  
                var val = parseFloat(self.input.value) - self.options.step;  
                self.input.value = val.toString();  
                $.trigger(self.input, changeEventName, null);  
            });  
            self.input.addEventListener(changeEventName, function(event) {  
                self.checkValue();  
                var val = parseFloat(self.input.value);  
                //触发顶层容器  
                $.trigger(self.holder, changeEventName, {  
                    value: val  
                });  
            });  
        },  
        /**  
         * 获取当前值  
         **/  
        getValue: function() {  
            var self = this;  
            return parseFloat(self.input.value);  
        },  
        /**  
         * 验证当前值是法合法  
         **/  
        checkValue: function() {  
            var self = this;  
            var val = self.input.value;  
            if (val == null || val == '' || isNaN(val)) {  
                self.input.value = self.options.min || 0;  
                self.minus.disabled = self.options.min != null;  
            } else {  
                var val = parseFloat(val);  
                if (self.options.max != null && !isNaN(self.options.max) && val >= parseFloat(self.options.max)) {  
                    val = self.options.max;  
                    self.plus.disabled = true;  
                } else {  
                    self.plus.disabled = false;  
                }  
                if (self.options.min != null && !isNaN(self.options.min) && val <= parseFloat(self.options.min)) {  
                    val = self.options.min;  
                    self.minus.disabled = true;  
                } else {  
                    self.minus.disabled = false;  
                }  
                self.input.value = val;  
            }  
        },  
        /**  
         * 更新选项  
         **/  
        setOption: function(name, value) {  
            var self = this;  
            self.options[name] = value;  
        }  
    });  

    $.fn.numbox = function(options) {  
        var instanceArray = [];  
        //遍历选择的元素  
        this.each(function(i, element) {  
            if (element.numbox) return;  
            if (options) {  
                element.numbox = new Numbox(element, options);  
            } else {  
                var optionsText = element.getAttribute('data-numbox-options');  
                var options = optionsText ? JSON.parse(optionsText) : {};  
                options.step = element.getAttribute('data-numbox-step') || options.step;  
                options.min = element.getAttribute('data-numbox-min') || options.min;  
                options.max = element.getAttribute('data-numbox-max') || options.max;  
                element.numbox = new Numbox(element, options);  
            }  
        });  
        return this[0] ? this[0].numbox : null;  
    }  

    //自动处理 class='mui-locker' 的 dom  
    $.ready(function() {  
        $('.' + holderClassName).numbox();  
    });  

}(mui))

附件为参考效果图

1 关注 分享
rodgerz

要回复文章请先登录注册

1***@qq.com

1***@qq.com

如果小数位后只需要一位,除了parseInt 改为:parseFloat外,
还有两个地方需要修改:
self.plus.addEventListener 和 self.minus.addEventListener 中的
self.input.value = val.toString();
修改为:
self.input.value = Number(val.toString()).toFixed(1);



/**
* 数字输入框
* varstion 1.0.1
* by Houfeng
* Houfeng@DCloud.io
* Debug by 1887179@qq.com (2018-10-29)
*/

(function($) {

var touchSupport = ('ontouchstart' in document);
var tapEventName = touchSupport ? 'tap' : 'click';
var changeEventName = 'change';
var holderClassName = 'mui-numbox';
var plusClassSelector = '.mui-btn-numbox-plus,.mui-numbox-btn-plus';
var minusClassSelector = '.mui-btn-numbox-minus,.mui-numbox-btn-minus';
var inputClassSelector = '.mui-input-numbox,.mui-numbox-input';

var Numbox = $.Numbox = $.Class.extend({
/**
* 构造函数
**/
init: function(holder, options) {
var self = this;
if (!holder) {
throw "构造 numbox 时缺少容器元素";
}
self.holder = holder;
options = options || {};
//options.step = parseInt(options.step || 1);
options.step = parseFloat(options.step || 0.1);
self.options = options;
self.input = $.qsa(inputClassSelector, self.holder)[0];
self.plus = $.qsa(plusClassSelector, self.holder)[0];
self.minus = $.qsa(minusClassSelector, self.holder)[0];
self.checkValue();
self.initEvent();
},
/**
* 初始化事件绑定
**/
initEvent: function() {
var self = this;
self.plus.addEventListener(tapEventName, function(event) {
//var val = parseInt(self.input.value) + self.options.step;
var val = parseFloat(self.input.value) + self.options.step;
self.input.value = Number(val.toString()).toFixed(1);
$.trigger(self.input, changeEventName, null);
});
self.minus.addEventListener(tapEventName, function(event) {
//var val = parseInt(self.input.value) - self.options.step;
var val = parseFloat(self.input.value) - self.options.step;
self.input.value = Number(val.toString()).toFixed(1);
$.trigger(self.input, changeEventName, null);
});
self.input.addEventListener(changeEventName, function(event) {
self.checkValue();
//var val = parseInt(self.input.value);
var val = parseFloat(self.input.value);
//触发顶层容器
$.trigger(self.holder, changeEventName, {
value: val
});
});
},
/**
* 获取当前值
**/
getValue: function() {
var self = this;
//return parseInt(self.input.value);
return parseFloat(self.input.value);
},
/**
* 验证当前值是法合法
**/
checkValue: function() {
var self = this;
var val = self.input.value;
if (val == null || val == '' || isNaN(val)) {
self.input.value = self.options.min || 0;
self.minus.disabled = self.options.min != null;
} else {
//var val = parseInt(val);
var val = parseFloat(val);
//if (self.options.max != null && !isNaN(self.options.max) && val >= parseInt(self.options.max)) {
if (self.options.max != null && !isNaN(self.options.max) && val >= parseFloat(self.options.max)) {
val = self.options.max;
self.plus.disabled = true;
} else {
self.plus.disabled = false;
}
//if (self.options.min != null && !isNaN(self.options.min) && val <= parseInt(self.options.min)) {
if (self.options.min != null && !isNaN(self.options.min) && val <= parseFloat(self.options.min)) {
val = self.options.min;
self.minus.disabled = true;
} else {
self.minus.disabled = false;
}
self.input.value = val;
}
},
/**
* 更新选项
**/
setOption: function(name, value) {
var self = this;
self.options[name] = value;
},
/**
* 动态设置新值
**/
setValue: function(value) {
this.input.value = value;
this.checkValue();
}
});

$.fn.numbox = function(options) {
var instanceArray = [];
//遍历选择的元素
this.each(function(i, element) {
if (element.numbox) {
return;
}
if (options) {
element.numbox = new Numbox(element, options);
} else {
var optionsText = element.getAttribute('data-numbox-options');
var options = optionsText ? JSON.parse(optionsText) : {};
options.step = element.getAttribute('data-numbox-step') || options.step;
options.min = element.getAttribute('data-numbox-min') || options.min;
options.max = element.getAttribute('data-numbox-max') || options.max;
element.numbox = new Numbox(element, options);
}
});
return this[0] ? this[0].numbox : null;
}

//自动处理 class='mui-locker' 的 dom
$.ready(function() {
$('.' + holderClassName).numbox();
});

}(mui));
2018-10-29 20:21
3***@qq.com

3***@qq.com

但是有个问题,这样改了的话,原来的整数型就冲突的。能不能改一下类名,或者加个参数之类的实现共存?我这里只改类名显示不正常
2017-12-02 17:24
风雨

风雨

mark
2016-07-25 23:16
barice

barice (作者)

回复 过期红茶 :
不知道新版会变得如何
2015-12-12 23:45
过期红茶

过期红茶

mark一下
2015-12-12 11:54