前端開發(fā)規(guī)范

前端開發(fā)規(guī)范

1.HTML規(guī)范

1.1.使用正確的HTML5文檔類型

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta name="renderer" content="webkit"> <!-- 360使用極速模式渲染 -->
    <title>Document</title>
</head>
<body>
    
</body>
</html>

1.2 兼容的meta屬性

<meta name="renderer" content="webkit"> <!-- 360使用極速模式渲染 -->

1.3 統(tǒng)一使用4空格的tab縮進

1.4.避免不規(guī)范的元素嵌套

錯誤示例:

<ul>
    <div>導航欄標題</div>
    <li>子項1</li>
    <li>子項2</li>
<ul>

正確示例:

<div>導航欄標題</div>
<ul>
    <li>子項1</li>
    <li>子項2</li>
<ul>

ul標簽只允許存在li作為其直接子標簽婴谱。錯誤示例中的代碼雖然可以正常渲染火架,但是由于不同瀏覽器容錯機制不一致,錯誤的示例代碼可能會導致額外的hack铛嘱。

1.5.自定義屬性采用data-*格式

錯誤示例:

<div ng-click="click()">

正確示例:

<div data-ng-click="click()">

data-*是HTML5的標準規(guī)范,如不采用data-*格式,IDE會顯示警告信息扬跋,避免警告信息影響正常的debug,建議采用data-*格式自定義屬性凌节。

1.6.布爾類型的屬性钦听,建議不添加屬性值

錯誤示例:

<input type="checkbox" checked="true">
<input type="checkbox" checked="flase">
<input type="checkbox" checked="checked">

正確示例:

<input type="checkbox" checked>

獲取選擇選中狀態(tài),使用dom節(jié)點對象的checked屬性倍奢,或者jQuery的is方法朴上,不要使用attr('checked')進行判斷。

錯誤做法:

var $checkbox = $('input[checkbox]');
$checkbox.attr("checked"); // 不準確卒煞,甚至會取得非預期值 

正確做法:

$checkbox.is(':checked');
$checkbox.check = true;
$checkbox.check;        

2.CSS規(guī)范

2.1.確定全局唯一的元素痪宰,可以使用id,否則使用class

否則會導致后期維護成本過大畔裕。

2.2.選擇器應盡量避免嵌套衣撬,最多不過3級別

不好的做法:

body #container .head .title {
    // code here
}

推薦做法:

.h-title {
    // code here
}

嵌套過多,會導致css權重過大,子class跟父class緊耦合柴钻,后期維護成本大淮韭。

3.JavaScript規(guī)范

3.1.字符串統(tǒng)一使用單引號包含

不好的示例:

var msg = "Hello JavaScript!";

正確示例:

var msg = 'Hello JavaScript!';

使用單引號的最主要原因是垢粮,避免額外的單引號\雙引號轉義贴届。

var dom = “<div data-ng-click=\"click();\">雙引號\"\"不建議</div>”;

vs

var dom = '<div data-ng-click="click();">雙引號""不建議</div>';

兩種寫法對比,優(yōu)劣一目了然蜡吧。

3.2.避免使用JavaScript拼接HTML

使用JavaScript拼接HTML毫蚓,會有以下問題:

  • 極容易產生XSS漏洞;
  • 關注點不分離昔善,升級維護極其困難元潘;
  • 開發(fā)效率低下,代碼不健壯君仆,非常容易產生bug翩概;
  • Debug變的異常艱難牲距;

不好的示例:

var names = ['tiger','apple', '<script>alert("xss");</script>'];
var dom = '<ul>';
names.forEach(function(name,index){
    dom += '<li>' + name + '</li>';
})
dom += '</ul>';

$('body').html(dom);

上面的代碼會導致一下問題:

  • names[2]插入頁面后,<script>alert("xss");<script>會被當成腳本執(zhí)行钥庇,容易被用戶利用牍鞠,入侵系統(tǒng);
  • 代碼升級維護困難评姨,如果要修改樣式难述,或者渲染的對象更加復雜(多層嵌套),維護這樣的代碼不僅效率低下吐句,容易出錯胁后,簡直就是噩夢;
  • 產生bug的情況下嗦枢,調試異常復雜攀芯;

正確示例:

AngularJS寫法:

<ul>
    <li data-ng-repeat="name in names">{{ name }}</li>
</ul>

如果使用jQuery情況下,可以使用前端模板引擎文虏,例如doT.js敲才、jQuery Template等。

3.3 JavaScript語法技巧

使用這些小技巧择葡,可以讓代碼更加簡潔紧武、容易理解。

3.3.1 默認參數賦值

冗長寫法:

function fun(param) {
    if(param == null) {
        param = {name:'tiger'};
    }
}

簡潔寫法:

function fun(param) {
    param = param || {name:'tiger'};
}

3.3.2 判空執(zhí)行

冗長寫法:

function fun() {
    if(flag) {
        callback();
    }
}

簡潔寫法:

function fun() {
    flag && callback();
}

3.3.3 自調用函數

冗長寫法:

function fun(){
    // code here
}
fun();

簡潔寫法:

(function(){
    // code here
})();

3.3.4 數組迭代

冗長寫法:for

簡潔寫法:filter敏储、some阻星、every、forEach已添、map

3.3.4.2 filter:對數組進行過濾妥箕,并返回新的數組
var s = [1,2,3,4,5];
var ns = s.filter(function(item,index) {
    return item > 3;
})
console.log(ns); // [4,5]
3.3.4.3 some:判斷數組中是否有符合條件的元素
var s = [1,2,3,4,5];
var b = s.some(function(item,index) {
    return item > 3;
})
console.log(b); // true
3.3.4.4 every:判斷數組中所有元素是否都符合條件
var s = [1,2,3,4,5];
var b = s.every(function(item,index) {
    return item > 3;
})
console.log(b); // false
3.3.4.5 map:對數組中的元素進行處理,并返回新的數組
var s = [1,2,3,4,5];
var ns = s.map(function(item,index) {
    return item * 2;
})
console.log(ns); // [2,4,6,8,10]
3.3.4.6 forEach:迭代數組元素
var s = [1,2,3,4,5];
var ns = s.map(function(item,index) {
    console.log(item); // 依次打印1更舞,2畦幢,3,4缆蝉,5
})

3.4. 前端開發(fā)的JavaScript技巧

3.4.1 使用Angular時宇葱,ajax請求請使用ng自帶的$http,避免使用jQuery的ajax

$http的ajax回調會自動更新DOM節(jié)點,而jQuery的回調沒有這個特征刊头,需要手動apply黍瞧。

<div>{{ user.username }}</div>

正確的jQuery寫法:

$.post('/login',{username:'tiger',passwd='123456'},function(rs){
    $scope.user = rs.user;
    $scope.$apply();
})

正確的AngularJS寫法:

var params = {username:'tiger',passwd='123456'}
$http({method : 'POST',url : '/login', data: $.param(params)
}).then(function(rs) {
    $scope.user = rs.data.user;
});

如果是GET請求,data則改成params原杂,同時不需要$.param序列化印颤,params的參數放url上,而data是放request body中穿肄。

var params = {username:'tiger',passwd='123456'}
$http({method : 'GET',url : '/login', params: params
}).then(function(rs) {
    $scope.user = rs.data.user;
});

3.4.2 HTTP請求中年局,獲取使用GET际看,提交、修改和刪除使用POST

這樣更加符合REST的語義矢否,如果POST使用GET代替仿村,在開發(fā)階段就難以調試,而且無法使用GET的特性進行一系列調優(yōu)兴喂,例如緩存等蔼囊。

HTTP中,GET/POST/DEL等的區(qū)別:http://www.cnblogs.com/zhangpengshou/archive/2012/07/09/2583096.html

3.4.3 獲取ajax的表單參數衣迷,jQuery可以將form表單序列化畏鼓,Angualr可以綁定對象

推薦的jQuery寫法:

<form id="loginFrom">
    <input name="username" type="text" />
    <input name="password" type="passwrod"/>
</form>
<script>
    var params = $('#loginForm').serialize();
    $.post('/login',params,function(rs){
        // callback
    });
</script>

推薦的AngularJS寫法:

<form>
    <input type="text" data-ng-model="loginForm.username" />
    <input type="passwrod" data-ng-model="loginForm.password"/>
</form>
<script>
    $http({
        method : 'POST',
        url : '/login', 
        data: $.param($scope.loginForm)
    }).then(function(rs) {
        // callback說
    });
</script>

3.4.4 jQuey調用AngularJS的方法

思路:取得AngularJS作用域下的節(jié)點找到scope,通過scope調用方法:

var container = $('#container'); // #containe要在data-ng-app的子節(jié)點下
angular.element(container).scope().fun(); // 調用AngularJS下面的fun方法壶谒;

強烈推薦使用Angular開發(fā)云矫,jQuery的功能基本95%以上都可以用Angular代替,代碼量更少汗菜,更容易維護让禀。

JavaScript的String添加了個encodeHTML方法,可以對HTML的特殊字符進行轉義陨界,實現(xiàn)如下:

String.prototype.encodeHTML = function () {
    var div = document.createElement('div');  
    div.appendChild(document.createTextNode(this));  
    return div.innerHTML;
}

如果輸出到頁面的內容由HTML拼接完成巡揍,且內容存在用戶輸入的部分,則拼接過程中菌瘪,對應字段需要經過HTML轉義腮敌,用法如下:

function format(name){
  return '<div>' + name.encodeHTML() + '</div>';
}

腳本實現(xiàn)在eompBase.js中,導入該腳本的頁面俏扩,都可以按照上面的寫法進行轉義糜工。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市录淡,隨后出現(xiàn)的幾起案子捌木,更是在濱河造成了極大的恐慌,老刑警劉巖嫉戚,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刨裆,死亡現(xiàn)場離奇詭異,居然都是意外死亡彼水,警方通過查閱死者的電腦和手機崔拥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門极舔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤覆,“玉大人,你說我怎么就攤上這事拆魏《㈣耄” “怎么了慈俯?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拥峦。 經常有香客問我贴膘,道長,這世上最難降的妖魔是什么略号? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任刑峡,我火速辦了婚禮,結果婚禮上玄柠,老公的妹妹穿的比我還像新娘突梦。我一直安慰自己,他們只是感情好羽利,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布宫患。 她就那樣靜靜地躺著,像睡著了一般这弧。 火紅的嫁衣襯著肌膚如雪娃闲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天匾浪,我揣著相機與錄音皇帮,去河邊找鬼。 笑死蛋辈,一個胖子當著我的面吹牛玲献,可吹牛的內容都是我干的。 我是一名探鬼主播梯浪,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捌年,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挂洛?” 一聲冷哼從身側響起礼预,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虏劲,沒想到半個月后托酸,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡柒巫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年励堡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堡掏。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡应结,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鹅龄,我是刑警寧澤揩慕,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站扮休,受9級特大地震影響迎卤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜玷坠,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一蜗搔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧八堡,春花似錦碍扔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溶耘,卻和暖如春二拐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凳兵。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工百新, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庐扫。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓饭望,卻偏偏與公主長得像,于是被迫代替她去往敵國和親形庭。 傳聞我的和親對象是個殘疾皇子铅辞,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 基本準則 符合web標準,html語義化萨醒;html斟珊,css,JavaScript分離富纸;代碼簡潔有序囤踩,盡可能減少冗余...
    喵嗚君閱讀 798評論 0 1
  • Web前端開發(fā)規(guī)范文檔 規(guī)范目的: 使開發(fā)流程更加規(guī)范化。 通用規(guī)范: TAB鍵用兩個空格代替(WINDOWS下T...
    蕎葉閱讀 545評論 0 1
  • 一.規(guī)范目的 使開發(fā)流程更加規(guī)范化晓褪。 二.通用規(guī)范 TAB鍵用兩個空格代替(WINDOWS下TAB鍵占四個空格堵漱,L...
    overflow_hidden閱讀 2,428評論 0 0
  • 我決定離開歐莎勤庐,歐莎童裝。我是創(chuàng)業(yè)元老之一。我負責整個童裝的視覺設計埃元,天貓店鋪的設計涝涤,京東店鋪的設計媚狰,各個平臺的設...
    花梨閱讀 249評論 0 1
  • 一:丟棄錯誤認知 『要做到最好』的想法崭孤。這類想法過于模糊以至于沒有真正提高自己行為的動機类嗤,那么對于達成目的是無用的...
    Vikax閱讀 265評論 0 0