js&jq涉及內容衆多,分爲上下兩部分進行整理,該部分爲上部分。
<table border="1" id="t"> <tr> <th>Month</th> <th>Savings</th> </tr> <tr> <td>January</td> <td>$100</td> </tr> </table>
首先經過題目給的table id 得到該對象;tableObj.rows.length;
得到行數;tableObj.rows[x].cells[y].innerText
能夠得到x行y列的值;
遍歷tablejavascript
function show(){ var tableRowInfo =""; tableObj = document.getElementById("t"); for(var i =0 ;i<tableObj.rows.length ; i++){ for(var j=0 ;j<tableObj.rows[i].cells.length ; j++){ tableRowInfo += tableObj.rows[i].cells[j].innerText + " "; } console.log(tableRowInfo); // 打印每行信息 tableRowInfo =""; } }
var elementArr = document.getElementsByTagName('*') var tagNameArr = [] for(var i= 0,len=elementArr.length;i<len;i++){ if(tagNameArr.indexOf(elementArr[i].tagName) == -1){ tagNameArr.push(elementArr[i].tagName) } }
document.addEventListener(type, handler, false)
;//true事件捕獲模式,false事件冒泡模式css
//1 <input type='buttom' value='click me' onclick='try{showMessage()}catch(ex){}'> //2 var btn = document.getElementById('myBtn') btn.onclick = function(){} //3 btn.addEventListener('click',function(){},false)//false在冒泡階段調用事件處理程序 IE:btn.attachEventListener('click',function(){},false)
// CSS #box { position:relative; } #box div { width: 60px; height: 60px; position: absolute; } // HTML <div id="box"></div> // JavaScript <script> var box = document.getElementById('box'); var str = ''; var arr = ['red', 'yellow', 'blue', 'green']; for (var i = 0; i < 100; i++) { str += '<div style="left:' + i%10*60 + 'px; top:' + Math.floor(i/10)*60 + 'px; background:' + arr[i%arr.length] + ';">' + (i+1)+'</div>'; } box.innerHTML += str;
function trim(str) { if (str && typeof str === "string") { return str.replace(/(^\s*)|(\s*)$/g,""); //去除先後空白符 } }
二、使用正則表達式驗證郵箱格式html
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/; var email = "example@qq.com"; console.log(reg.test(email)); // true
x = Math.cos(Math.PI/4)*r y = Math.sin(Math.PI/4)*r
適合採用事件委託技術的事件包括:click、mousedown、mouseup、keydown、keyup、keypress
前端
不冒泡的事件:blur、focus、load、unload
java
使用原生js爲如下li實現事件委託,點擊後打印對應的node-type屬性值node
<ul id="test"> <li node-type="1">b</li> <li node-type="2">a</li> <li node-type="3">t</li> </ul> var ele = document.getElementById('test'); ele.addEventListener('click',function(e){ var value = e.target.attributes[0].nodeValue; console.log(value); },false)
該事件可用於彈出對話框,提示用戶是繼續瀏覽頁面仍是離開當前頁面。對話框默認的提示信息根據不一樣的瀏覽器有所不一樣,標準的信息相似"肯定要離開此頁嗎?"。該信息不能刪除。但你能夠自定義一些消息提示與標準信息一塊兒顯示在對話框。
注意: 若是你沒有在 <body>
元素上指定 onbeforeunload
事件,則須要在 window
對象上添加事件,並使用 returnValue
屬性建立自定義信息。nginx
window.onbeforeunload = function(){ setTimeout(function(){console.log('cancel');},1000); return '肯定離開?' }
console.log(typeof null);//object console.log(typeof undefined);//undefined console.log(typeof 'a');//string console.log(typeof 1);//number console.log(typeof true);//boolean console.log(typeof []);//object instanceof能夠準確判斷 左對象 是 右對象 的實例 console.log([] instanceof Array);//true console.log('a' instanceof String);//false console.log(/a/ instanceof RegExp);//true console.log([] instanceof Object);//true
alert
警告框;confirm
確認框;prompt
提示框var processor = { timeoutId: null, performProcessing: function(){ //執行的代碼 }, process: function(){ clearTimeout(this.timeoutId); var that = this; this.timeoutId = setTimeout(function(){ that.performProcessing(); },500); } } processor.process();
scroll-view
標籤用於建立可滾動的列表區域,這個屬性能夠綁定用戶滾動到列表底部的事件,<scroll-view scroll-y bindscrolltolower="bottom"></scroll-view>
,可是,頁面到達底部以前的臨界點,這個事件會重複觸發無數次,致使向後臺請求分頁數據無數次。此時,能夠採用函數節流技術;302請求的資源被臨時移動;
303查看其餘地址;
304請求的資源未修改,讀取緩存資源;
403請求被服務器拒絕;
404沒法找到資源;
500服務器內部錯誤;
502無效請求程序員
1xx:1開頭的是信息狀態碼
2xx:2開頭的是請求成功
3xx:3開頭的是重定向
4xx:4開頭的是客戶端錯誤
5xx:5開頭的是服務器錯誤web
基本流程:ajax
//一、建立XHR對象 var request = new XMLHttpRequest();//在大多數瀏覽器中,在ie五、ie6中不支持這個方式 //在ie五、ie6中兼容只需定義下面這個函數 var request; if(window.XMLHttpRequest){ request = new XMLHttpRequest(); }else{ request = new ActiveXObject("Microsoft.XMLHTTP"); } //二、進行請求完整代碼 var xhr = ''; var requestData = ''; //兼容性處理 if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open('GET/POST','url',true/false);//get和post請求,true爲異步請求、false我爲同步請求,請求的URL中可帶參數進行請求 xhr.setRequestHeader("Content-type", "application/json");//添加http頭信息,該函數的順序必須是open以後,send以前 xhr.send(JSON.stringify({ name: '小明', age: 20 }));//post的send(String)必需要,send用於發送請求參數,若是不須要請求體發送請求參數,則爲null。 //send傳輸的數據是以json數據格式傳給後臺的。 //返回響應 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ //請求成功的處理函數,服務器返回的數據存入responseText屬性中 requestData = xhr.responseText;//獲取到後臺響應的數據 var date = JSON.parse(requestData);//將響應數據轉化成json格式,以便使用 //使用數據 //~~~ }else{ //請求數據錯誤的處理函數 } }else{ //ajax發送失敗,沒有獲得響應數據 } }
2.使用jQuery的$.ajax()方法實現請求,代碼以下:
$.ajax({ type: 'GET',//請求方式 url: 'url',//請求資源地址或請求接口 data: { //請求參數 }, success: function(data){//服務器響應的數據都存入data中 //請求成功處理函數 if(data.status === '0'){ alert(data.message); } else { //向本身的html添加服務器響應的數據 } } error: function(){ //請求失敗處理函數 } });
請求代碼以下:
window.fetch(url).then(function(response){//響應值放入response中 return response.json();//用json()方法把相應的數據轉化爲javascript對象 }).then(function(data) //請求成功處理函數 }).catch(function(e){ //請求失敗處理函數 })
document.onclick = clickStat; function clickStat() { var e = arguments[0] || window.event,x = '',y = ''; if(e.clientX || e.clientY){ x = e.clientX; y = e.clientY; }else{//兼容ie x = e.clientX + document.body.scrollLeft - document.body.clientLeft; y = e.clientY + document.documentElement.scrollTop; } console.log(x,y) }
eval();//此方法不推薦 eval( '(' + jsonDate + ')' ); JSON.parse();//推薦方法 JSON.parse( jsonDate ); eval();方法解析的時候不會去判斷字符串是否合法,並且json對象中的js方法也會被執行,這是很是危險的;
<input type=」button」 onclick=」showInfo(this);」 value=」點擊一下」/>
function Animal(name, color) { this.name = name; this.color = color; }
<input type="button" id="text" value="點擊一下" /> <script type="text/javascript"> var btn = document.getElementById("text"); btn.onclick = function() { alert(this.value); //此處的this是按鈕元素 } </script>
var numbers = [5, 458 , 120 , -215 ]; var maxInNumbers = Math.max.apply(this, numbers); console.log(maxInNumbers); // 458 var maxInNumbers = Math.max.call(this,5, 458 , 120 , -215); console.log(maxInNumbers); // 458
細節:
1.typeof 通常只能返回以下幾個結果:number,boolean,string,function,object,undefined。
2.typeof 來獲取一個變量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 由於若是 a 不存在(未聲明)則會出錯。
3.對於 Array,Null 等特殊對象使用 typeof 一概返回 object,這正是 typeof 的侷限性。
a instanceof b?alert("true"):alert("false"); //a是b的實例?真:假 var a = new Array(); alert(a instanceof Array); // true alert(a instanceof Object) // true 如上,會返回 true,同時 alert(a instanceof Object) 也會返回 true;這是由於 Array 是 object 的子類。 function test(){}; var a = new test(); alert(a instanceof test) // true
細節:
1.以下,獲得的結果爲‘N’,這裏的 instanceof 測試的 object 是指 js 語法中的 object,不是指 dom 模型對象。
if (window instanceof Object){ alert('Y')} else { alert('N');} // 'N'
var count=10; //全局做用域 標記爲flag1 function add(){ var count=0; //函數全局做用域 標記爲flag2 return function(){ count+=1; //函數的內部做用域 alert(count); } } var s = add() s();//輸出1 s();//輸出2
一、濫用閉包,會形成內存泄漏:因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。解決方法是,在退出函數以前,將不使用的局部變量所有刪除。
二、會改變父函數內部變量的值。因此,若是你把父函數看成對象(object)使用,把閉包看成它的公用方法(Public Method),把內部變量看成它的私有屬性(private value),這時必定要當心,不要隨便改變父函數內部變量的值。
什麼是跨域?
因爲瀏覽器同源策略,凡是發送請求url的協議、域名、端口三者之間任意一與當前頁面地址不一樣即爲跨域。存在跨域的狀況: 網絡協議不一樣,如http協議訪問https協議。 端口不一樣,如80端口訪問8080端口。 域名不一樣,如qianduanblog.com訪問baidu.com。 子域名不一樣,如abc.qianduanblog.com訪問def.qianduanblog.com。 域名和域名對應ip,如www.a.com訪問20.205.28.90.
跨域請求資源的方法:
一、porxy代理 定義和用法:proxy代理用於將請求發送給後臺服務器,經過服務器來發送請求,而後將請求的結果傳遞給前端。 實現方法:經過nginx代理; 注意點:一、若是你代理的是https協議的請求,那麼你的proxy首先須要信任該證書(尤爲是自定義證書)或者忽略證書檢查,不然你的請求沒法成功。
二、CORS 【Cross-Origin Resource Sharing】
定義和用法:是現代瀏覽器支持跨域資源請求的一種最經常使用的方式。 使用方法:通常須要後端人員在處理請求數據的時候,添加容許跨域的相關操做。以下:
res.writeHead(200, { "Content-Type": "text/html; charset=UTF-8", "Access-Control-Allow-Origin":'http://localhost', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type' });
(3)、jsonp
定義和用法:經過動態插入一個script標籤。瀏覽器對script的資源引用沒有同源限制,同時資源加載到頁面後會當即執行(沒有阻塞的狀況下)。 特色:經過狀況下,經過動態建立script來讀取他域的動態資源,獲取的數據通常爲json格式。
<script> function testjsonp(data) { console.log(data.name); // 獲取返回的結果 } </script> <script> var _script = document.createElement('script'); _script.type = "text/javascript"; _script.src = "http://localhost:8888/jsonp?callback=testjsonp"; document.head.appendChild(_script); </script>
缺點: 一、這種方式沒法發送post請求(這裏) 二、另外要肯定jsonp的請求是否失敗並不容易,大多數框架的實現都是結合超時時間來斷定。
function fn1() { var obj = {name: 'hanzichi', age: 10}; } function fn2() { var obj = {name:'hanzichi', age: 10}; return obj; } var a = fn1(); var b = fn2();
fn1中定義的obj爲局部變量,而當調用結束後,出了fn1的環境,那麼該塊內存會被js引擎中的垃圾回收器自動釋放;在fn2被調用的過程當中,返回的對象被全局變量b所指向,因此該塊內存並不會被釋放。
標記清除:
定義和用法:當變量進入環境時,將變量標記"進入環境",當變量離開環境時,標記爲:"離開環境"。某一個時刻,垃圾回收器會過濾掉環境中的變量,以及被環境變量引用的變量,剩下的就是被視爲準備回收的變量。
到目前爲止,IE、Firefox、Opera、Chrome、Safari的js實現使用的都是標記清除的垃圾回收策略或相似的策略,只不過垃圾收集的時間間隔互不相同。
引用計數:
定義和用法:引用計數是跟蹤記錄每一個值被引用的次數。
基本原理:就是變量的引用次數,被引用一次則加1,當這個引用計數爲0時,被視爲準備回收的對象。
內存管理
一、何時觸發垃圾回收?
垃圾回收器週期性運行,若是分配的內存很是多,那麼回收工做也會很艱鉅,肯定垃圾回收時間間隔就變成了一個值得思考的問題。 IE6的垃圾回收是根據內存分配量運行的,當環境中的變量,對象,字符串達到必定數量時觸發垃圾回收。垃圾回收器一直處於工做狀態,嚴重影響瀏覽器性能。 IE7中,垃圾回收器會根據內存分配量與程序佔用內存的比例進行動態調整,開始回收工做。
二、合理的GC方案:(1)、遍歷全部可訪問的對象; (2)、回收已不可訪問的對象。
三、GC缺陷:(1)、中止響應其餘操做;
四、GC優化策略:(1)、分代回收(Generation GC);(2)、增量GC
開發過程當中遇到的內存泄露狀況,如何解決的?
一、定義和用法:
內存泄露是指一塊被分配的內存既不能使用,又不能回收,直到瀏覽器進程結束。C#和Java等語言採用了自動垃圾回收方法管理內存,幾乎不會發生內存泄露。咱們知道,瀏覽器中也是採用自動垃圾回收方法管理內存,但因爲瀏覽器垃圾回收方法有bug,會產生內存泄露。
二、內存泄露的幾種狀況:
1.意外的全局變量引發的內存泄露 function leak(){ leak="xxx";//leak成爲一個全局變量,不會被回收 } 2.閉包引發的內存泄露 3.沒有清理的DOM元素引用 4.被遺忘的定時器或者回調 5)子元素存在引發的內存泄露 (1)、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會做出恰當處理,此時要先手工移除事件,否則會存在內存泄露。
實例以下: <div id="myDiv"> <input type="button" value="Click me" id="myBtn"> </div> <script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function(){ document.getElementById("myDiv").innerHTML = "Processing..."; } </script> 解決方法以下: <div id="myDiv"> <input type="button" value="Click me" id="myBtn"> </div> <script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function(){ btn.onclick = null; document.getElementById("myDiv").innerHTML = "Processing..."; } </script>
(2)、因爲是函數內定義函數,而且內部函數--事件回調的引用外暴了,造成了閉包。閉包能夠維持函數內局部變量,使其得不到釋放。
實例以下: function bindEvent(){ var obj=document.createElement("XXX"); obj.onclick=function(){ //Even if it's a empty function } } 解決方法以下: function bindEvent(){ var obj=document.createElement("XXX"); obj.onclick=function(){ //Even if it's a empty function } obj=null; }
(1)、存儲空間更大:IE8下每一個獨立的存儲空間爲10M,其餘瀏覽器實現略有不一樣,但都比Cookie要大不少。 (2)、存儲內容不會發送到服務器:當設置了Cookie後,Cookie的內容會隨着請求一併發送的服務器,這對於本地存儲的數據是一種帶寬浪費。而Web Storage中的數據則僅僅是存在本地,不會與服務器發生任何交互。 (3)、更多豐富易用的接口:Web Storage提供了一套更爲豐富的接口,如setItem,getItem,removeItem,clear等,使得數據操做更爲簡便。cookie須要本身封裝。 (4)、獨立的存儲空間:每一個域(包括子域)有獨立的存儲空間,各個存儲空間是徹底獨立的,所以不會形成數據混亂。
http緩存 websql cookie localstorage sessionstorage
document.write是直接寫入到頁面的內容流,若是在寫以前沒有調用document.open, 瀏覽器會自動調用open。每次寫完關閉以後從新調用該函數,會致使頁面被重寫。 innerHTML則是DOM頁面元素的一個屬性,表明該元素的html內容。你能夠精確到某一個具體的元素來進行更改。若是想修改document的內容,則須要修改document.documentElement.innerElement。 innerHTML將內容寫入某個DOM節點,不會致使頁面所有重繪
JSON相對於XML來說,數據的體積小,傳遞的速度更快些 JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互 XML對數據描述性比較好; JSON的速度要遠遠快於XML
var Func=function(){}; var func=new Func (); new共通過了4幾個階段 一、建立一個空對象 var obj=new Object(); 二、設置原型鏈 obj.__proto__= Func.prototype; 三、讓Func中的this指向obj,並執行Func的函數體。 var result =Func.call(obj); 四、判斷Func的返回值類型: 若是是值類型,返回obj。若是是引用類型,就返回這個引用類型的對象。 if (typeof(result) == "object"){ func=result; }else{ func=obj;; } (1) 建立一個新對象; (2) 將構造函數的做用域賦給新對象(所以 this 就指向了這個新對象) ; (3) 執行構造函數中的代碼(爲這個新對象添加屬性) ; (4) 返回新對象。
同步是阻塞模式,異步是非阻塞模式。 同步就是指一個進程在執行某個請求的時候,若該請求須要一段時間才能返回信息,那麼這個進程將會一直等待下去,直到收到返回信息才繼續執行下去; 異步是指進程不須要一直等下去,而是繼續執行下面的操做,無論其餘進程的狀態。當有消息返回時系統會通知進程進行處理,這樣能夠提升執行的效率。
共同點:用於瀏覽器端存儲的緩存數據 不一樣點: (1)、存儲內容是否發送到服務器端:當設置了Cookie後,數據會發送到服務器端,形成必定的寬帶浪費; web storage,會將數據保存到本地,不會形成寬帶浪費; (2)、數據存儲大小不一樣:Cookie數據不能超過4K,適用於會話標識;web storage數據存儲能夠達到5M; (3)、數據存儲的有效期限不一樣:cookie只在設置了Cookid過時時間以前一直有效,即便關閉窗口或者瀏覽器; sessionStorage,僅在關閉瀏覽器以前有效;localStorage,數據存儲永久有效; (4)、做用域不一樣:cookie和localStorage是在同源同學口中都是共享的;sessionStorage在不一樣的瀏覽器窗口中不共享,即便是同一個頁面;