nuijs
Version:
nui框架
576 lines (553 loc) • 21.2 kB
JavaScript
/**
* @author Aniu[2016-11-11 16:54]
* @update Aniu[2016-11-11 16:54]
* @version 1.0.1
* @description 实用工具集
*/
Nui.define(['./extends'], function(){
return ({
/**
* @func 常用正则表达式
*/
regex:{
//手机
mobile:/^0?1[3-9][0-9]{9}$/,
//电话
tel:/^[0-9-()()]{7,18}$/,
//邮箱
email:/^\w+((-w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/,
//身份证
idcard:/^\d{17}[\d|x]|\d{15}$/,
//中文
cn:/^[\u4e00-\u9fa5]+$/,
//税号
taxnum:/^[a-zA-Z0-9]{15,20}$/
},
/**
* @func 四舍五入保留小数,原生toFixed会有精度问题
* @return <String>
* @param digit <String, Number> 待转换数字
* @param decimal <Number> 保留位数
* @param number <Number> 小数部分末尾最多显示0的数量
*/
toFixed:function(digit, decimal, number){
if(isNaN(digit) || digit === ''){
return digit
}
//默认末尾只保留2个0
if(number === undefined){
number = 2
}
decimal = decimal || 0;
//将数字转换为字符串,用于分割
var value = digit.toString();
//补零
var mend = function(num){
var zero = '';
while(num > 0){
zero += '0';
num--
}
return zero
}
//正负数
var pre = '';
if(value < 0){
value = value.replace('-', '');
pre = '-';
}
//获取小数点所在位置
var i = value.indexOf('.');
//存在小数点
if(i !== -1 && decimal >= 0){
var integer = parseInt(value.substr(0, i));
//小数部分转为0.xxxxx
var _decimal = '0' + value.substr(i);
var num = '1' + mend(decimal);
_decimal = (Math.round(_decimal*num)/num).toFixed(decimal);
//小数四舍五入后,若大于等于1,整数部分需要加1
if(_decimal >= 1){
integer = (integer + 1).toString()
}
value = pre + integer + _decimal.substr(1)
}
//整数就直接补零
else if(decimal > 0){
value = pre + value + '.' + mend(decimal)
}
if(number !== null && number >= 0 && number < decimal){
value = value.replace(/0+$/, '');
var i = value.indexOf('.'), len = 0;
if(i !== -1){
len = value.substr(i+1).length;
}
while(len < number){
value = value + '0';
len++;
}
value = value.replace(/\.$/, '');
}
return value
},
/**
* @func 获取url参数值
* @return <String, Object>
* @param name <String, Undefined> 参数名,不传则以对象形式返回全部参数
* @param urls <String, Undefined> url地址,默认为当前访问地址
*/
getParam:function(name, urls){
var url = decodeURI(urls||location.href), value = {};
startIndex = url.indexOf('?');
if(startIndex++ > 0){
var param = url.substr(startIndex).split('&'), temp;
Nui.each(param, function(val){
temp = val.split('=');
value[temp[0]] = temp[1];
});
}
if(typeof name === 'string' && name){
value = (temp = value[name]) !== undefined ? temp : '';
}
return value;
},
/**
* @func 设置url参数值
* @return <String> 设置后的url
* @param name <String, Object> 参数名或者{key:value, ...}参数集合
* @param value <String> 参数值或者url
* @param urls <String, Undefined> url,没有则获取浏览器url
*/
setParam:function(name, value, urls){
var self = this, url;
if(Nui.type(name, 'Object')){
url = value||location.href;
Nui.each(name, function(val, key){
if(val || val === 0){
url = self.setParam(key, val, url);
}
});
}
else{
url = urls||location.href;
if(url.indexOf('?') === -1){
url += '?';
}
if(url.indexOf(name+'=') !== -1){
var reg = new RegExp('('+name+'=)[^&]*');
url = url.replace(reg, '$1'+value);
}
else{
var and = '';
if(url.indexOf('=') !== -1){
and = '&';
}
url += and+name+'='+value;
}
}
return url;
},
/**
* @func 检测浏览器是否支持CSS3属性
* @return <Boolean>
* @param style <String> 样式属性
*/
supportCss3:function(style){
var prefix = ['webkit', 'Moz', 'ms', 'o'],
i, humpString = [],
htmlStyle = document.documentElement.style,
_toHumb = function (string) {
return string.replace(/-(\w)/g, function ($0, $1) {
return $1.toUpperCase();
});
};
for (i in prefix)
humpString.push(_toHumb(prefix[i] + '-' + style));
humpString.push(_toHumb(style));
for (i in humpString)
if (humpString[i] in htmlStyle) return true;
return false;
},
/**
* @func 检测浏览器是否支持Html5属性
* @return <Boolean>
* @param attr <String> 属性
* @param element <String> DOM元素标签
*/
supportHtml5:function(attr, element){
return attr in document.createElement(element);
},
/**
* @func 模拟location.href跳转
* @return <Undefined>
* @param url <String> 跳转的url
* @param target <String> 跳转类型,默认为_self
*/
location:function(url, target){
if(url){
jQuery('<a href="'+ url +'"'+ (target ? 'target="'+ (target||'_self') +'"' : '' ) +'><span></span></a>')
.appendTo('body').children().click().end().remove();
}
},
/**
* @func 格式化日期
* @return <String>
* @param timestamp <String, Number> 时间戳,为空返回横杠“-”
* @param format <String, Undefined> 输出格式,为空则返回时间戳
*/
formatDate:function(timestamp, format){
if(timestamp = parseInt(timestamp)){
if(!format){
return timestamp;
}
var date = new Date(timestamp);
var map = {
'M':date.getMonth()+1,
'd':date.getDate(),
'h':date.getHours(),
'm':date.getMinutes(),
's':date.getSeconds()
}
format = format.replace(/([yMdhms])+/g, function(all, single){
var value = map[single];
if(value !== undefined){
if(all.length > 1){
value = '0' + value;
value = value.substr(value.length-2);
}
return value;
}
else if(single === 'y'){
return (date.getFullYear() + '').substr(4-all.length);
}
return all;
});
return format;
}
return '-';
},
/**
* @func 获取表单数据集合
* @return <Object>
* @param element <jQuery Object> 表单元素集合或者form元素
* @param selector <String> 将name相同表单元素值分隔,当设置为jquery选择器时,配合field参数使用,用于获取item中表单元素的数据集合
* @param field <String> 字段名,配合selector参数使用,返回对象中会包含该字段
* @param disabled <Boolean> 是否包含禁用元素
* @example
* <form id="form">
* <input type="hidden" name="name0" value="0">
* <div>
* <input type="hidden" name="name1" value="1">
* <input type="hidden" name="name2" value="2">
* </div>
* <div>
* <input type="hidden" name="name1" value="3">
* <input type="hidden" name="name2" value="4">
* </div>
* <form>
* getData($('#form'), 'div', 'list').result =>
* {
* name0:'0',
* list:[{
* name1:'1',
* name2:'2'
* }, {
* name1:'3',
* name2:'4'
* }]
* }
*/
getData:function(element, selector, field, disabled){
var that = this;
var data = {
'result':{},
'voids':0, //字段中空值数量
'total':0 //总计多少个字段
}
if(element.length){
if(typeof selector === 'boolean'){
disabled = selector;
selector = undefined
}
else if(typeof field === 'boolean'){
disabled = field;
field = undefined
}
//form元素
var array = element.serializeArray(disabled);
if(!array.length){
array = element.find('[name]').serializeArray(disabled);
}
var separator = ',';
if(selector && field === undefined){
separator = selector;
selector = undefined
}
Nui.each(array, function(v, i){
var val = Nui.trim(v.value)
data.total++;
if(!val){
data.voids++
}
var name = v.name;
if(!Nui.isArray(data.result[name])){
data.result[name] = [];
}
data.result[name].push(val)
})
Nui.each(data.result, function(v, k){
data.result[k] = v.join(separator)
})
if(selector && field && typeof field === 'string'){
var once = false;
data.result[field] = [];
element.find(selector).each(function(){
var result = that.getData($(this), disabled).result;
if(!$.isEmptyObject(result)){
if(!once){
Nui.each(result, function(v, k){
delete data.result[k]
});
once = true
}
data.result[field].push(result)
}
})
}
}
return data
},
/**
* @func 获取输入框内光标位置
* @return <Number>
* @param element <DOM Object> 表单元素dom对象
*/
getFocusIndex:function(element){
var val = Nui.trim(element.value);
var index = val.length;
if(element.setSelectionRange){
index = element.selectionStart;
}
else{
//ie
try{
var temp = document.selection.createRange();
var textRange = element.createTextRange();
textRange.setEndPoint('endtoend', temp);
index = textRange.text.length;
}
catch(e){}
}
return index;
},
/**
* @func 检测页面是否有文本被选择
* @return <Boolean>
*/
isTextSelect:function(){
var text = '';
//ie10以及以下浏览器
if(document.selection){
text = document.selection.createRange().text;
}
//火狐和ie11浏览器getSelection无法获取表单元素选中文本
else if(navigator.userAgent.toLowerCase().indexOf('gecko') !== -1){
var textArea = document.activeElement;
text = textArea.value.substring(textArea.selectionStart, textArea.selectionEnd);
}
//chrome safari opera
else if(window.getSelection){
text = window.getSelection().toString();
}
//低版本chrome
else if(document.getSelection){
text = document.getSelection().toString();
}
return !!text;
},
/**
* @func 检测是否需要安装PDF阅读器
* @return <Boolean>
*/
isInstallPDF:function(){
var i, len;
var flag = true;
if(Nui.browser.webkit || (Nui.browser.mozilla && Nui.browser.version > 19)){
flag = false;
}
if(navigator.plugins && (len = navigator.plugins.length)){
for(i = 0; i < len; i++){
if(/Adobe Reader|Adobe PDF|Acrobat|Chrome PDF Viewer/.test(navigator.plugins[i].name)){
flag = false;
break;
}
}
}
try{
if(window.ActiveXObject || window.ActiveXObject.prototype){
for(i = 1; i < 10; i++){
try{
if(eval("new ActiveXObject('PDF.PdfCtrl." + i + "');")){
flag = false;
break;
}
}
catch(e){
flag = true;
}
}
var arr = ['PDF.PdfCtrl', 'AcroPDF.PDF.1', 'FoxitReader.Document', 'Adobe Acrobat', 'Adobe PDF Plug-in'];
len = arr.length;
for(i = 0; i < len; i++){
try{
if(new ActiveXObject(arr[i])){
flag = false;
break;
}
}
catch(e){
flag = true;
}
}
}
}
catch(e){}
return flag;
},
/**
* @func 检测是否需要安装flash,没有安装则返回安装路径
* @return <Boolean, String>
*/
isInstallFlash:function(){
if(typeof window.ActiveXObject != 'undefined'){
try{
if(!!new ActiveXObject('ShockwaveFlash.ShockwaveFlash')){
return false
}
}
catch(e){}
}
else{
if(!!navigator.plugins['Shockwave Flash']){
return false
}
}
if(Nui.browser.msie){
return 'http://rj.baidu.com/soft/detail/17153.html'
}
else{
return 'http://rj.baidu.com/soft/detail/15432.html'
}
},
/**
* @func 将数字转换为逗号千分位分隔
* @param number <String> 数字
* @return <String>
*/
formatNumber:function(number){
var integer = parseInt(number);
if(!isNaN(integer) && integer && (number = number.toString())){
var dot = number.indexOf('.');
var decimal = '';
if(dot > 0){
decimal = number.substr(dot);
}
return integer.toLocaleString().replace(/\.\d+$/, '') + decimal
}
return number
},
/**
* @func 将数字转换为中文大写
* @param number <String> 数字
* @return <String>
*/
numberToCN:function(number){
//汉字的数字
var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
//基本单位
var cnIntRadice = new Array('', '拾', '佰', '仟');
//对应整数部分扩展单位
var cnIntUnits = new Array('', '万', '亿', '兆');
//对应小数部分单位
var cnDecUnits = new Array('角', '分', '毫', '厘');
//整数金额时后面跟的字符
var cnInteger = '整';
//整型完以后的单位
var cnIntLast = '元';
//最大处理的数字
var maxNum = 999999999999999.9999;
//金额整数部分
var integerNum;
//金额小数部分
var decimalNum;
//输出的中文金额字符串
var chineseStr = '';
//分离金额后用的数组,预定义
var parts;
if (number == '') { return ''; }
var isMinus = number < 0;
number = Math.abs(parseFloat(number));
if (number >= maxNum) {
//超出最大处理数字
return '';
}
if (number == 0) {
chineseStr = cnNums[0] + cnIntLast + cnInteger;
return chineseStr;
}
//转换为字符串
number = number.toString();
if (number.indexOf('.') == -1) {
integerNum = number;
decimalNum = '';
} else {
parts = number.split('.');
integerNum = parts[0];
decimalNum = parts[1].substr(0, 4);
}
//获取整型部分转换
if (parseInt(integerNum, 10) > 0) {
var zeroCount = 0;
var IntLen = integerNum.length;
for (var i = 0; i < IntLen; i++) {
var n = integerNum.substr(i, 1);
var p = IntLen - i - 1;
var q = p / 4;
var m = p % 4;
if (n == '0') {
zeroCount++;
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0];
}
//归零
zeroCount = 0;
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
}
if (m == 0 && zeroCount < 4) {
chineseStr += cnIntUnits[q];
}
}
chineseStr += cnIntLast;
}
//小数部分
if (decimalNum != '') {
var decLen = decimalNum.length;
for (var i = 0; i < decLen; i++) {
var n = decimalNum.substr(i, 1);
if (n != '0') {
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
}
}
}
if (chineseStr == '') {
chineseStr += cnNums[0] + cnIntLast + cnInteger;
} else if (decimalNum == '') {
chineseStr += cnInteger;
}
if(isMinus){
chineseStr = '负' + chineseStr
}
return chineseStr;
}
})
})