中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

不唐突的JavaScript的七條準(zhǔn)則整理收集第1/2頁

1.不要做任何假設(shè)
JavaScript是一個不可靠的助手)
可能不唐突的JavaScript 的最重要的一個特性就是――你要停止任何假設(shè):
* 不要假設(shè)JavaScript是可用的,你最好認(rèn)為它很有可能是不可用的,而不是直接依賴于它。
* 在你經(jīng)過測試確認(rèn)一些方法和屬性可以使用之前,不要假設(shè)瀏覽器支持它們。
* 不要假設(shè)HTML代碼如你想象的那樣正確,每次都要進(jìn)行檢查,并且當(dāng)其不可用的時候就什么也不要做。
* 讓JavaScript的功能獨(dú)立于輸入設(shè)備
* 要記住其他的腳本可能會影響你的JavaScript的功能,所以要保證你的腳本的作用域盡可能地安全。
在開始設(shè)計(jì)你的腳本之前,要考慮的第一件事情就是檢查一下你要為其編寫腳本的HTML代碼,看看有什么東西可以幫助你達(dá)到目的。
2.找出鉤子和節(jié)點(diǎn)關(guān)系
(HTML是腳本的基石)
在開始編寫腳本之前,要先看一下你要為之編寫JavaScript的HTML。如果HTML是未經(jīng)組織的或者未知的,那么你幾乎不可能有一個好的腳本編寫方案――很可能就會出現(xiàn)下面的情況:要么是會用JavaScript創(chuàng)建太多標(biāo)記,要么就是應(yīng)用太依賴于JavaScript。
在HTML中有一些東西需要考慮,那就是鉤子和節(jié)點(diǎn)關(guān)系。
<1>.HTML 鉤子
HTML最初的和最重要的鉤子就是ID,而且ID可以通過最快的DOM方法――getElementById 訪問到。如果在一個有效的HTML文檔中所有的ID都是獨(dú)一無二的話(在IE中關(guān)于name 和 ID 有一個bug,不過有些好的類庫解決了這個問題),使用ID就是安全可靠的,并且易于測試。
其他一些鉤子就是是HTML元素和CSS類,HTML元素可以通過getElementsByTagName方法訪問,而在多數(shù)瀏覽器中都還不能通過原生的DOM方法來訪問CSS類。不過,有很多外部類庫提供了可以訪問CSS類名(類似于 getElementsByClassName) 的方法。
<2>.HTML 節(jié)點(diǎn)關(guān)系
關(guān)于HTML的另外比較有意思的一點(diǎn)就是標(biāo)記之間的關(guān)系,思考下面的問題:
* 要怎樣才可以最容易地、通過最少的DOM遍歷來到達(dá)目標(biāo)節(jié)點(diǎn)?
* 通過修改什么標(biāo)記,可以盡可能多地訪問到需要修改的子節(jié)點(diǎn)?
* 一個給定的元素有什么屬性或信息可以用來到達(dá)另外一個元素?
遍歷DOM很耗資源而且速度很慢,這就是為什么要盡量使用瀏覽器中已經(jīng)在使用的技術(shù)來做這件事情。
3.把遍歷交給專家來做
(CSS,更快地遍歷DOM)
有關(guān)DOM的腳本和使用方法或?qū)傩裕╣etElementsByTagName, nextSibling, previousSibling, parentNode以及其它)來遍歷DOM似乎迷惑了很多人,這點(diǎn)很有意思。而有趣的是,我們其實(shí)早已經(jīng)通過另外一種技術(shù)―― CSS ――做了這些事情。
CSS 是這樣一種技術(shù),它使用CSS選擇器,通過遍歷DOM來訪問目標(biāo)元素并改變它們的視覺屬性。一段復(fù)雜的使用DOM的JavaScript可以用一個CSS選擇器取代: 
復(fù)制代碼 代碼如下:
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;
}

這是一個可以好好利用的很強(qiáng)大的技巧。你可以通過動態(tài)為DOM中高層的元素添加class 或者更改元素ID來實(shí)現(xiàn)這一點(diǎn)。如果你使用DOM為文檔的body添加了一個CSS類,那么設(shè)計(jì)師就很可以容易地定義文檔的靜態(tài)版本和動態(tài)版本。
JavaScript:
復(fù)制代碼 代碼如下:
var dynamicClass = 'js';
var b = document.body;
b.className = b.className ? b.className + ' js' : 'js';
CSS:
/* 靜態(tài)版本 */
#nav {
....
}
/* 動態(tài)版本 */
body.js #nav {
....
}

4.理解瀏覽器和用戶
(在既有的使用模式上創(chuàng)建你所需要的東西)
不唐突的JavaScript 中很重要的一部分就是理解瀏覽器是如何工作的(尤其是瀏覽器是如何崩潰的)以及用戶期望的是什么。不考慮瀏覽器你也可以很容易地使用JavaScript 創(chuàng)建一個完全不同的界面。拖拽界面,折疊區(qū)域,滾動條和滑動塊都可以使用JavaScript創(chuàng)建,但是這個問題并不是個簡單的技術(shù)問題,你需要思考下面的問題:
* 這個新界面可以獨(dú)立于輸入設(shè)備么?如果不能,那么可以依賴哪些東西?
* 我創(chuàng)建的這個新界面是否遵循了瀏覽器或者其它富界面的準(zhǔn)則(你可以通過鼠標(biāo)在多級菜單中直接切換嗎?還是需要使用tab鍵?)
* 我需要提供什么功能但是這個功能是依賴于JavaScript的?
最后一個問題其實(shí)不是問題,因?yàn)槿绻枰憔涂梢允褂肈OM來憑空創(chuàng)建HTML。關(guān)于這點(diǎn)的一個例子就是“打印”鏈接,由于瀏覽器沒有提供一個非 JavaScript的打印文檔功能,所以你需要使用DOM來創(chuàng)建這類鏈接。同樣地,一個實(shí)現(xiàn)了展開和收縮內(nèi)容模塊的、可以點(diǎn)擊的標(biāo)題欄也屬于這種情況。標(biāo)題欄不能被鍵盤激活,但是鏈接可以。所以為了創(chuàng)建一個可以點(diǎn)擊的標(biāo)題欄你需要使用JavaScript將鏈接加入進(jìn)去,然后所有使用鍵盤的用戶就可以收縮和展開內(nèi)容模塊了。
解決這類問題的極好的資源就是設(shè)計(jì)模式庫。至于要知道瀏覽器中的哪些東西是獨(dú)立于輸入設(shè)備的,那就要靠經(jīng)驗(yàn)的積累了。首先你要理解的就是事件處理機(jī)制。
5.理解事件
(事件處理會引起改變)
事件處理是走向不唐突的JavaScript的第二步。重點(diǎn)不是讓所有的東西都變得可以拖拽、可以點(diǎn)擊或者為它們添加內(nèi)聯(lián)處理,而是理解事件處理是一個可以完全分離出來的東西。我們已經(jīng)將HTML,CSS和JavaScript分離開來,但是在事件處理的分離方面卻沒有走得很遠(yuǎn)。
事件處理器會監(jiān)聽發(fā)生在文檔中元素上的變化,如果有事件發(fā)生,處理器就會找到一個很奇妙的對象(一般會是一個名為e的參數(shù)),這個對象會告訴元素發(fā)生了什么以及可以用它做什么。
對于大多數(shù)事件處理來說,真正有趣的是它不止發(fā)生在你想要訪問的元素上,還會在DOM中較高層級的所有元素上發(fā)生(但是并不是所有的事件都是這樣,focus和blur事件是例外)。舉例來說,利用這個特性你可以為一個導(dǎo)航列表只添加一個事件處理器,并且使用事件處理器的方法來獲取真正觸發(fā)事件的元素。這種技術(shù)叫做事件委托,它有幾點(diǎn)好處:
* 你只需要檢查一個元素是否存在,而不需要檢查每個元素
* 你可以動態(tài)地添加或者刪除子節(jié)點(diǎn)而并不需要刪除相應(yīng)的事件處理器
* 你可以在不同的元素上對相同的事件做出響應(yīng)
需要記住的另一件事是,在事件向父元素傳播的時候你可以停止它而且你可以覆寫掉HTML元素(比如鏈接)的缺省行為。不過,有時候這并不是個好主意,因?yàn)闉g覽器賦予HTML元素那些行為是有原因的。舉個例子,鏈接可能會指向頁面內(nèi)的某個目標(biāo),不去修改它們能確保用戶可以將頁面當(dāng)前的腳本狀態(tài)也加入書簽。
6.為他人著想
(命名空間,作用域和模式)
你的代碼幾乎從來不會是文檔中的唯一的腳本代碼。所以保證你的代碼里沒有其它腳本可以覆蓋的全局函數(shù)或者全局變量就顯得尤為重要。有一些可用的模式可以來避免這個問題,最基礎(chǔ)的一點(diǎn)就是要使用 var 關(guān)鍵字來初始化所有的變量。假設(shè)我們編寫了下面的腳本:
復(fù)制代碼 代碼如下:
var nav = document.getElementById('nav');
function init(){
// do stuff
}
function show(){
// do stuff
}
function reset(){
// do stuff
}

上面的代碼中包含了一個叫做nav的全局變量和名字分別為 init,show 和 reset 的三個函數(shù)。這些函數(shù)都可以訪問到nav這個變量并且可以通過函數(shù)名互相訪問:
復(fù)制代碼 代碼如下:
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
}

你可以將代碼封裝到一個對象中來避免上面的那種全局式編碼,這樣就可以將函數(shù)變成對象中的方法,將全局變量變成對象中的屬性。 你需要使用“名字+冒號”的方式來定義方法和屬性,并且需要在每個屬性或方法后面加上逗號作為分割符。
復(fù)制代碼 代碼如下:
var myScript = {
nav:document.getElementById('nav'),
init:function(){
// do stuff
},
show:function(){
// do stuff
},
reset:function(){
// do stuff
}
}

JavaScript技術(shù)不唐突的JavaScript的七條準(zhǔn)則整理收集第1/2頁,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产在线www | 国产中文字幕在线观看 | 中文字幕一二三区 | 欧美一区二区三区久久精品视 | 婷婷色网 | 日韩电影免费在线观看中文字幕 | 国产成人精品免费视频大全最热 | 蜜桃日韩| 国产亚洲高清视频 | 蜜桃视频一区二区三区 | 天天看天天干 | 国产一区二区三区四区 | 在线欧美亚洲 | av影音在线 | 亚洲+变态+欧美+另类+精品 | 影音先锋中文在线 | 国产欧美在线观看 | 欧美日韩在线一区二区三区 | 人人澡人人射 | 久久99精品久久久久久国产越南 | 自拍偷拍亚洲一区 | aaa天堂| 91亚洲精选 | 久久网站免费视频 | 精精国产视频 | 日韩羞羞 | 国产成人99久久亚洲综合精品 | 黄色在线免费观看 | 日韩第一夜| 天天看片天天干 | 欧美日韩中文字幕 | 蜜桃视频在线观看免费视频网站www | 日本一二区视频 | 精品欧美一区二区三区久久久 | 国产韩国精品一区二区三区 | 欧美一区二区黄 | 成人久久18免费 | 日本亚洲欧美 | 麻豆久久精品 | 欧美精品中文字幕久久二区 | 9久久|