前端开发工作中常用的JavaScript片段

前端开发过程中总是会发现有些JS片段需要被经常使用,今天就来总结一下工作中常用到的一些JS片段,如果你经常使用jQuery库有可能很多片段用不到,但是我还是提倡大家使用原生JS,毕竟这才是根本,很多库文件的源码也是这么写的

目录

常用兼容方法(IE8+)

insertAfter()

function insertAfter(newElement, targetElement) {
    var parent = targetElement.parentNode;
    if (parent.lastChild == targetElement) {
        parent.appendChild(newElement);
    } else {
        parent.insertBefore(newElement, targetElement.nextSibling);
    }
}

getElementByClassName()

这个方法比较少用,IE8+已支持querySelector()和querySelectorAll()
function getElementsByClassName(element, names) {
    if (element.getElementsByClassName) {
        return element.getElementsByClassName(names);
    } else {
        var elements = element.getElementsByTagName('*');
        var result = [],
            element,
            classNameStr,
            flag;
        names = names.split(' ');
        for (var i = 0; element = elements[i]; i++) {
            classNameStr = ' ' + element.className + ' ';
            flag = true;
            for (var j = 0, name; name = names[j]; j++) {
                if (classNameStr.indexOf(' ' + name + ' ') == -1) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                result.push(element);
            }
        }
        return result;
    }
}

trim()

if (!String.prototype.trim) {
    String.prototype.trim = function () {
      return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
    };
}

EventUtil

var EventUtil = {
    //添加事件
    addHandler: function(element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false); //使用DOM2级方法添加事件
        } else if (element.attachEvent) { //使用IE方法添加事件
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler; //使用DOM0级方法添加事件
        }
    },
    //取消事件
    removeHandler: 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;
        }
    },
    //使用这个方法跨浏览器取得event对象
    getEvent: function(event) {
        return event ? event : window.event;
    },
    //返回事件的实际目标
    getTarget: function(event) { 
        return event.target || event.srcElement;
    },
    //阻止事件的默认行为
    preventDefault: function(event) { 
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },
    //阻止事件冒泡
    stopPropagation: function(event) { 
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    },
    //获取mouseover和mouseout相关元素
    getRelatedTarget: function(event) { 
        if (event.relatedTarget) {
            return event.relatedTarget;
        } else if (event.toElement) {
            return event.toElement;
        } else if (event.formElement) {
            return event.formElement;
        } else {
            return null;
        }
    },
    //获取mousedown或mouseup按下或释放的按钮是鼠标中的哪一个
    getButton: function(event) { 
        if (document.implementation.hasFeature("MouseEvents", "2.0")) {
            return event.button;
        } else {
            switch (event.button) { //将IE模型下的button属性映射为DOM模型下的button属性
                case 0:
                case 1:
                case 3:
                case 5:
                case 7:
                    return 0; //按下的是鼠标主按钮(一般是左键)
                case 2:
                case 6:
                    return 2; //按下的是中间的鼠标按钮
                case 4:
                    return 1; //鼠标次按钮(一般是右键)
            }
        }
    },
    //获取表示鼠标滚轮滚动方向的数值
    getWheelDelta: function(event) { 
        if (event.wheelDelta) {
            return event.wheelDelta;
        } else {
            return -event.detail * 40;
        }
    },
    //以跨浏览器取得相同的字符编码,需在keypress事件中使用
    getCharCode: function(event) { 
        if (typeof event.charCode == "number") {
            return event.charCode;
        } else {
            return event.keyCode;
        }
    }
};

常用工具类

移动端和PC端网址自动切换

var system = { 
    win: false, 
    mac: false, 
    xll: false, 
    ipad:false 
}; 
var p = navigator.platform; 
system.win = p.indexOf("Win") == 0; 
system.mac = p.indexOf("Mac") == 0; 
system.x11 = (p == "X11") || (p.indexOf("Linux") == 0); 
system.ipad = (navigator.userAgent.match(/iPad/i) != null)?true:false; 
if (system.win || system.mac || system.xll||system.ipad) { 
    window.location.href = "http://www.baidu.com/"; 
} else { 
    window.location.href = "http://wap.baidu.com/"; 
}

常用正则表达式

虽然这里列出了常用的正则表达式,但是还是建议各位看官在用的时候多加考虑一下是否适合你的项目
//验证邮箱
//验证规则:姑且把邮箱地址分成“第一部分@第二部分”这样
//第一部分:由字母、数字、下划线、中划线、点号组成,
//第二部分:为一个域名,域名由字母、数字、中划线、根域名组成,而根域名一般为.xx或.xxx
/^[A-Za-z0-9]+([\-\_\.][A-Za-z0-9])*@[A-Za-z0-9]+([\-\.][A-Za-z0-9]+)*\.[A-Za-z]{2,3}$/;

//验证固定电话(区号+号码 010-88888888,0955-7777777 )
//验证规则:区号以0开头后面2~3位是数字,区号与号码之间可以无连接符,也可以“-”连接,后面的号码由7~8位数字组成,
/^0\d{2,3}-?\d{7,8}$/

//验证手机号
//验证规则:首位以数字1开头,第二位数字目前包括3,4,5,7,8,剩下的是9位数字
/^1[3|4|5|7|8]\d{9}$/
//验证规则:11位数字,以1开头。
/^1\d{10}$/
//考虑到第二位可能会出现新的数字,建议使用第二种方式  

//验证QQ
//验证规则:首位不以数字0开头,剩下的4~9位是数字
/^[1-9]\d{4,9}$/

//验证身份证号码 这里是非严格验证
//验证规则:这里分为18为纯数字的身份证号和17位数字加字母X或x的两种情况
/(^\d{18}$)|(^\d{17}(\d|X|x)$)/

//验证URL
/^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

//匹配字母、数字、中文字符
/^([A-Za-z0-9]|[\u4e00-\u9fa5])*$/

//匹配中文字符的正则表达式
/[\u4e00-\u9fa5]/

//匹配双字节字符(包括汉字在内)
/[^\x00-\xff]/

//密码强度正则
//最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;

获取DOM元素的实际样式

function getStyle(element, cssPropertyName) {
    if (window.getComputedStyle) {
        return window.getComputedStyle(element)[cssPropertyName];
    } else {
        return element.currentStyle[cssPropertyName];
    }
}

日期格式化

function add0(t){return t = t < 10 ? '0'+ t : t}
function format(time){
    var y = time.getFullYear(),
    m = time.getMonth() + 1,
    d = time.getDate(),
    hh = time.getHours(),
    mm = time.getMinutes(),
    ss = time.getSeconds();
    return y+"-"+add0(m)+"-"+add0(d)+" "+add0(hh)+":"+add0(mm)+":"+add0(ss);
}

将url中参数以对象的形式输出

function parseQueryString(url){
    var str=url.split("?")[1];
    var items=str.split("&");
    var result={};
    var arr=[];
    for(var i=0; i<items.length; i++){
        arr=items[i].split('=');
        result[arr[0]]=arr[1];
    }
    return result;
}

将cookie中内容以对象形似输出

/**
 * 获取cookie并以对象形式输出
 * @return {name:value}
 */
function getCookie() {
    var cookie = {};
    var all = document.cookie;
    if (all === "") return cookie;
    var list = all.split(";");
    for (var i = 0; i < list.length; i++) {
        var item = list[i];
        var p = item.indexOf("=");
        var name = item.substring(0, p);
        name = decodeURIComponent(name);
        var value = item.substring(p + 1);
        value = decodeURIComponent(value);
        cookie[name] = value;
    }
    return cookie;
}

设置Cookie

/**
 * 设置cookie
 * @param {[type]} name    [设置的cookie名称]
 * @param {[type]} value   [设置的cookie值]
 * @param {[type]} expires [设置的cookie的过期时间]
 * @param {[type]} path    [设置的cookie的路径]
 * @param {[type]} domain  [设置的cookie关联的域名]
 * @param {[type]} secure  [设置的cookie是否使用安全协议传输数据,默认为空]
 */
function setCookie(name, value, expires, path, domain, secure) {
    var cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
    if (expires)
        cookie += "; expires=" + expires.toGMTString();
    if (path)
        cookie += "; path=" + path;
    if (domain)
        cookie += "; domain=" + domain;
    if (secure)
        cookie += "; secure=" + secure;
    document.cookie = cookie;
}

浏览器类型及IE浏览器版本检测

function browserType() {
    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串  
    var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器  
    var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器  
    var isEdge = userAgent.indexOf("Windows NT 6.1; Trident/7.0;") > -1 && !isIE; //判断是否IE的Edge浏览器  
    var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器  
    var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器  
    var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器  

    if (isIE) {
        var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
        reIE.test(userAgent);
        var fIEVersion = parseFloat(RegExp["$1"]);
        if (fIEVersion == 7) {
            console.log("this is IE7");
            return false;
        }
        else if (fIEVersion == 8) {
            console.log("this is IE8");
            return false;
        }
        else if (fIEVersion == 9) {
            console.log("this is IE9");
            return false;
        }
        else if (fIEVersion == 10) {
            console.log("this is IE10");
            return false;
        }
        else if (fIEVersion == 11) {
            console.log("this is IE11");
            return false;
        }
        else {
            console.log("IE版本过低");
            return false;
        }
    }
    if (isFF) {
        console.log("this is firefox");
        return false;
    }
    if (isOpera) {
        console.log("this is opera");
        return false;
    }
    if (isSafari) {
        console.log("this is safari");
        return false;
    }
    if (isChrome) {
        console.log("this is chrome");
        return false;
    }
    if (isEdge) {
        console.log("this is edge");
        return false;
    }
}

简单特效类

返回页面顶部

$(window).scroll(function() {
    if($(window).scrollTop() > $(window).height() / 2) {
        $("#toTop").show(500);
    }else{
        $("#toTop").hide(500);
    }
})
$("#toTop").click(function() {
    $("html,body").animate({
        scrollTop: 0
    }, 500);
});