项目中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="保存"/>
&nbsp;&nbsp;&nbsp;&nbsp;
<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');"/>
&nbsp;&nbsp;
<input type="submit" class="btn btn-info" value="保存" onclick="submitAndForward('addOperationForm', '/Exam/view/ownercharge/operation/listOperation.jsp')"/>
&nbsp;&nbsp;
<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几个常用的工具函数的更多相关文章

  1. 【重温基础】JS中的常用高阶函数介绍

    Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以 ...

  2. 常用的工具函数助力JavaScript高效开发

    前言 日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率. 1.校验数据类型 export const typeOf = func ...

  3. js常用的工具函数

    JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...

  4. js 常用的工具函数

    1 类型判断 isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } i ...

  5. Javascript 常用的工具函数,更新中...

    1.时间戳转为格式化时间 /** * 时间戳转为格式化时间 * @Author chenjun * @DateTime 2017-11-10 * @param {[date]} timestamp [ ...

  6. jquery相关常用的工具函数

    1.弹出提示框: function prompt(msg){ $("<div>" + msg + "</div>").css({ &qu ...

  7. 从零开始学习jQuery (九) jQuery工具函数

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 我们经常要使用脚本处理各种业务逻辑, 最常见的就 ...

  8. vue项目中如何将工具函数模块化导出

    如下所示,utils文件夹下的js里都是封装好的工具函数, 如formatDate.js内容如下: export default (day)=>{ var tmpDate = day ? new ...

  9. 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取

    爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...

随机推荐

  1. [LeetCode] Search in Rotated Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  2. lxs1314 is not in the sudoers file. This incident will be reported.

    虚拟机下面  普通用户用sudo执行命令时报"xxx is not in the sudoers file.This incident will be reported"错误,解决 ...

  3. BZOJ3712 PA2014Fiolki(kruskal重构树)

    对合并过程建树.然后只需要按照时间顺序考虑每个反应就行了,时间顺序根据lca的深度确定. #include<iostream> #include<cstdio> #includ ...

  4. CF398B Painting The Wall 概率期望

    题意:有一个 $n * n$ 的网格,其中 $m$ 个格子上涂了色.每次随机选择一个格子涂色,允许重复涂,求让网格每一行每一列都至少有一个格子涂了色的操作次数期望.题解:,,这种一般都要倒推才行.设$ ...

  5. javascript中的位运算,

    罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...

  6. 【线段树】【P2572】【SCOI2010】序列操作

    Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...

  7. MFC之ListCtrl动态添加按钮

    先上效果图: 图中用了一个CListCtrl插件,隐藏了网格线(LVS_EX_GRIDLINES). 添加了“删除”按钮(按钮上贴了图片),选中哪一行则显示在哪一行. 有两种方式创建按钮,一种是直接根 ...

  8. 2018南京ICPCMediocre String Problem 马拉车

    hash+二分求出最长公共前缀 然后马拉车+前缀和计数 #include <cstdio> #include <cstring> #include <queue> ...

  9. scp 从本地往线上传文件

    scp /home/wwwroot/default/tf_ment.sql root@IP:/home/wwwroot/default/

  10. P3620 [APIO/CTSC 2007]数据备份

    P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...