Javascript常用方法

接口介绍

使用构造函数法定义一个接口模拟类,在内部用this关键字指代实例对象,使用prototype对象添加类的属性和方法。
原文链接:Caiqm的笔记

1. 新建api.js文件,同时定义一个接口模拟类,从第二步开始为添加类方法
/**
 * 接口模拟类
 * @constructor
 */
function Api() {
    this.appVersion = '1.0.1';
    this.description = 'js常用方法归类';
}
2. 简单输出信息
/**
 * 输出信息
 * @param arg 要输出的内容
 */
Api.prototype.console = function (arg) {
    console.log(arg);
};
3. 设置页面标题
/**
 * 设置页面标题
 * @param title 更换标题
 */
Api.prototype.setNavigationTitle = function (title) {
    let titleTag = document.getElementsByTagName('title')[0];
    titleTag.innerText = title;
};
4. 页面跳转
/**
 * 页面跳转
 * @param url 跳转的链接
 * @param time 跳转等待的时间
 */
Api.prototype.hrefTo = function (url, time) {
    if (time === 0) {
        window.location.href = url;
    } else {
        setTimeout("api.hrefTo('" + url + "', 0)", time);
    }
};
5. 土司弹框
/**
 * 土司弹框
 * @param msg 提示内容
 * @param duration 提示时间
 */
Api.prototype.toast = function (msg, duration) {
    // 检测是手机或者PC
    let sUserAgent = navigator.userAgent.toLowerCase();
    let bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
    let bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
    let bIsMidp = sUserAgent.match(/midp/i) == "midp";
    let bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
    let bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
    let bIsAndroid = sUserAgent.match(/android/i) == "android";
    let bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
    let bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
    let box = '';
    if (!(bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) ){
        box = {width: '60%', height: '35px', fontsize: '12px', padding: '0 10px'};
    } else {
        box = {width: '80%', height: '75px', fontsize: '35px', padding: '0 20px'};
    }
    duration = isNaN(duration) ? 1500 : duration;
    let m = document.createElement('div');
    let m_span = document.createElement('span');
    m.appendChild(m_span);
    m.style.cssText = "width: 100%;position: absolute;top: 60%;right: 0;bottom: 0;left: 0;margin: auto;";
    m_span.style.cssText = "max-width: "+box.width+";display: table;margin: 0 auto;padding: "+ box.padding +";box-sizing: border-box;opacity: 0.5;overflow: hidden;height: "+box.height+";color: rgb(255, 255, 255);line-height: "+box.height+";text-align: center;border-radius: 5px;z-index: 9999;background: rgb(0, 0, 0);font-size: "+box.fontsize+";";
    m_span.innerHTML = msg;
    document.body.appendChild(m);
    setTimeout(function() {
        let d = 0.5;
        m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
        m.style.opacity = '0';
        setTimeout(function() { document.body.removeChild(m) }, d * 1000);
    }, duration);
};
6. 对话框弹框
/**
 * 弹框
 * @param object 对象信息
 */
Api.prototype.dialog = function (object) {
    // 检测是手机或者PC
    let sUserAgent = navigator.userAgent.toLowerCase();
    let bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
    let bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
    let bIsMidp = sUserAgent.match(/midp/i) == "midp";
    let bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
    let bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
    let bIsAndroid = sUserAgent.match(/android/i) == "android";
    let bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
    let bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
    let box = '';
    if (!(bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) ){
        box = {width: '300px', height: '150px', fontsize: ''};
    } else {
        box = {width: '80%', height: '30%', fontsize: '40px'};
    }
    let cssText = "<style>.dv_dialog_box{\n" +
        "   top: 0;\n" +
        "   left: 0;\n" +
        "   width: 100%;\n" +
        "   height: 100%;\n" +
        "   z-index: 9999;\n" +
        "   position: fixed;\n" +
        "   background-color: rgba(0,0,0,0.6);\n" +
        "}\n" +
        ".dv_dialog{\n" +
        "   max-width: 80%;\n" +
        "   width: "+ box.width +";\n" +
        "   height: "+ box.height +";\n" +
        "   position: absolute;\n" +
        "   top: 0;\n" +
        "   left: 0;\n" +
        "   right: 0;\n" +
        "   bottom: 0;\n" +
        "   margin: auto;\n" +
        "   background-color: #fff;\n" +
        "   border-radius: 6px;\n" +
        "   font-size: "+ box.fontsize +";\n" +
        "   color: #333;\n" +
        "}\n" +
        ".dv_title{\n" +
        "   width: 100%;\n" +
        "   height: 25%;\n" +
        "   text-align: center;\n" +
        "   display: flex;\n" +
        "   justify-content: center;\n" +
        "   align-items: center;\n" +
        "}\n" +
        ".dv_content{\n" +
        "   width: 100%;\n" +
        "   min-height: 50%;\n" +
        "   text-align: center;\n" +
        "   padding: 5px;\n" +
        "   box-sizing: border-box;\n" +
        "   display: flex;\n" +
        "   justify-content: center;\n" +
        "   align-items: center;\n" +
        "   background-color: #fff;\n" +
        "}\n" +
        ".dv_btn{\n" +
        "   width: 100%;\n" +
        "   height: 24%;\n" +
        "   display: flex;\n" +
        "   border-top: 1px solid #ececec;\n" +
        "}\n" +
        ".dialog_btn{\n" +
        "   height: 100%;\n" +
        "   display: flex;\n" +
        "   border: 0;\n" +
        "   background-color: #fff;\n" +
        "   flex: 1;\n" +
        "   justify-content: center;\n" +
        "   border-bottom-left-radius: 6px;\n" +
        "   border-bottom-right-radius: 6px;\n" +
        "   font-size: "+ box.fontsize +";\n" +
        "   color: #333;\n" +
        "}" +
        ".dialog_btn:first-child{\n" +
        "   border-right: 1px solid #ececec;\n" +
        "}</style>\n";
    // 创建div
    let m = document.createElement('div');
    // 添加class名称
    m.classList.add("dv_dialog_box");
    let t = '<div class="dv_dialog">';
    t += '<div class="dv_title">'+ (object.title ? object.title : '提示') +'</div>';
    t += '<div class="dv_content">'+ (object.content ? object.content : '暂无数据') +'</div>';
    t += '<div class="dv_btn">';
    // 判断是否显示取消按钮
    if (object.showCancel && object.showCancel === true) {
        t += '<button class="dialog_btn">取消</button>';
    }
    t += '<button class="dialog_btn">确定</button>';
    t += '</div>';
    t += cssText;
    m.innerHTML = t;
    // 将弹框添加到body
    document.body.appendChild(m);
    // 获取按钮
    let dialogBtn = document.getElementsByClassName('dialog_btn');
    for (let i = 0; i < dialogBtn.length; i++) {
        dialogBtn[i].onclick = function () {
            // 清除掉弹框
            document.body.removeChild(m);
            // 确定按钮和取消按钮回调
            if (object.showCancel && object.showCancel === true && i == 1 && object.callback) {
                object.callback();
            } else if (object.showCancel && object.showCancel === true && i == 0 && object.cancelCallback) {
                object.cancelCallback();
            } else if (!object.showCancel && i == 0 && object.callback) {
                object.callback();
            }
        };
    }
};
7. 输出当前时间或者更换输入时间分割符
/**
 * 输出当前时间或者更换输入时间分割符
 * @param date 时间字符串
 * @param separate 日期分割符
 * @returns {string}
 */
Api.prototype.formatTime = function (date, separate) {
    // 时间判断
    if (date) {
        let dateSplit = date.split(/[^0-9]/);
        date = new Date(dateSplit[0], dateSplit[1] - 1, dateSplit[2], dateSplit[3], dateSplit[4], dateSplit[5]);
    } else {
        date = new Date();
    }
    // 日期分割符
    separate = separate ? separate : '/';
    const year = date.getFullYear();
    const month = date.getMonth() + 1;
    const day = date.getDate();
    const hour = date.getHours();
    const minute = date.getMinutes();
    const second = date.getSeconds();
    return [year, month, day].map(api.formatNumber).join(separate) + ' ' + [hour, minute, second].map(api.formatNumber).join(':');
};
8. 数字格式化,小于9补0
/**
 * 数字格式化,小于9补0
 * @param n 数字
 * @returns {any}
 */
Api.prototype.formatNumber = function (n) {
    n = n.toString();
    return n[1] ? n : '0' + n
};
9. 时间倒计时
/**
 * 倒计时
 * @param expireTime 结束日期字符串
 * @param marking 天数标识
 * @returns {*}
 */
Api.prototype.countDown = function (expireTime, marking) {
    // 转换日期格式  
    let a = expireTime.split(/[^0-9]/);
    // 截止日期:日期转毫秒
    let expireMs = new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
    // 倒计时毫秒  
    let duringMs = expireMs.getTime() - (new Date()).getTime();
    // 渲染倒计时时钟  
    let duringDate = '';
    // 格式化日期,marking不存在显示“天时分秒”,否则显示“时分秒”
    if (!marking) {
        const days = api.formatNumber(parseInt(duringMs / 1000 / 60 / 60 / 24, 10)).toString(); //计算剩余的天数
        const hours = api.formatNumber(parseInt(duringMs / 1000 / 60 / 60 % 24, 10)).toString(); //计算剩余的小时
        const minutes = api.formatNumber(parseInt(duringMs / 1000 / 60 % 60, 10)).toString();//计算剩余的分钟
        const seconds = api.formatNumber(parseInt(duringMs / 1000 % 60, 10)).toString();//计算剩余的秒数
        duringDate = days + ":" + hours + ":" + minutes + ":" + seconds;
    } else {
        const hours = api.formatNumber(parseInt(duringMs / 1000 / 60 / 60, 10)).toString(); //计算剩余的小时
        const minutes = api.formatNumber(parseInt(duringMs / 1000 / 60 % 60, 10)).toString();//计算剩余的分钟
        const seconds = api.formatNumber(parseInt(duringMs / 1000 % 60, 10)).toString();//计算剩余的秒数
        duringDate = hours + ":" + minutes + ":" + seconds;
    }
    // 判断是否已经结束
    if (duringMs <= 0) {
        // timeout则跳出递归
        return '倒计时已完成';
    }
    // setTimeout(function () {
    //     // 放在最后--
    //     api.countDown(expireTime);
    // }, 1000);
    return duringDate;
};
10. 验证手机号码
/**
 * 验证手机号码
 * @param phone 手机号码
 * @returns {boolean} 返回true|false
 */
Api.prototype.phoneVerify = function (phone) {
    let reg = /^[1][3,4,5,6,7,8][0-9]{9}$/;
    return reg.test(phone);
};
11. 验证邮箱
/**
 * 验证邮箱
 * @param email 邮箱地址
 * @returns {boolean}
 */
Api.prototype.emailVerify = function (email) {
    let reg = /^[a-z0-9][a-z\.0-9-_]+@[a-z0-9_-]+(?:\.[a-z]{0,3}\.[a-z]{0,2}|\.[a-z]{0,3}|\.[a-z]{0,2})$/i;
    return reg.test(email);
};
12. 验证身份证
/**
 * 验证身份证
 * @param idcard 身份证号码
 * @returns {boolean}
 */
Api.prototype.idcardVerify = function (idcard) {
    let reg = /(^d{15}$)|(^d{17}([0-9]|X|x)$)/;
    return reg.test(idcard);
};
13. 验证中文
/**
 * 验证中文
 * @param chinese
 * @returns {boolean}
 */
Api.prototype.chineseVerify = function (chinese) {
    let reg = /[u4e00-u9fa5]/;
    return reg.test(chinese);
};
14. 添加新数组数据到旧数组
/**
 * 添加新数据到旧数组
 * @param orgArr 旧数组
 * @param addFile 新数组
 * @returns {*}
 */
Api.prototype.addNewToArr = function (orgArr, addFile) {
    if (!addFile) {
        return orgArr;
    }
    for (let i = 0; i < addFile.length; i++) {
        orgArr.push(addFile[i]);
    }
    return orgArr;
};
15. 检测参数是否为空
/**
 * 检测参数是否为空
 * @param checkObj 检测对象内容
 * @param showWord 提示文字
 * @param isTip 提示方式
 * @returns {boolean}
 */
Api.prototype.checkIsNull = function (checkObj, showWord, isTip) {
    if (!checkObj) {
        if (!isTip) {
            api.dialog({ content: showWord });
        } else {
            api.toast(showWord);
        }
        return false;
    }
    return true;
};
16. 获取对象、数组的长度、元素长度个数
/**
 * 获取对象、数组的长度、元素长度个数
 * @param obj 要计算长度的元素,可以为object、array、string
 * @returns {*}
 */
Api.prototype.getLength = function (obj) {
    let objType = typeof obj;
    if(objType === "string"){
        return obj.length;
    }else if(objType === "object"){
        let objLen = 0;
        for (let i in obj) {
            objLen++;
        }
        return objLen;
    }
    return false;
};
17. 限制字符串长度(字节)
/**
 * 字节限制字符串长度
 * @param val 字符串
 * @param max 最长个数
 * @returns {string}
 */
Api.prototype.getByteVal = function (val, max) {
    let returnValue = '';
    let byteValLen = 0;
    for (let i = 0; i < val.length; i++) {
        if (val[i].match(/[^x00-xff]/ig) != null) {
            byteValLen += 2;
        } else {
            byteValLen += 1;
        }
        if (byteValLen > max) {
            break;
        }
        returnValue += val[i];
    }
    return returnValue;
};
18. 去除一维数组重复值
/**
 * 去除一维数组重复值
 * @param arr 去重数组
 * @returns {Array}
 */
Api.prototype.unique = function (arr) {
    let temp = [];
    for (let i = 0; i < arr.length; i++) {
        if (temp.indexOf(arr[i]) === -1) {
            temp.push(arr[i]);
        }
    }
    return temp;
};
19. 禁止移动端浏览器页面滚动
/**
 * 禁止移动端浏览器页面滚动
 */
Api.prototype.stopBrowseScroll = function () {
    document.addEventListener('touchmove', function(event) {
        event.preventDefault();
    });
};
20. 判断是否微信浏览器
/**
 * 判断是否微信浏览器
 * @returns {boolean}
 */
Api.prototype.isWeiXinClient = function () {
    let ua = navigator.userAgent.toLowerCase();
    return (ua.match(/MicroMessenger/i) == "micromessenger") ? true : false;
};
重要的一点是实例化类,不然调用不了定义的方法或属性
类实例化赋值
$api = api = new Api();
使用方法
<!DOCTYPE html>
<html>
<head>
    <title>标题</title>
    <meta charset="utf-8">
</head>
<body>
    <script type="text/javascript" src="js/api.js"></script>
    <script type="text/javascript">
        // 打印api版本号
        api.console(api.appVersion);
        // 设置title标题
        api.setNavigationTitle('我的js插件');
        // 土司弹框
        api.toast('我是土司我是土司我是土司', 99999);
        // 对话框
        api.dialog({content: '我的内容', showCancel: true });
    </script>
</body>
</html>

浏览器查看效果

目前归类的常用js方法有二十多种,可以放到一个.js文件进行使用。因为是通过原生javascript编辑,所以不需要引入JQuery文件,兼容PC和手机浏览器。

© 2018 All by Caiqm.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 路过漂浮星光的河流, 涉过黑暗的花与水。 戴着帽子的月亮, 你酩酊大醉。 夕阳啊夕阳, 地平线穿着红色裙装。 飘来...
    三势阅读 98评论 3 5
  • 迈入三十关卡的这几年,确实比二十多岁时要“珍爱生命”,时常想我是谁,我该怎么活,我现在该怎么做…并不是以前不想,以...
    江如意阅读 251评论 0 0
  • 01 “我能送你回家吗?可能外面要下雨了。”——《绅士》 QQ悄悄话盛行的时候,收到这样一句歌词,明明挺暖心的一句...
    果然然然然_阅读 407评论 4 2