JS几个常用的工具函数
项目中JS也不可避免会出现重用,所以可以像Java一样抽成工具类,下面总结了几个常用的函数:
1.日期处理函数
将日期返回按指定格式处理过的字符串:
function Format(now,mask)
{
var d = now;
var zeroize = function (value, length)
{
if (!length) length = 2;
value = String(value);
for (var i = 0, zeros = ''; i < (length - value.length); i++)
{
zeros += '0';
}
return zeros + value;
}; return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])\1?|[lLZ])\b/g, function ($0)
{
switch ($0)
{
case 'd': return d.getDate();
case 'dd': return zeroize(d.getDate());
case 'ddd': return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];
case 'dddd': return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()];
case 'M': return d.getMonth() + 1;
case 'MM': return zeroize(d.getMonth() + 1);
case 'MMM': return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];
case 'MMMM': return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()];
case 'yy': return String(d.getFullYear()).substr(2);
case 'yyyy': return d.getFullYear();
case 'h': return d.getHours() % 12 || 12;
case 'hh': return zeroize(d.getHours() % 12 || 12);
case 'H': return d.getHours();
case 'HH': return zeroize(d.getHours());
case 'm': return d.getMinutes();
case 'mm': return zeroize(d.getMinutes());
case 's': return d.getSeconds();
case 'ss': return zeroize(d.getSeconds());
case 'l': return zeroize(d.getMilliseconds(), 3);
case 'L': var m = d.getMilliseconds();
if (m > 99) m = Math.round(m / 10);
return zeroize(m);
case 'tt': return d.getHours() < 12 ? 'am' : 'pm';
case 'TT': return d.getHours() < 12 ? 'AM' : 'PM';
case 'Z': return d.toUTCString().match(/[A-Z]+$/);
// Return quoted strings with the surrounding quotes removed
default: return $0.substr(1, $0.length - 2);
}
});
};
用法:
var d = new Date();//Date有需要参数可以传入
alert(Format(d,"yyyy-MM-dd"));
2.全局处理null值或者''的函数,如果为null或者''返回-。如果传入第二个参数,表示截取指定长度的字符串
/**
* 一个值如果是null或者''返回-
* @param value 需要处理的值
* @param length 需要截取的字符的长度的值,未指定的时候返回全部
* @returns {*} 处理过的值
*/
function replaceNull(value,length) {
//判断截取的值是否为空
if(value == null || value==undefined || value == "" || value=='undefined'){
return "-";
}
//判断长度是否为空
if(length == null || length == ''){
return value;
}
return value.toString().substr(0,length);
}
用法:
alert(replaceNull());// -
alert(replaceNull('2018-05-03',7));// 2018-05
3.正则表达式实现trim()去掉开始和结尾的空格
function trimStr(str) {
return str.replace(/(^\s*)|(\s*$)/g,"");
}
注意:关于去掉两头空格,jquery库提供了$.trim()方法
$.trim(" xxxxxxxxx ")
4.使用正则表达式验证数字
/**
* 校验只要是数字(包含正负整数,0以及正负浮点数)就返回true
**/
function isNumber(val){ var regPos = /^\d+(\.\d+)?$/; //非负浮点数
var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
if(regPos.test(val) || regNeg.test(val)){
return true;
}else{
return false;
} }
/**
* 校验正负正数就返回true
**/
function isIntNum(val){
var regPos = / ^\d+$/; // 非负整数
var regNeg = /^\-[1-9][0-9]*$/; // 负整数
if(regPos.test(val) || regNeg.test(val)){
return true;
}else{
return false;
}
}
5.休眠函数(模拟Thread.sleep())
//参数n为休眠时间,单位为毫秒:
function sleep(n) {
var start = new Date().getTime();
console.log('休眠前:' + start);
while (true) {
if (new Date().getTime() - start > n) {
break;
}
}
console.log('休眠后:' + new Date().getTime());
}
sleep(4000);
6. ajax提交表单的方法,也就是封装一个工具类,以ajax的方式提交表单,并且在表单成功之后做一些事情
JS函数:(重写表单的submit函数即可)
下面的第二个参数的设计是为了有时候我们需要提交完自定义做一些操作,有时不需要。
function initWindowForm(id, successoperation) {
if (!id) {
return;
} $('#' + id).unbind("submit"); $('#' + id).submit(function() {
// 验证所有的必填字段
var isValidated = true;
$(this).find(".required").each(function() {
if (!$(this).val()) {
isValidated = false;
}
})
if (!isValidated) {
alert("请检查所有必填字段");
return false;
} // 异步提交数据
$.post($('#' + id).attr('action'), $('#' + id).serialize(), function(response) {
if (response && response.msg) {
alert(response.msg);
// 第二个参数为成功之后的处理
if (successoperation) {
successoperation();
}
} else {
alert("未知信息");
}
}); // 阻止冒泡,防止刷新
return false;
});
}
后台回传到前台是一个map,msg是里面处理完的信息,如下java代码:
工具类代码:
package cn.xm.exam.utils.system; import java.util.HashMap;
import java.util.Map;public class SystemUtils { private SystemUtils() {
throw new AssertionError();
}public static Map<String, Object> generateSuccessMap(String msg) {
return generateMap(true, msg);
} public static Map<String, Object> generateFailedMap(String msg) {
return generateMap(false, msg);
} private static Map<String, Object> generateMap(boolean successed, String msg) {
Map<String, Object> result = new HashMap<>();
result.put("success", successed);
result.put("msg", msg); return result;
} }
action层代码:
public String add() {
if (operationcharge == null) {
response = SystemUtils.generateFailedMap("operationcharge is null");
return "json";
} operationcharge.setCreator(SystemUtils.getCurrentUseridcard());
operationcharge.setCreatorfullname(SystemUtils.getCurrentUserfullname());
operationcharge.setCreatedate(new Date()); operationChargeService.save(operationcharge); response = SystemUtils.generateSuccessMap("保存成功");
return "json";
}
HTML代码:(form要写上action)
<script>
$(function() {
initWindowForm("addOperationForm");
})
</script>
<form action="operation_add.do" id="addOperationForm">
<div class="input-group el_modellist" role="toolbar">
<input type="submit" class="btn btn-info" value="保存"/>
<input type="button" class="btn btn-danger" value="取消" onclick="javascript:history.back(-1);"/>
</div> <div class="input-group el_modellist" role="toolbar">
<span class="el_spans">公司部门名称<span class="requiredStart">*</span>:</span>
<input type="text" class="form-control el_modelinput required" name="operationcharge.departmentname"/> <span class="el_spans">公司部门专业<span class="requiredStart">*</span>:</span>
<input type="text" class="form-control el_modelinput required" name="operationcharge.departmentmajor"/>
</div>
</form>
:补充用上面的实现保存和保存并继续
保存并继续不做任何操作,保存之后有可能是需要关闭模态框或者进行页面跳转,所以做如下修改:
<form action="operation_add.do" id="addOperationForm">
<div class="input-group el_modellist" role="toolbar">
<input type="submit" class="btn btn-info" value="保存并继续" onclick="initWindowForm('addOperationForm');"/>
<input type="submit" class="btn btn-info" value="保存" onclick="submitAndForward('addOperationForm', '/Exam/view/ownercharge/operation/listOperation.jsp')"/>
<input type="button" class="btn btn-danger" value="取消" onclick="javascript:history.back(-1);"/>
</div> <div class="input-group el_modellist" role="toolbar">
<span class="el_spans">公司部门名称<span class="requiredStart">*</span>:</span>
<input type="text" class="form-control el_modelinput required" name="operationcharge.departmentname"/> <span class="el_spans">公司部门专业<span class="requiredStart">*</span>:</span>
<input type="text" class="form-control el_modelinput required" name="operationcharge.departmentmajor"/>
</div>
</form>
保存的函数如下: 完成之后跳转页面
// 保存之后跳转
function submitAndForward(id, url) {
initWindowForm(id, function(){
window.location.href = url;
});
}
这里需要注意的是按钮的类型为submit,同时有onclick事件,所以会先触发click事件再进行submit。
7.验证数组是否有重复元素
对数字数组,字符串数组都有效。
function hasRepeatValue(a) {
return /(\x0f[^\x0f]+)\x0f[\s\S]*\1/.test("\x0f" + a.join("\x0f\x0f") + "\x0f");
}
8.JS提取身份证中的性别和出生日期信息
function getIdcardData(){
var ido=document.getElementById('idCardNumberHandle');//身份证号input元素的ID
var bd=document.getElementById('birthdayHandle');
var sex=document.getElementById('sexHandle');
if(!/^\d{6}((?:19|20)((?:\d{2}(?:0[13578]|1[02])(?:0[1-9]|[12]\d|3[01]))|(?:\d{2}(?:0[13456789]|1[012])(?:0[1-9]|[12]\d|30))|(?:\d{2}02(?:0[1-9]|1\d|2[0-8]))|(?:(?:0[48]|[2468][048]|[13579][26])0229)))\d{2}(\d)[xX\d]$/.test(ido.value)){
alert('身份证号非法.');
return;
}
bd.value=(RegExp.$1).substr(0,4)+'-'+(RegExp.$1).substr(4,2)+'-'+(RegExp.$1).substr(6,2);//设置出生日期
ex.value=(parseInt(ido.value.charAt(ido.value.length-2))%2==0?'女':'男');//设置性别
}
身份证号 倒数第二位是性别,奇数为男,偶数为女
9. JS格式化数字,保留指定位数或者按百分比格式化数字
var NumberUtils = {
toFixedDecimal : function(value, scale) {
var defaultValue = 0.0; if (!value || isNaN(parseFloat(value))) {
value = defaultValue;
} if (!scale) {
scale = 2;
} value = parseFloat(value);
return value.toFixed(scale);
}, toFixedDecimalWithPercent : function(value, scale) {
value = NumberUtils.toFixedDecimal(value, 10); if (!scale) {
scale = 2;
} value = parseFloat(value * 100);
return value.toFixed(scale) + "%";
}
};
测试代码:
console.log(NumberUtils.toFixedDecimal("1.526885"));
console.log(NumberUtils.toFixedDecimal(1.526885, 5));
console.log(NumberUtils.toFixedDecimalWithPercent(1.526885, 5));
结果:
10. 格式化相同name或class的checkbox值,有时候我们希望通过逗号连接多个值
function serializeCheckboxValuesByName(name, spliter) {
if (!spliter) {
spliter = ",";
} return getSerializeCheckboxValues("[name='"+name+"']:checked", spliter);
} function serializeCheckboxValuesByClass(clazz, spliter) {
if (!spliter) {
spliter = ",";
} return getSerializeCheckboxValues("." + clazz + ":checked", spliter);
} function getSerializeCheckboxValues(selector, spliter) {
var values = [];
$(selector).each(function() {
values.push($(this).val());
}); if (values.length > 0) {
return values.join(spliter);
} return "";
}
JS几个常用的工具函数的更多相关文章
- 【重温基础】JS中的常用高阶函数介绍
Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以 ...
- 常用的工具函数助力JavaScript高效开发
前言 日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率. 1.校验数据类型 export const typeOf = func ...
- js常用的工具函数
JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...
- js 常用的工具函数
1 类型判断 isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } i ...
- Javascript 常用的工具函数,更新中...
1.时间戳转为格式化时间 /** * 时间戳转为格式化时间 * @Author chenjun * @DateTime 2017-11-10 * @param {[date]} timestamp [ ...
- jquery相关常用的工具函数
1.弹出提示框: function prompt(msg){ $("<div>" + msg + "</div>").css({ &qu ...
- 从零开始学习jQuery (九) jQuery工具函数
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 我们经常要使用脚本处理各种业务逻辑, 最常见的就 ...
- vue项目中如何将工具函数模块化导出
如下所示,utils文件夹下的js里都是封装好的工具函数, 如formatDate.js内容如下: export default (day)=>{ var tmpDate = day ? new ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
随机推荐
- 有一个集合,判断集合里有没有“world”这个元素,如果有,添加“javaee”
// 有一个集合,判断集合里有没有“world”这个元素,如果有,添加“javaee” List list = new ArrayList(); list.add("world") ...
- Python2 获取docx/doc文件内容
整体思路: 下载文件并修改后缀为zip文件,解压zip文件,所要获取的内容在固定的文件夹下:work/temp/word/document.xml 所用包,全部是python自带,不需要额外下载安装. ...
- docker+mesos+marathon
前言 (Core) [root@docker-slave ~]# uname -r 3.10.0-229.4.2.el7.x86_64 [root@docker-slave ~]# uname -m ...
- form 表单提交类型
multipart/form-data与x-www-form-urlencoded区别 multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信 ...
- ADB抓取日志和日志过滤
建议抓取日志之前先清除缓存的log数据:adb logcat -c 网上有人介绍可以这样写:adb logcat -c && adb logcat 1.使用V.D.I.W.E.F.S优 ...
- postman 断言学习
请求 url :https://www.v2ex.com/api/nodes/show.json?name=python get请求 postman发起请求并做断言 断言: tests["B ...
- DataTable Excel 导出:
public static class CSVFileHelper { public static string ToHtmlTable(this DataTable target) { return ...
- 【SPOJ】QTREE7(Link-Cut Tree)
[SPOJ]QTREE7(Link-Cut Tree) 题面 洛谷 Vjudge 题解 和QTREE6的本质是一样的:维护同色联通块 那么,QTREE6同理,对于两种颜色分别维护一棵\(LCT\) 每 ...
- 表格隔行变色_CSS实现鼠标悬停高亮
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- centos 6.5 web service模式 系统 安装php
1 首先是坚持libxml2出问题,提示如下: checking for xml2-config path... /home/www/thirdlib/libxml2/bin/xml2-configc ...