总结js常用函数和常用技巧

学习过程中总结的干货,包括常用函数、常用js技巧、常用正则表达式等。

Ajax封装

var Ajax = function(url,type,success,error){
    $.ajax({
        url: url,
        type: type,
        dataType: 'json',
        timeout: 10000,
        success: function(d){
            var data = d.data;
            success && success(data);
        },
        error: function(e){
            error && error(e)
        }
    })
}

使用方法:

Ajax('/data.json','get',function(data){
    console.log(data)
})

后台响应Ajax

var xhr = new XMLHttpRequest();
xhr.open('get/post',url,true)
xhr.onreadystatechange = function(){
    if(xjr.readyState == 4 && xhr.status == 200){
        alert()
    }
}
xhr.send()

Jsonp封装

有时候我们为了跨域,要使用jsonp的方法,我也封装了一个函数:

function jsonp(config) {
    var options = config || {};   // 需要配置url, success, time, fail四个属性
    var callbackName = ('jsonp_' + Math.random()).replace(".", "");
    var oHead = document.getElementsByTagName('head')[0];
    var oScript = document.createElement('script');
    oHead.appendChild(oScript);
    window[callbackName] = function(json) {  //创建jsonp回调函数
        oHead.removeChild(oScript);
        clearTimeout(oScript.timer);
        window[callbackName] = null;
        options.success && options.success(json);   //先删除script标签,实际上执行的是success函数
    };
    oScript.src = options.url + '?' + callbackName;    //发送请求
    if (options.time) {  //设置超时处理
        oScript.timer = setTimeout(function () {
            window[callbackName] = null;
            oHead.removeChild(oScript);
            options.fail && options.fail({ message: "超时" });
        }, options.time);
    }
};

使用方法:

jsonp({
    url: '/b.com/b.json',
    success: function(d){
        //数据处理
    },
    time: 5000,
    fail: function(){
        //错误处理
    }       
});

正则表达式

1. 电话号码验证

var validate = function(num){
    var exp = /^1[3|4|5|7|8]\d{9}$/;
    return exp.test(num)
}
b244cdc6d17075c271a2d1b6b7cf737.png

2. 身份证验证

var validate = function(num){
    var exp = /^320925\d{12} | [1-9]{1}[0-9]{16}([0-9]|[xX])$/;
    return exp.test(num)
}
027e61762a5b6dd2d7eb4e8a548d6ae.png

3. IP地址验证

var validate = function(num){
    var exp = /^((0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1})\.){3}(0|1[0-9]{0,2}|2[0-9]{0,1}|2[0-4][0-9]|25[0-5]|[3-9][0-9]{0,1})(?(\/)\/([0-9]|[1-2][0-9]|3[0-2])|)$/;
    return exp.test(num)
}

常用函数

1. 检测重复

var isRepeat = function(arr){
    var hash = {};
    for(var key in arr){
        if(hash[arr[key]])
            return true;
            hash[arr[key]] = true;
        }
    return false
    }
代码说明:创建一个空的对象,for循环时,每次取出一个元素与对象对比,如果这个对象重复,则return true,再将这个元素赋值为true;如果不重复,则返回false。运用这个方法可以拓展出数组去重。

2. 数组去重

var unique = function(arr){
    var a = [],
    b = {};
    for(var i = 0, len=arr.length; i<len;i++){
        if(!b[arr[i]]) {                                    
            b[arr[i]] = 1;         
            a.push(arr[i])         
        }                           
    }
    return a;
}
数组去重.PNG
代码说明:for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。

3. 数组排列

var arr = [1, 5, 6, 3];    //数字数组
arr.sort(function(a, b) {
    return a - b;   //从小到大排
    return b - a;   //从大到小排
    return Math.random() - 0.5;   //数组洗牌
});
代码说明:Array的排序法则是:a > b则是升序;a < b则是降序。随机排列的方式是返回的随机数在-0.5~0.5之间,只有负数,正数或者0,从而进行了随机排列。

4.回到顶部

$(window).scroll(function(){
    var a = $(window).scrollTop();
    if (a>100){
        $('.go-top').fadeIn();
    }else{
        $('.go-top').fadeOut();
    }
});

$(".go-top").click(function(){
    $("html,body").animate({scrollTop: "0px"},'600');
});

5.数组深拷贝

数组深拷贝一共有3种方法:

1. 运用slice:

var arr = array.slice(start,[end])

参数:
  1. array 必选项。一个 Array 对象。
  2. start 必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
  3. end可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明:
  1. slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。slice 方法一直复制到 end 所指定的元素,但是不包括该元素。
  2. 如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。
  3. 如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。
  4. 如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。
  5. 如果 end 出现在 start 之前,不复制任何元素到新数组中。

2. 使用concat,创建一个副本,产生新的数组,不会对根目录产生影响。

var arr1 = [1,2,3];
var arr2 = arr1.concat();
拓展:concat()函数为拼接俩个字符或者数组函数

例1:拼接俩个数组

var arr1 = [1,2,3,4,5]
var arr2 = [7,8,9,10]
var a = arr1.concat(arr2)
微信截图_20170811163343.png

例2:拼接多个数组

var arr1 = [1,2,3,4,5]
var arr2 = [7,8,9,10]
var arr3 = [11,12,13,15]
var a = arr1.concat(arr2,arr3)
微信截图_20170811163522.png

6.随机数

1. 从min到max之间的随机整数,包括min不包括max
function radom(min,max){
    return Math.floor(Math.random()*(max-min)) + min
}
2. 从min都max之间的随机整数,包括min包括max
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

7.替换函数

var replaceAll = function(bigStr,str1,str2){   //将bigstr中的str1全部替换成str2
    var reg = new RegExp(str1, 'gm');
    return bigStr.replace(reg,str2);
}
代码说明:

首先创建一个正则表达式,将寻找替换的规则写好,再运用replace根据正则表达式进行替换

8. 通用事件监听函数

markyun.Event={  
    //页面加载完成后  
    readyEvent:function(fn){  
        if(fn==null){  
            fn=document;  
        }  
        var oldonload=window.onload;  
        if(typeof window.onload!='function'){  
            window.onload=fn;  
        }else{  
            window.onload=function(){  
                oldonload();  
                fn();  
            };  
        }  
    },  
    //添加事件  
    addEvent:function(element,type,handle){  
        if(element.addEventListener){  
            //事件类型、需要执行的函数、是否捕捉  
            element.addEventListener(type,handle,false);  
        }else if(element.attachEvent){  
            element.attachEvent('on'+type,function(){  
                handler.call(element);  
            });  
        }else{  
            element['on'+type]=handler;  
        }  
    },  
    //移除事件  
    removeEvent:function(element,type,handler){  
        if(element.removeEventListener){  
            element.removeEventListener(type,handler,false);  
        }else if(element.detachEvent){  
            element.detachEvent('on'+type,handler);  
        }else{  
            element['on'+type]=null;  
        }  
    },  
    //阻止事件  
    stopPropagation:function(ev){  
        if(ev.stopPropagation){  
            ev.stopPropagation();  
        }else{  
            ev.cancleBubble=true;  
        }  
    },  
    //取消事件的默认行为  
    preventDefault:function(event){  
        if(event.preventDefault){  
            event.preventDefault();  
        }else{  
            event.returnValue=false;  
        }  
    },  
    //获取事件目标  
    getTarget:function(event){  
        return event.target || event.srcElement;  
    },  
    //获取event对象的引用,取到事件的所有信息,确保随时能够使用event;  
    getEvent:function(e){  
        var ev=e || window.event;  
        if(!ev){  
            var c=this.getEvent.caller;  
            while(c){  
                ev=c.arguments[0];  
                if(ev && Event==ev.constructor){  
                    break;  
                }  
                c=c.caller;  
            }  
        }  
        return ev;  
    }  
};  

结语: 如果你们有什么值得推荐的js技巧,欢迎在评论中补充,我可以收纳在本文中。

蒋恒 2017.08.11

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

推荐阅读更多精彩内容

  • PHP常用函数大全 usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解...
    上街买菜丶迷倒老太阅读 1,341评论 0 20
  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 1,979评论 1 24
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,191评论 0 4
  • 1,士子 华山畿到南阳,不远不近的距离, 我四处游山玩水,一路而来, 在此,我终于知道这一切的缘由。 不是一时兴起...
    释迦干屎橛阅读 752评论 0 1
  • 我一直觉得我见过的姑娘太少了,少到无法用标签进行划分。如果老天发点善心,让我见一百位姑娘,我有把握把她们分为热情泼...
    爱睡觉的邓公子阅读 522评论 5 5