日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

不唐突的JavaScript的七条准则

發布時間:2025/3/13 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不唐突的JavaScript的七条准则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.不要做任何假設
(JavaScript是一個不可靠的助手)

可能不唐突的JavaScript 的最重要的一個特性就是——你要停止任何假設:

  • 不要假設JavaScript是可用的,你最好認為它很有可能是不可用的,而不是直接依賴于它。
  • 在你經過測試確認一些方法和屬性可以使用之前,不要假設瀏覽器支持它們。
  • 不要假設HTML代碼如你想象的那樣正確,每次都要進行檢查,并且當其不可用的時候就什么也不要做。
  • 讓JavaScript的功能獨立于輸入設備
  • 要記住其他的腳本可能會影響你的JavaScript的功能,所以要保證你的腳本的作用域盡可能地安全。

在開始設計你的腳本之前,要考慮的第一件事情就是檢查一下你要為其編寫腳本的HTML代碼,看看有什么東西可以幫助你達到目的。

2.找出鉤子和節點關系(HTML是腳本的基石)

在開始編寫腳本之前,要先看一下你要為之編寫JavaScript的HTML。如果HTML是未經組織的或者未知的,那么你幾乎不可能有一個好的腳本編寫方案——很可能就會出現下面的情況:要么是會用JavaScript創建太多標記,要么就是應用太依賴于JavaScript。

在HTML中有一些東西需要考慮,那就是鉤子和節點關系。

<1>.HTML 鉤子

HTML最初的和最重要的鉤子就是ID,而且ID可以通過最快的DOM方法——getElementById 訪問到。如果在一個有效的HTML文檔中所有的ID都是獨一無二的話(在IE中關于name 和 ID 有一個bug,不過有些好的類庫解決了這個問題),使用ID就是安全可靠的,并且易于測試。

其他一些鉤子就是是HTML元素和CSS類,HTML元素可以通過getElementsByTagName方法訪問,而在多數瀏覽器中都還不能通過原生的DOM方法來訪問CSS類。不過,有很多外部類庫提供了可以訪問CSS類名(類似于 getElementsByClassName) 的方法。

<2>.HTML 節點關系

關于HTML的另外比較有意思的一點就是標記之間的關系,思考下面的問題:

  • 要怎樣才可以最容易地、通過最少的DOM遍歷來到達目標節點?
  • 通過修改什么標記,可以盡可能多地訪問到需要修改的子節點?
  • 一個給定的元素有什么屬性或信息可以用來到達另外一個元素?

遍歷DOM很耗資源而且速度很慢,這就是為什么要盡量使用瀏覽器中已經在使用的技術來做這件事情。

3.把遍歷交給專家來做(CSS,更快地遍歷DOM)

有關DOM的腳本和使用方法或屬性(getElementsByTagName, nextSibling, previousSibling, parentNode以及其它)來遍歷DOM似乎迷惑了很多人,這點很有意思。而有趣的是,我們其實早已經通過另外一種技術—— CSS ——做了這些事情。

CSS 是這樣一種技術,它使用CSS選擇器,通過遍歷DOM來訪問目標元素并改變它們的視覺屬性。一段復雜的使用DOM的JavaScript可以用一個CSS選擇器取代:

var n = document.getElementById('nav');
if(n){
var as = n.getElementsByTagName('a');
if(as.length > 0){
for(var i=0;as[i];i++){
as[i].style.color = ‘#369′;
as[i].style.textDecoration = ‘none’;
}
}
}

/* 下面的代碼與上面功能一樣 */

#nav a{
color:#369;
text-decoration:none;
}

這是一個可以好好利用的很強大的技巧。你可以通過動態為DOM中高層的元素添加class 或者更改元素ID來實現這一點。如果你使用DOM為文檔的body添加了一個CSS類,那么設計師就很可以容易地定義文檔的靜態版本和動態版本。

JavaScript:

var dynamicClass = 'js';
var b = document.body;
b.className = b.className ? b.className + ' js' : 'js';

CSS:

/* 靜態版本 */

#nav {
....
}

/* 動態版本 */

body.js #nav {
....
}

4.理解瀏覽器和用戶(在既有的使用模式上創建你所需要的東西)

不唐突的JavaScript 中很重要的一部分就是理解瀏覽器是如何工作的(尤其是瀏覽器是如何崩潰的)以及用戶期望的是什么。不考慮瀏覽器你也可以很容易地使用JavaScript 創建一個完全不同的界面。拖拽界面,折疊區域,滾動條和滑動塊都可以使用JavaScript創建,但是這個問題并不是個簡單的技術問題,你需要思考下面的問題:

  • 這個新界面可以獨立于輸入設備么?如果不能,那么可以依賴哪些東西?
  • 我創建的這個新界面是否遵循了瀏覽器或者其它富界面的準則(你可以通過鼠標在多級菜單中直接切換嗎?還是需要使用tab鍵?)
  • 我需要提供什么功能但是這個功能是依賴于JavaScript的?

最后一個問題其實不是問題,因為如果需要你就可以使用DOM來憑空創建HTML。關于這點的一個例子就是“打印”鏈接,由于瀏覽器沒有提供一個非 JavaScript的打印文檔功能,所以你需要使用DOM來創建這類鏈接。同樣地,一個實現了展開和收縮內容模塊的、可以點擊的標題欄也屬于這種情況。標題欄不能被鍵盤激活,但是鏈接可以。所以為了創建一個可以點擊的標題欄你需要使用JavaScript將鏈接加入進去,然后所有使用鍵盤的用戶就可以收縮和展開內容模塊了。

解決這類問題的極好的資源就是設計模式庫。至于要知道瀏覽器中的哪些東西是獨立于輸入設備的,那就要靠經驗的積累了。首先你要理解的就是事件處理機制。

5.理解事件(事件處理會引起改變)

事件處理是走向不唐突的JavaScript的第二步。重點不是讓所有的東西都變得可以拖拽、可以點擊或者為它們添加內聯處理,而是理解事件處理是一個可以完全分離出來的東西。我們已經將HTML,CSS和JavaScript分離開來,但是在事件處理的分離方面卻沒有走得很遠。

事件處理器會監聽發生在文檔中元素上的變化,如果有事件發生,處理器就會找到一個很奇妙的對象(一般會是一個名為e的參數),這個對象會告訴元素發生了什么以及可以用它做什么。

對于大多數事件處理來說,真正有趣的是它不止發生在你想要訪問的元素上,還會在DOM中較高層級的所有元素上發生(但是并不是所有的事件都是這樣,focus和blur事件是例外)。舉例來說,利用這個特性你可以為一個導航列表只添加一個事件處理器,并且使用事件處理器的方法來獲取真正觸發事件的元素。這種技術叫做事件委托,它有幾點好處:

  • 你只需要檢查一個元素是否存在,而不需要檢查每個元素
  • 你可以動態地添加或者刪除子節點而并不需要刪除相應的事件處理器
  • 你可以在不同的元素上對相同的事件做出響應

需要記住的另一件事是,在事件向父元素傳播的時候你可以停止它而且你可以覆寫掉HTML元素(比如鏈接)的缺省行為。不過,有時候這并不是個好主意,因為瀏覽器賦予HTML元素那些行為是有原因的。舉個例子,鏈接可能會指向頁面內的某個目標,不去修改它們能確保用戶可以將頁面當前的腳本狀態也加入書簽。

6.為他人著想(命名空間,作用域和模式)

你的代碼幾乎從來不會是文檔中的唯一的腳本代碼。所以保證你的代碼里沒有其它腳本可以覆蓋的全局函數或者全局變量就顯得尤為重要。有一些可用的模式可以來避免這個問題,最基礎的一點就是要使用 var 關鍵字來初始化所有的變量。假設我們編寫了下面的腳本:

var nav = document.getElementById('nav');
function init(){
// do stuff
}
function show(){
// do stuff
}
function reset(){
// do stuff
}

上面的代碼中包含了一個叫做nav的全局變量和名字分別為 init,show 和 reset 的三個函數。這些函數都可以訪問到nav這個變量并且可以通過函數名互相訪問:

var nav = document.getElementById('nav');
function init(){
show();
if(nav.className === 'show'){
reset();
}
// do stuff
}
function show(){
var c = nav.className;
// do stuff
}
function reset(){
// do stuff
}

你可以將代碼封裝到一個對象中來避免上面的那種全局式編碼,這樣就可以將函數變成對象中的方法,將全局變量變成對象中的屬性。 你需要使用“名字+冒號”的方式來定義方法和屬性,并且需要在每個屬性或方法后面加上逗號作為分割符。

var myScript = {
nav:document.getElementById('nav'),
init:function(){
// do stuff
},
show:function(){
// do stuff
},
reset:function(){
// do stuff
}
}

所有的方法和屬性都可以通過使用“類名+點操作符”的方式從外部和內部訪問到。

var myScript = {
nav:document.getElementById('nav'),
init:function(){
myScript.show();
if(myScript.nav.className === 'show'){
myScript.reset();
}
// do stuff
},
show:function(){
var c = myScript.nav.className;
// do stuff
},
reset:function(){
// do stuff
}
}

這種模式的缺點就是,你每次從一個方法中訪問其它方法或屬性都必須在前面加上對象的名字,而且對象中的所有東西都是可以從外部訪問的。如果你只是想要部分代碼可以被文檔中的其他腳本訪問,可以考慮下面的模塊(module)模式:

var myScript = function(){
//這些都是私有方法和屬性
var nav = document.getElementById('nav');
function init(){
// do stuff
}
function show(){
// do stuff
}
function reset(){
// do stuff
}
//公有的方法和屬性被使用對象語法包裝在return 語句里面
return {
public:function(){

},
foo:'bar'
}
}();

你可以使用和前面的代碼同樣的方式訪問返回的公有的屬性和方法,在本示例中可以這么訪問:myScript.public() 和 myScript.foo 。但是這里還有一點讓人覺得不舒服:當你想要從外部或者從內部的一個私有方法中訪問公有方法的時候,還是要寫一個冗長的名字(對象的名字可以非常長)。為了避免這一點,你需要將它們定義為私有的并且在return語句中只返回一個別名:

var myScript = function(){
// 這些都是私有方法和屬性
var nav = document.getElementById('nav');
function init(){
// do stuff
}
function show(){
// do stuff
// do stuff
}
function reset(){
// do stuff
}
var foo = 'bar';
function public(){

}

//只返回指向那些你想要訪問的私有方法和屬性的指針
return {
public:public,
foo:foo
}
}();

這就保證了代碼風格一致性,并且你可以使用短一點的別名來訪問其中的方法或屬性。

如果你不想對外部暴露任何的方法或屬性,你可以將所有的代碼封裝到一個匿名方法中,并在它的定義結束后立刻執行它:

(function(){
// these are all private methods and properties
var nav = document.getElementById('nav');
function init(){
// do stuff
show(); // 這里不需要類名前綴
}
function show(){
// do stuff
}
function reset(){
// do stuff
}
})();

對于那些只執行一次并且對其它函數沒有依賴的代碼模塊來說,這種模式非常好。

通過遵循上面的那些規則,你的代碼更好地為用戶工作,也可以使你的代碼在機器上更好地運行并與其他開發者的代碼和睦相處。不過,還有一個群體需要考慮到。

7.為接手的開發者考慮(使維護更加容易)

使你的腳本真正地unobtrusive的最后一步是在編寫完代碼之后仔細檢查一遍,并且要照顧到一旦腳本上線之后要接手你的代碼的開發者。考慮下面的問題:

  • 所有的變量和函數名字是否合理并且易于理解?
  • 代碼是否經過了合理的組織?從頭到尾都很流暢嗎?
  • 所有的依賴都顯而易見嗎?
  • 在那些可能引起混淆的地方都添加了注釋嗎?

最重要的一點是:要認識到文檔中的HTML和CSS代碼相對于JavaScript來說更有可能被改變(因為它們負責視覺效果)。所以不要在腳本代碼中包含任何可以讓終端用戶看到的class和ID,而是要將它們分離出來放到一個保存配置信息的對象中。

myscript = function(){
var config = {
navigationID:'nav',
visibleClass:'show'
};
var nav = document.getElementById(config.navigationID);
function init(){
show();
if(nav.className === config.visibleClass){
reset();
};
// do stuff
};
function show(){
var c = nav.className;
// do stuff
};
function reset(){
// do stuff
};
}();

這樣維護者就知道去哪里修改這些屬性,而不需要改動其他代碼。

?

本文專自:??????http://www.cnblogs.com/JustinYoung/articles/1350887.html

轉載于:https://www.cnblogs.com/tjy_una/archive/2009/07/02/1515827.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的不唐突的JavaScript的七条准则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 好男人www社区 | 中出在线观看 | 91大神在线免费观看 | 国产又黄又大又粗的视频 | 亚洲综合91 | 免费播放毛片精品视频 | 91桃色视频在线观看 | 国产成人精品国内自产拍免费看 | 美色视频 | 激情影音 | 亚洲午夜一区 | 国产乱子伦精品 | 久久精品69 | 亚洲精品激情 | 四虎8848精品成人免费网站 | 婷婷综合五月 | 色天天av | 久久影院中文字幕 | 黑人操bb| 成人羞羞国产免费动态 | 超碰96在线 | 成人性生交大全免 | 色人阁视频 | 成人网址在线观看 | 91久久综合 | 亚洲精品一线二线三线 | 亚洲熟妇av一区二区三区漫画 | 视频免费观看在线 | 久插视频| 成人黄色av网站 | 欧美激情视频一区二区三区 | 亚洲精品视频免费观看 | 久久精品视频在线免费观看 | jizz少妇 | 久久噜 | 三上悠亚 电影 | 精人妻一区二区三区 | 精品国产久 | 日本福利在线观看 | 求av网址| 热玖玖 | 成人试看120秒体验区 | 日日射夜夜操 | 超碰在 | 日日夜夜人人 | 欧美性视屏 | av一区不卡| 亚洲鲁鲁| 亚洲精品免费电影 | av污 | 91在线视频播放 | 2019天天操| 污站在线观看 | 一区二区成人免费视频 | 男人的天堂avav | 美女又爽又黄视频 | 91精品影视| 色版视频在线观看 | 欧美精品一区二区三区视频 | wwwwyoujizzcom | 成人精品在线视频 | 在线播放91灌醉迷j高跟美女 | 日韩av大片 | x88av视频| 鲁丝一区二区三区 | 亚洲综合视频在线播放 | 好吊色视频在线观看 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 国产精品无码久久久久高潮 | 在线国产毛片 | 少妇免费毛片久久久久久久久 | 九九影院最新理论片 | 少妇高潮久久久久久潘金莲 | 乱妇乱女熟妇熟女网站 | 先锋影音av资源在线 | 色中文字幕 | 久久一区av | 午夜视频免费 | 国产精品免费久久久 | 免费一级做a爰片久久毛片潮 | 91超碰免费在线 | 国产小视频在线播放 | 女人天堂网站 | 羞羞涩涩网站 | 欧洲丰满少妇做爰 | 精品国产无码一区二区三区 | 色婷视频 | 国产精品女人精品久久久天天 | 日本高清不卡视频 | 九九热精彩视频 | 最近国语视频在线观看免费播放 | 欧美一级色| 色狠狠一区二区 | 国产白丝一区二区三区 | 亚洲精品一级二级 | 欧美美女黄色 | 少妇粉嫩小泬白浆流出 | 亚洲欧美一区二区三区孕妇 | 日本不卡中文字幕 |