web开发常用知识点个人收藏

工作中封装的js函数共享,拿去,不谢。

2017-03-10  本文已影响309人  虚幻的锈色

每个人工作中都会封装一些自己工作中常用的函数,鹏哥我也有一些,做了两年程序员,玩了两年前端开发,就这一点收藏,我也挺不好意思的(平时懒得整理,而且有的临时封装就用,不会放起来),不过就是少了点,平时用的不多,经常用到的就给封装了,至于效果组件就没封装。凑合拿去能用就用!别嫌弃。。。

【获取元素样式】

在工作中,我们经常会获取某一个DOM元素的样式信息,而且这个因为不兼容,所有就封装了一版。


//获取计算过后的样式***************************
/*function getStyle(obj,sName){
    if(obj.currentStyle){
        return obj.currentStyle[sName];
    }else{
        return getComputedStyle(obj,false)[sName];
    }
}*/
//获取计算过后的样式***************************
function getStyle(obj,sName){
    return (obj.currentStyle || getComputedStyle(obj,false))[sName]
}

【随机数】

平时工作中,我们经常会用到随机数啊,比如写随机展示的效果灯

//随机数*****************************************
function ran(n,m){
    return parseInt(Math.random()*(m-n)+n)
}

【数组找重复】

经常遇到操作数据,找重复,继续往下看,我也会说去重。

//找重复********************************************
function findInArr(n,arr){
    for(var i=0; i<arr.length; i++){
        if(arr[i]==n){
            //return arr[i]=n;
            return true;
        }
    }
    //return arr.push(n);
    return false;
}
//var arr=[1,2,3];
//alert(findInArr(5,arr));
//alert(arr);

【时间补零】

这个就经常经常遇到了,页面中我们经常会写时间,但是获取的js时间如果小于10,显示一位,为了美观所有需要补0.

//补零********************************************
function toDub(n){
    if(n<10){
        return '0'+n;
    }else{
        return ''+n;
    }
}

【通过class获取元素】

原生有这个方法,但是有兼容性问题,所有就给封装了一版,虽然不经常用,但是也会用到。

//getElementsByClassName**********************************
function getByClass(oParent,sClass){
    if(oParent.getElementsByClassName){
        return oParent.getElementsByClassName(sClass);
    }else{
        var aElement=oParent.getElementsByTagName('*');
        var arr=[];
        for(var i=0; i<aElement.length; i++){
            var aClass=aElement[i].className.split(' ');
            for(var j=0; j<aClass.length; j++){
                if(aClass[j]==sClass){
                    arr.push(aElement[i]);
                }
            }
        }
        return arr
    }
}

【获取物体绝对的位置】

这个就经常用了,比如图片延迟加载,比如获取一个DOM元素的位置,等等。

//绝对宽高*****************************************
function getPos(obj){
    var l=0;
    var t=0;

    while(obj){
        l+=obj.offsetLeft;
        t+=obj.offsetTop;
        obj=obj.offsetParent;
    }
    return {left:l,top:t}
}

【事件绑定】

这个就不用说了,工作中我们的事件都是要绑定的。

//添加事件***************************************
function addEvent(obj,sEv,fn){
    if(obj.addEventlistener){
        obj.addEventlistener(sEv,fn,false);
    }else{
        obj.attachEvent('on'+sEv,fn);
    }
}

【事件解绑】

这个也不用说,和上面那个一样。

//解除事件*****************************************
function removeEvent(obj,sEv,fn){
    if(obj.removeEventlistener){
        obj.removeEventlistener(sEv,fn,false);
    }else{
        obj.detachEvent('on'+sEv,fn);
    }
}

【添加滚轮事件】

这个偶尔会遇到,比如你写一个需要自己自定义一个滚动条的页面,就会用到。不过有插件,用这个也少。

//添加滚轮事件***************************************
function addWheel(obj,fn){
    if(navigator.userAgent.toLowerCase().indexOf('firefox')!=-1){
        obj.addEventListener('DOMMouseScroll',wheel,false);            //火狐
    }else{
        obj.onmousewheel=wheel;                                        //非火狐
    }
    function wheel(ev){
        var bDown=true;
        var oEvent=ev || event;
        if(oEvent.wheelDelta){
            if(oEvent.wheelDelta>0){
                bDown=false;
            }else{
                bDown=true;
            }
        }else{
            //火狐
            if(oEvent.detail>0){
                bDown=true;
            }else{
                bDown=false;
            }
        }
        fn&&fn(bDown);
        oEvent.preventDefault&&oEvent.preventDefault(); //阻止默认事件(事件绑定中的默认事件) 只能用在高级浏览器中
        return false;                //阻止默认事件
    }
}

【个人js运动框架引擎】

这个之前用到的非常非常多,之前没有用css3的时候就靠这个写效果,虽然有人说,鹏哥,不是有jq吗,那我会告诉你,一个小页面你会引库嘛。。不过目前有了css3运动,就不需要这个了。

//运动框架***************************************
function move(obj,json,option){
    var option=option || {};
    var duration=option.duration || 1000;
    var easing=option.easing || 'linear';
    var start={};  //寸初始值
    var dis={};//存总路程
    //json->{'width':300,'height':300,'opacity':0}
    //start->{width:100,height:100,opacity:1}
    //dis ->{width:200,height:200,opacity:1}
    for(var name in json){
        start[name]=parseFloat(getStyle(obj,name));
        //start['width']=100;
        dis[name]=json[name]-start[name];
        //dis['width']=200;
    }

    var count= Math.ceil(duration/30);   //总次数
    var n=0;  //循环需要统计的次数

    clearInterval(obj.timer);
    obj.timer=setInterval(function(){
        n++;
        for(var name in json){
            switch (easing){
                case 'linear':   //匀速
                    var a=n/count;
                    var cur=start[name]+dis[name]*a;
                    break;
                case 'ease-in':  // 加速
                    var a=n/count;
                    var cur=start[name]+dis[name]*a*a*a;
                    break;
                case 'ease-out':  //减速
                    var a=1-n/count;
                    var cur=start[name]+dis[name]*(1-a*a*a);
                    break
            }
            if(name=='opacity'){
                obj.style.opacity=cur;
            }else{
                obj.style[name]=cur+'px';
            }
        }

        if(n==count){
            clearInterval(obj.timer);
            option.complete && option.complete();
        }
    },30);
}

【DOM加载事件】

这个也用到的非常多,和window.onload有区别,这个加载仅仅是代码加载了就会执行。

//DOM事件**********************************************
function ready(fn){
    if(document.addEventListener){
        document.addEventListener('DOMContentLoaded',fn,false)
    }else{
        document.onreadystatechange=function(){
            if(document.readyState=='complete'){
                fn();
            }
        };
    }
}

【cookie使用】

这个就不用说了,之前用的非常多,每个页面基本都会有cookie的存在。不过目h5出现的两个离线存储基本把这个代替了。。。

//设置cookie*********************************************
function setCookie(sName,sValue,iDay){
    if(iDay){
        var oDate=new Date();
        oDate.setDate(oDate.getDate()+iDay);
        document.cookie=sName+'='+sValue+'; expires='+oDate+'; path=/';
    }else{
        document.cookie=sName+'='+sValue+'; path=/';
    }
}

//获取cookie**********************************************
function getCookie(sName){
    var str=document.cookie;
    var arr1=str.split('; ');
    for(var i=0; i<arr1.length; i++){
        var arr2=arr1[i].split('=');
        if(arr2[0]==sName){
            return arr2[1]
        }
    }
    return ''
}

//删除Cookie**********************************************
function removeCookie(sName){
    setCookie(sName,' ',-1);
}

【解析后台获取的数据json】

平时我们从后台获取的数据都是字符串,而且经常是字符串的json,解析有两种方法,性能不同,所以就给封装起来了。


//解析json*************************************************
function parseJson(str){
    try{
        return JSON.parse(str);
    }catch(e){
        return eval('('+str+')');
    }
}

【个人ajax交互封装】

重中之重。平时写页面交互效果的时候,经常用,虽然每一个库框架都会有这个,但是一些页面就是需要原生来写,所有用的非常多,给封装了起来。

//ajax*******************************************************
function ajax(json){    //url, data, type, timeout, success, error
    json=json || {};
    json.data=json.data || {};
    json.type=json.type || 'get';
    json.timeout=json.timeout || 0;

    var arr=[];
    for(var name in json.data){
        arr.push(name+'='+encodeURIComponent(json.data[name]))
    }
    var sData=arr.join('&');

    try{
        var oAjax=new XMLHttpRequest;
    }catch(e){
        var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    }

    if(json.type=='post'){
        oAjax.open('POST',json.url,true);
        oAjax.setRequestHeader('content-type','application/x-www-form-urlencoded');
        oAjax.send(sData);
    }else{
        oAjax.open('GET',json.url+'?'+sData,true);
        oAjax.send();
    }

    oAjax.onreadystatechange=function(){
        if(oAjax.readyState==4){
            clearTimeout(timer);
            if((oAjax.status>=200 && oAjax.status<300) || oAjax.status==304){
                json.success && json.success(oAjax.responseText);
            }else{
                json.error && json.error(oAjax.status);
            }
        }
    };

    if(json.timeout){
        var timer=setTimeout(function(){
            oAjax.abort();
        },json.timeout);
    }
}

【后台的时间戳转时间】

平时交互,从后台获取的时间是时间戳,而且是秒为单位。所有就写了一个转化的函数。

//时间戳转JS时间********************************************
function setTime(t){
  function toDou(n){
    return n<10?'0'+n:''+n;
  }
  var oDate=new Date();
  oDate.setTime(t*1000);

  return oDate.getFullYear()+'-'+(oDate.getMonth()+1)+'-'+oDate.getDate()+'  '+toDou(oDate.getHours())+':'+toDou(oDate.getMinutes())+':'+toDou(oDate.getSeconds());
}

【角度弧度转化】

这个也用的挺多的,比如css3,或者是canvas中都会用。

//角度转弧度********************************************
function d2a(n){
    //弧度 = π/180×角度
    return n*Math.PI/180;
}

//弧度转角度********************************************
function a2d(n){
    //角度 = 180/π×弧度
    return n*180/Math.PI;
}

【数组求最大最小数】

经常用,经常会从后台获取一组数据,但是我们要从中找出最大或者是最小的展示,所以鹏哥就给封装起来了。

//查找数组中的最大值********************************************
function findMax(arr){
    var iMax=arr[0];
    for(var i=0; i<arr.length; i++){
        if(arr[i]>iMax){
            iMax=arr[i];
        }
    }
    return iMax;
}

//查找数组中的最小值********************************************
function findMin(arr){
    var iMin=arr[0];
    for(var i=0; i<arr.length; i++){
        if(arr[i]<iMin){
            iMin=arr[i];
        }
    }
    return iMin;
}

【数组去重】

这个就不用说了,用处非常多,虽然数组去重有无数种方法,但是我还是喜欢这一种。

//数组去重*********************************************************
function remArr(arr){
    arr.sort();
    for(var i=0; i<arr.length; i++){
        if(arr[i]==arr[i+1]){
            arr.splice(i,1);
            i--;
        }
    }
    return arr;
}
附加小方法:数字取几位小数(这个是Number的方法,以防从数据库取到的是字符串型数字,所有转化一下数据类型)
Number(*).toFixed(取几位就放几 如 2)  

日期整理:利用字符串的replace替换功能+正则匹配 如 str ='20160920145530';
str.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/,'$1-$2-$3 $4:$5:$6')  => 2016-09-20 14:55:30 格式自己随便写,看情况

以上,结束,后期工作中封装的会继续上传,以后鹏哥也会把一些js效果的,以及组件给封装收藏好。陆续更新。

上一篇下一篇

猜你喜欢

热点阅读