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