前端開發常用函數及小技巧(持續更新)

版權聲明:本文爲吳孔雲博客原創文章,轉載請註明出處並帶上鍊接,謝謝。 https://blog.csdn.net/wkyseo/article/details/51274460

日常項目用到的及網上收集而來

css樣式的百分比都相對於誰?

  • 相對於父元素寬度的: [max/min-]width、left、right、padding、margin 等;
  • 相對於父元素高度的: [max/min-]height、top、bottom 等;
  • 相對於繼承字號的: font-size 等;
  • 相對於自身字號的: line-height 等;
  • 相對於自身寬高的: border-radius、background-size、transform: translate()、transform-origin、zoom、clip-path 等;
  • 特殊算法的: background-position(方向長度 / 該方向除背景圖之外部分總長度 * 100)、
  • filter 系列函數等;

rem相關

html的樣式font-size可以根據javascript去計算,一般根據設計稿來寫原始尺寸,其次通過媒體查詢來設置縮放,所以通過相應設備尺寸去做media query設置也可以實現適配,

最常見的是html{font-size: 62.5%}, 因爲任何桌面瀏覽器的默認字體大小都是16px,這樣1rem = 10px。常見的響應式查詢,可參考網站m.dx.com

html {
    font-size : 20px;
}
@media only screen and (min-width: 401px){
    html {
        font-size: 25px !important;
    }
}
@media only screen and (min-width: 428px){
    html {
        font-size: 26.75px !important;
    }
}
@media only screen and (min-width: 481px){
    html {
        font-size: 30px !important; 
    }
}
@media only screen and (min-width: 569px){
    html {
        font-size: 35px !important; 
    }
}
@media only screen and (min-width: 641px){
    html {
        font-size: 40px !important; 
    }
}

javascript對象的深度克隆

//判斷是否是數組
function isArray(arr) {
    return Object.prototype.toString.call(arr).slice(8, -1) === 'Array';
}

function deepClone(obj) {
    if(typeof obj !== 'object' || typeof obj !== 'function') {
        return obj;
    }
    var o = isArray(obj) ? [] : {};
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            //遞歸調用
            o[i] = (typeof obj[i] === 'object') ? deepClone(obj[i]) : obj[i];
        }
    }
    return o;
}

原生方法實現jquery的extend方法

function extend(defaultObj, extendObj){
    var obj = {};
    for(var key in defaultObj) {
        if(defaultObj.hasOwnProperty(key)) {
            if(extendObj[key] === false || extendObj[key] === 0) {
                obj[key] = extendObj[key];
            }else{
                obj[key] = extendObj[key] || defaultObj[key];
            }
        }
    }
    return obj;
}

不定寬高的元素居中顯示

position:absolute;
left:50%;
top:50%;
-webkit-transform:translate(-50%,-50%);
transform:translate(-50%,-50%);

DOM獲取方法

//封裝了id,class,tagname所有方法
var get = {
    byId: function (id) {
        return document.getElementById(id)
    },
    byClass: function (sClass, oParent) {
        var aClass = [];
        var reClass = new RegExp("(^| )" + sClass + "( |$)");
        var aElem = this.byTagName("*", oParent);
        for (var i = 0; i < aElem.length; i++) {
        //此處邏輯與&&的判斷,當一個爲ture時,返回第二個對象
            reClass.test(aElem[i].className) && aClass.push(aElem[i]);
        }
        return aClass
    },
    byTagName: function (elem, obj) {
        return (obj || document).getElementsByTagName(elem)
    }
};

//類的獲取
function getByClass(oParent, sClass)
//oParent爲父節點DOM對象,sClass爲需要獲取的類
{
    var aEle = oParent.getElementsByTagName('*');
    var aResult = [];
    var re = new RegExp('\\b' + sClass + '\\b', 'i');
    var i = 0;
    for (i = 0; i < aEle.length; i++) {
        if (re.test(aEle[i].className)) {
            aResult.push(aEle[i]);
        }
    }
    return aResult;
    //此處返回的是一個數組DOM對象
}

編碼和解碼

var decToHex = function(str) {
    var res=[];
    for(var i=0;i < str.length;i++)
        res[i]=("00"+str.charCodeAt(i).toString(16)).slice(-4);
    return "\\u"+res.join("\\u");
}
var hexToDec = function(str) {
    str=str.replace(/\\/g,"%");
    return decodeURI(str);
}

window onload 實現多次監聽

function addloadEvent(func){
    var oldonload=window.onload;
    if(typeof window.onload !='function'){
        window.onload=func;
    }
    else{
        window.onload=function(){
            oldonload();
            func();
        }
    }
}

insertAfter

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

重複字符串

//利用array的join方法,創建指定長度的空數組,用str來拼接數組,不會改變原有數組
function repeatstr(str,n){
    return new Array(n+1).join(str);
}
console.log(repeatstr('hi',3));

獲取url?後面的參數值

 //方法一:正則法 
    function getQueryString(name) {
        var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
        var r = window.location.search.substr(1).match(reg);
        if (r != null) {
            return unescape(r[2]);
        }
        return null;
    }
    // 這樣調用:
    alert(GetQueryString("參數名1"));
    alert(GetQueryString("參數名2"));
    alert(GetQueryString("參數名3"));

//方法二:split拆分法
    function GetRequest() {
        var url = location.search; //獲取url中"?"符後的字串
        var theRequest = new Object();
        if (url.indexOf("?") != -1) {
            var str = url.substr(1);
            strs = str.split("&");
            for(var i = 0; i < strs.length; i ++) {
                theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
            }
        }
        return theRequest;
    }
    var Request = new Object();
    Request = GetRequest();
    // var 參數1,參數2,參數3,參數N;
    // 參數1 = Request['參數1'];
    // 參數2 = Request['參數2'];
    // 參數3 = Request['參數3'];
    // 參數N = Request['參數N'];

js實現類似於add(1)(2)(3)調用方式的方法

function add(x) {
    var sum = x;
    var tmp = function (y) {
        sum = sum + y;
        return tmp;
    };
    tmp.toString = function () {
        return sum;
    };
    return tmp;
}
console.log(add(1)(2)(3));  //6
console.log(add(1)(2)(3)(4));   //10
/*首先要一個數記住每次的計算值,所以使用了閉包,在tmp中記住了x的值,第一次調用add(),初始化了tmp,並將x保存在tmp的作用鏈中,然後返回tmp保證了第二次調用的是tmp函數,後面的計算都是在調用tmp, 因爲tmp也是返回的自己,保證了第二次之後的調用也是調用tmp,而在tmp中將傳入的參數與保存在作用鏈中x相加並付給sum,這樣就保證了計算*/

/*但是在計算完成後還是返回了tmp這個函數,這樣就獲取不到計算的結果了,我們需要的結果是一個計算的數字那麼怎麼辦呢,首先要知道JavaScript中,打印和相加計算,會分別調用toString或valueOf函數,所以我們重寫tmp的toString和valueOf方法,返回sum的值*/

檢測對象{}是否爲空對象

/* 
 * 檢測對象是否是空對象(不包含任何可讀屬性)。 //如你上面的那個對象就是不含任何可讀屬性
 * 方法只既檢測對象本身的屬性,不檢測從原型繼承的屬性。 
 */
function isOwnEmpty(obj) 
{ 
    for(var name in obj) 
    { 
        if(obj.hasOwnProperty(name)) 
        { 
            return false; 
        } 
    } 
    return true; 
}; 

/* 
 * 檢測對象是否是空對象(不包含任何可讀屬性)。 
 * 方法既檢測對象本身的屬性,也檢測從原型繼承的屬性(因此沒有使hasOwnProperty)。 
 */
function isEmpty(obj) 
{ 
    for (var name in obj)  
    { 
        return false; 
    } 
    return true; 
}; 

判斷某個數組中是否包含另一個數組

//是否被包含,是返回true,不是返回false
function isContained(a, b){
            if(!(a instanceof Array) || !(b instanceof Array)) return false;
            if(a.length < b.length) return false;
            //把數組轉成字符串,通過indexOf來判斷
            var aStr = a.toString();
            console.info(aStr);
            for(var i = 0, len = b.length; i < len; i++){
                console.info(aStr.indexOf(b[i]));
                if(aStr.indexOf(b[i]) == -1) return false;
            }
            return true;
        }
        //例子
        (function(){
            var a = [1,2,3,4,5];
            var b = [1,4,3,2];
            var c = [1,6];
            alert(isContained(a,b));//true
            alert(isContained(a,c));//false
        })()

異步加載的JS如何在chrome瀏覽器斷點調試

  • 方案一: 在js文件代碼的頭部或者尾部加上“//@ sourceURL=test.js”,其中test.js是文件名,然後在(sources面板的no domain)裏面找到它進行調試。
  • 方案二: 把$.getScript這種異步的方式換成創建script標籤同步加載的方式。

css樣式表important優先級大於內聯style設置的樣式的解決辦法

提高內聯樣式style的優先級也需要增加important或者用js設置對象樣式增加important屬性,這樣才能覆蓋樣式表中的樣式

<style>
.c{color:Red !important}
</style>
<div class="c" style="color:#000000 !important">內聯樣式也增加important,這裏就顯示黑色的了,而不是紅色</div>

通過腳本設置,需要注意的是不能直接設置obj.style.color=’#000000 !important’,而是設置obj.style.cssText=’color:#000000 !important’

數組排序按照字母在數字前面

function arrSort(a, b){
                if (/^\d/.test(a) ^ /^\D/.test(b)) {
                    return a>b?1:(a==b?0:-1);
                }else{
                    return a>b?-1:(a==b?0:1);
                }

            }
            var pyArray=["a","d","fa","5","t","fw2","a31","b","e","2fs","4","0"];
            pyArray.sort(arrSort)
            //["a", "a31", "b", "d", "e", "fa", "fw2", "t", "0", "2fs", "4", "5"]

簡單的單例模式

類只會被實例化一次

var Singleton = function(fn) {
 var result;
 return function() {
  return result || (result = fn());
 };
};
var CreateMask = Singleton(function() {
 var __mask = document.createElement('div');
 __mask.className = 'mask';
 //...
 return document.body.appendChild(__mask);
});
var mask = new CreateMask();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章