(至關於封裝一個util兼容主流瀏覽器和IE)css
var EventUtil = { //根據狀況分別使用dom2 || IE || dom0方式 來添加事件 addHandler: function(element,type,handler) { if(element.addEventListener) { element.addEventListener(type,handler,false); } else if(element.attachEvent) { element.attachEvent("on" + type,handler); } else { element["on" + type] = handler; } }, //根據狀況分別獲取DOM或者IE中的事件對象,事件目標,阻止事件的默認行爲 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; } } //根據狀況分別使用dom2 || IE || dom0方式 來刪除事件 removeHandler: function(element,type,handler){ if(element.removeHandler) { element.removeEventListener(type,handler,false); } else if(element.detachEvent) { element.detachEvent("on" + type,handler); } else { element["on" + type] = null; } } //根據狀況分別取消DOM或者IE中事件冒泡 stopPropagation: function(event) { if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; } } } var btn = document.getElementById("myBtn"), handler = function () { alert("Clicked"); }; EventUtil.addHandler(btn,"click",handler); EventUtil.removeHandler(btn,"click",handler);
http://developer.51cto.com/ar...前端
function format (num) { var reg=/\d{1,3}(?=(\d{3})+$)/g; return (num + '').replace(reg, '$&,'); } `` function format(num){ num=num+'';//數字轉字符串 var str="";//字符串累加 for(var i=num.length- 1,j=1;i>=0;i--,j++){ if(j%3==0 && i!=0){//每隔三位加逗號,過濾正好在第一個數字的狀況 str+=num[i]+",";//加千分位逗號 continue; } str+=num[i];//倒着累加數字 } return str.split('').reverse().join("");//字符串=>數組=>反轉=>字符串 } 發現一個更好的方法補充一下
let arr = []; function three(num){ if(num<1){ return num } arr.unshift(parseInt(num%1000)) three(num/1000); } three(1234567) console.log(arr.join(','))
function getByte(str){ var len = str.length, bytes = len, i = 0; for(; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; }
function clone(obj) { if (!obj && typeof obj !== 'object') { return; } var copy = (obj instanceof Array)?[]:{}; for(var o in obj) { if (typeof obj[o] === 'object') { copy[o] = clone(obj[o]); } else { copy[o] = obj[o]; } } return copy; } var obj = { name: 'zhangsan', age: 33, child:{ name:'zhangxiao', age:9, eat:[1,{el:2}] }, hobby:undefined, eat:[1,2,3,4] } var a=clone(obj) obj.child.name = 'lis'; console.log(a);
function say() { var num = 888; var sayAlert = function() { alert(num); } num++; return sayAlert; } var sayAlert = say(); sayAlert();//889
剛調用say()函數的時候sayAlert不會執行,由於沒有啊sayAlert()這樣調用ios
if (!Array.prototype.forEach) { Array.prototype.forEach = function(fn){ for ( var i = 0; i < this.length; i++ ) { fn( this[i], i, this ); } }; }
function getStyle(obj, attr){ if(obj.currentStyle) { obj.currentStyle[attr] } else { getComputedStyle(obj, null)[attr]; } }
<script> var arr = [1,1,1,4,5,4]; var obj = {}; for(var ar in arr){ if(obj[arr[ar]]){ obj[arr[ar]]++; } else { obj[arr[ar]] = 1; } } console.log(obj); 1.//獲取出現最多的元素 次數 var res = []; for(var o in obj) { res.push({el: o,val:obj[o]}); } res.sort(function(a,b){ return -(a.val-b.val); }) console.log(res[0]) 2. let maxone = 0; for(var o in obj){ if(obj[o]>maxone){ maxone = obj[o] } } console.log(maxone) </script>
/*axios
apply call bind this 變幻無窮 都是改變this的智享 前二者:至關於返回是當即執行函數 fn.call(obj) 至關於obj的prototype上面有一個 fn()函數 obj就能順着原型鏈網上找 this指向obj bind:返回的是一個函數不會當即執行 */ var a = 1; var obj = { a:2, fn:function(){ console.log(this.a) } } obj.fn.call(obj) //2 var fn2=obj.fn.bind(obj) var fn3 = obj.fn.bind() console.log(fn2) //fn(){console.log(this.a)} fn2() //2 fn3() //1
let aa = document.getElementById('aa') for(var i=0;i<5;i++){ (function(i){ let el_a = document.createElement('a'); el_a.innerHTML = i+'<br/>' el_a.addEventListener('click',function(e){ e.preventDefault() console.log(i) },) aa.appendChild(el_a) })(i) }
也能夠把for的var改爲letapi
// 閉包 1.能調用其餘函數內部變量(給變量添加了緩存 但要注意在適當的時候清除緩存) 2.匿名執行函數(防止全局變量污染) function f1(){ var a = 1; return function(){ console.log(a) } } let a = f1(); function f2(f){ var a =2; f() } f2(a)
/寫回調函數:一般axios請求的函數是封裝起來的(便於維護) 發起請求的頁面是分開的/數組
let params = { a:1, b:1, callback:function({datas}){ console.log('hhhh') console.log(datas) } } apiAxios(params) // 封裝到一個js裏面 function apiAxios(params){ // axios.get('url').then((resp)=>{ let datas = [1,2,3,4] params.callback({datas:datas}) // }) }
用戶輸入url到頁面顯示這個過程當中發生了什麼呢?
一、輸入url發送請求
二、瀏覽器拿到服務器返回的HTML
三、瀏覽器開始解析HTML生產DOM樹、css生產css樹,兩個樹合在一塊兒生成渲染數
四、瀏覽器根據渲染樹來繪製頁面
注意:重繪和重排兩個關鍵字
1)重繪:dom節點不發生位置的變化,例如改變background,不影響周邊的節點
2)重排:dom發生節點變化,涉及到的周邊節點也會發生重排,所以消耗性能較大,例如操做節點,修改樣式的寬高,僞類的操做等
3)js的執行會影響dom樹和css樹的渲染
4)<img/>瀏覽器遇到這個標籤 不會停下來,而是繼續下來,等圖片請求下來再返回去重排
總結:一些動畫類的操做節點儘可能使用absolute或者fixed,避免影響周邊節點瀏覽器
最近刷博客看到的,window.perforance.timing這個方法下面有不少的屬性能夠獲取緩存
DNS查詢耗時 = domainLookupEnd - domainLookupStart TCP連接耗時 = connectEnd - connectStart request請求耗時 = responseEnd - responseStart 解析dom樹耗時 = domComplete - domInteractive 白屏時間 = domloadng - fetchStart domready時間 = domContentLoadedEventEnd - fetchStart onload時間 = loadEventEnd - fetchStart