《JS修煉之道》—— 讀后總結


本篇是基於《JS修煉之道》的記錄性與總結性的文章,這本書從多種框架的角度,講述了JS開發中的一些實用技巧。

比如Prototype,JQuery,Mootools,YUI,Dojo,Ext,不過我個人僅僅會點JQuery而已,因此也就專門只看JQuery的部分了。

任務1 動態選擇方法及屬性

由於方法在js中也是一種屬性,因此可以使用屬性的方法來調用方法:

var test = {a:func,b:20};
test.a();
test.b;
或者
test[a]();
test[b];

使用下面的方式的好處是,如果需要做邏輯判斷,可以直接在下標中進行:

if(isTrue){
 test.a();
}else{
 test.b();
}
可以直接寫成:
test[isTrue?a:b]();

是不是很簡潔呢?

任務2 通過模塊實現代碼訪問控制

由於JS中未使用var聲明的變量都會自動提升為全局變量,為了避免全局變量過多導致的性能問題,可以使用模塊化的方法,把變量聲明在某個匿名函數中,由於變量都是函數級別提升的,因此不會溢出到全局。

(function(){
 //這里聲明的變量只有該函數才能訪問
})();

任務3 使用可選、可變、命名參數

在JS中參數的定義是很隨意的,既無需定義類型的定義,也不需要在使用時按照規定的參數進行設置。

因為JS中使使用arguments對象保存參數,如果在函數聲明的時候,添加了參數,就相當於多了一個參數的引用而已。

function xxx(a,b){
    for (var index = 1, len = arguments.length; index < len; ++index) {
      alert(arguments[index]);
    }
}

//可以這樣使用
xxx(a,b,c);
//參數c在函數內部,可以通過遍歷arguments得到。
//當然xxx(a),也不會出錯....只是c是undefined而已

任務4 獲得DOM元素的引用

ES中已經定義了一些關於元素引用的方法,比如document.getElementById(),但是這種風格顯得有些冗長,因此很多的框架都提供了元素引用的封裝,就拿Jquery來說,就提供了:

基於ID的引用、基於CLASS的引用、基於標簽的引用 以及 基於前三種的查找引用等等。

任務5 動態修飾內容

很多框架都封裝了一些基於CSS的修改方法,比如Jquery支持css或者attr等來修改DOM元素的樣式。

任務6 修改元素的內容

原生的JS支持InnerHtml和outHtml等方法,Jquery也對其進行封裝:

比如

val()可以獲得控件的值

html()可以獲得內部的Html

text()可以獲得文本

 

等等

任務7 DOM加載完成后加載腳本

window.load()方法會在DOM加載全部加載完成后執行,包括圖片等文件,這就會導致加載的時間很長。而且該方法之能定義一次,這對於用戶來說是不能滿足需求的。

因此很多框架都提供了相應的方法,比如jquery:

$(function(){})或者$.ready(function(){})

任務8 監聽以及停止監聽事件

多數的框架都提供了事件監聽的機制,比如on進行監聽,off接觸監聽。以前的Jquery版本使用的是bind和unbind。

還有live對未來將會出現的元素事件進行監聽。

任務9 利用事件委托

在編寫前端代碼時,應該盡量優先使用事件委托機制,而且是相對最近的事件委托。

由於事件的綁定都是消耗性能的,如果你有一個表格,想要給表格中的每一行綁定事件,難道要循環給每個tr綁定事件?那么未來添加一行,再綁定一個事件?

這樣做肯定是不可取的,此時就應該使用事件委托,給父級的元素綁定事件,然后捕獲event.target

$('父級').click(function(e){
//e.target是真正的觸發元素}
)

需要注意的是,並不是所有的事件都能冒泡,比如blur和focus就無法冒泡。(自己踩過的坑,只怪基礎不扎實)

任務10 將行為和自定義事件解耦

最好將事件與DON元素分離,然后通過bind等方式進行綁定。

這樣既方便管理代碼,也使得事件的綁定更為靈活。

任務11 模擬后台處理

由於JS是單線程的,可以通過setTimeout()和clearTimeout()模擬多線程。

比如一個方法要執行很長的時間,如果不采取任何的行動,可能會造成頁面的卡頓。那么就可以把任務拆分成多個部分,使用setTimeout()進行分段執行,這樣在每段的間隙,還可以處理其他的請求。

相當於模擬了多線程機制。

任務12 打造漂亮的tooltip

這個屬於易用性的技巧了,tooltip現在也有很多開源的UI框架,沒必要自己再去寫了。

任務13 制作友好的彈窗

個人感覺Bootstrap就足夠用了。

任務14 預載入圖片

預載入圖片有很多中方法:

1 使用動態的js腳本加載圖片

2 使用CSS先隱藏已經加載的圖片

任務15 創造光箱效果

這種特效在很多網站中還是很常用的,Jquery中的FancyBox可以幫助你快速的達到目的

任務16 實現無限翻頁

前兩天剛剛總結並且實踐了下無限翻頁,最主要的還是要理解各種高度和寬度。

任務17 在載入時保持顯示區域

這就需要保證滾動條想對的位置了

任務18 暫時禁用提交按鈕

有的時候表單的數據需要一定的時間准備,此時用戶如果點擊提交可能會造成重復提交,或者一次提交出錯。

為了避免這些問題,在表單沒有完成必填項時,應該禁用提交按鈕

任務19 提供輸入長度反饋

如果輸入框使用了maxlength屬性心智,那么長度就是有限制的,因此最好是在用戶輸入時,提供一個實時的長度反饋,這點效果可以參考微博等。

之前也整理過源碼的實現方式,參考我的github

任務20 同時選擇或者反選多個checkBox

一般來說提供一些批量操作對於易用性還是有不少幫助的。

比如:

<input type="checkbox" name="items" alue="1" /> 1
<input type="checkbox" name="items" alue="2" /> 2
<input type="checkbox" name="items" alue="3" /> 3
<input type="checkbox" name="items" alue="4" /> 4

對應的的操作為:

//全選
$(xx).click(function(){
 $("[name=items]:checkbox").attr("checked",true);
})
//全不選
$(xx).click(function(){
 $("[name=items]:checkbox").attr("checked",false);
})
//取反
$(xx).click(function{
 $("[name=items]:checkbox").each(function(){
  this.checked = !this.checked;
 })
})

任務21 表單的驗證

CSS屬性中有required,給必填項添加樣式。

任務22 表單驗證:進階技巧

對於更復雜的一些表單控件,比如數字和郵箱,可以通過正則進行校驗

任務23 表單驗證:高級技巧

利用Ajax可以實時的對表單進行校驗,、

任務24 在表單中提供tooltip

任務25 自動完成輸入

這需要在控件初始化前,提供一些預設的值,實現的方式可以是在頁面加載的時候請求控件的對應的信息,也可以請求某個json文件,把提示的信息存儲在JSON中。

任務26 使用動態多文件上傳

書中給出的方式是單個文件上傳按鈕上傳后,隱藏對應按鈕。然后添加下一個文件....最后搜集所有的上傳信息統一提交。

任務27 讀取以及寫入cookie

cookie是保存在客戶端的一些信息,因此存在一定的風險。

它不適合保存過於重要的數據,(否則你應該使用一些加密手段)

它保存的數據量比較小,只能有4KB的大小。

它有時候可能不可用,因為受制於瀏覽器的限制,有的瀏覽器可能設置了cookie相關的限制。

一般框架都會提供相應的操作

任務28 通過ajax加載內容

異步變成給瀏覽器帶來了一次歷史性的變革。而原生的ajax瀏覽器兼容並不好,可以直接使用框架封裝的ajax,方便又快捷。

例如Jquery的$.ajax();

任務29 使用JSON

JSON是一種基於js的文檔型數據類型,它扁平化沒有任何固定的閑置。現在很多的框架都把它作為數據傳輸的基本格式,比如ES。

任務30 使用JSON-P

由於普通的ajax請求會出現一些跨域問題,使用JSON-P可以有效的解決跨域限制。

看過一篇講解JSON-P非常好的文章:有空可以多看看

 

其他的任務時關於第三方接入的,沒啥實際的作用,就不做總結了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM