《JavaScript DOM 編程藝術(shù)》10:應(yīng)用最佳實踐

這是《JavaScript學(xué)徒》系列的第十課畏铆,今天會進(jìn)入《JavaScript DOM 編程藝術(shù)》第6章瓶逃,將上一章的最佳實踐應(yīng)用到圖片庫例子中。

本文同步發(fā)表于我的個人網(wǎng)站:

《JavaScript DOM 編程藝術(shù)》10:應(yīng)用最佳實踐 - 程式學(xué)徒 ZackLive?zacklive.com

教學(xué)視頻連結(jié)

YouTube

B站

優(yōu)酷

能否平穏退化揭蜒?

  • Ballon
  • 以這段程式為例秘遏,href中我們不使用JavaScript偽協(xié)議(javascript:)或者#號儡司,就是為了即使JavaScript不可用,程式仍能打開圖片渐尿。

    JavaScript是否與HTML標(biāo)記分離醉途?

    在上面那段程式中,onclick的部分便是JavaScript砖茸,它跟HTML混在一起了隘擎。這是可以改進(jìn)的地方。

    首先凉夯,將onclick從各連結(jié)移除货葬,并為ul加入id = imagegallery。再加入以下函數(shù):

    function prepareGallery() {? if (!document.getElementsByTagName ||? ? ? !document.getElementById ||? ? ? !document.getElementById("imagegallery")) return false;? var gallery = document.getElementById("imagegallery");? var links = gallery.getElementsByTagName("a");? for ( var i=0; i

    這個函數(shù)先檢查我們要用的方法劲够,再透過剛加入的id取得圖片庫中所有連結(jié)震桶,最后為每一條連結(jié)綁定onclick事件,并賦與它一個函數(shù)來執(zhí)行showPic及返回false征绎。

    prepareGallery函數(shù)要在網(wǎng)頁載入后馬上執(zhí)行蹲姐,可以使用之前提到的window.onload,但我們可能有多個需要在載入后馬上執(zhí)行的函數(shù)炒瘸,因此淤堵,我們需要以下函數(shù):

    function addLoadEvent(func) {? var oldonload = window.onload;? if (typeof window.onload != 'function') {? ? window.onload = func;? } else {? ? window.onload = function() {? ? ? oldonload();? ? ? func();? ? }? }}

    這個函數(shù)先將舊的window.onload存到一個變量oldonload中,接著判斷舊window.onload是否已經(jīng)是函數(shù)顷扩,如果不是拐邪,代表里面沒有任何函數(shù),可以將新函數(shù)func直接賦與隘截;如果是扎阶,則代表里面存在其他函數(shù),那就將舊函數(shù)oldonload和新函數(shù)func一起放到一個新的函數(shù)里再賦與window.onload婶芭。

    我們可以重復(fù)使用這個函數(shù)东臀,將多個函數(shù)放入window.onload:

    addLoadEvent(prepareGallery);

    至此,我們成功將JavaScript和HTML分離犀农。

    最后惰赋,我們也應(yīng)為showPic函數(shù)加上檢查:

    function showPic(whichpic) {? if (!document.getElementById("placeholder")) return false;? var source = whichpic.getAttribute("href");? var placeholder = document.getElementById("placeholder");? placeholder.setAttribute("src", source);? var text = whichpic.getAttribute("title");? if (description = document.getElementById("description")) description.firstChild.nodeValue = text;? return true;}

    在第二個if的條件當(dāng)中,我直接進(jìn)行賦值,這是因為對if來講赁濒,賦值的結(jié)果正是被賦值的值轨奄。

    至于最后為什么要返回true,這是要告訴prepareGallery拒炎,showPic沒發(fā)生任何錯誤挪拟。前面的prepareGallery,不管showPic是否成功都會返回false击你,也就是取消連結(jié)的跳轉(zhuǎn)動作玉组。這樣,萬一showPic出錯丁侄,連結(jié)就會失效惯雳,不能平穩(wěn)退化。因此绒障,onclick的函數(shù)應(yīng)改為:

    return !showPic(this);

    這代表showPic成功(showPic返回true)吨凑,我們應(yīng)取消連結(jié)跳轉(zhuǎn),即prepareGallery要返回false户辱,與showPic相反鸵钝;反之,若showPic出錯并返回false庐镐,prepareGallery則應(yīng)返回true恩商,讓連結(jié)進(jìn)行跳轉(zhuǎn)。

    三元操作符(ternary operator)

    showPic當(dāng)中還可以加入更多的檢查:

    var text = whichpic.getAttribute("title") ? whichpic.getAttribute("title") : "";

    這里的問號和冒號組成三元操作符必逆,意思是怠堪,若問號前的條件成立,取冒號前的值名眉;若不成立粟矿,則取冒號后的值。這里便是损拢,若存在title屬性陌粹,則取該屬性為text的值;若不存在福压,則取空字符串為text的值掏秩。

    檢查placeholder是否為圖片:

    if (placeholder.nodeName != "IMG") return false;

    nodeName屬性永遠(yuǎn)是大寫字母。

    這此檢查可按個人喜好加入荆姆。

    鍵盤事件

    按下鍵盤上任一個出鍵都會觸發(fā)onkeypress事件蒙幻,如果我們也想讓用戶按下鍵盤任意鍵來顯示圖片,可以加入:

    links[i].onclick = function() {? return !showPic(this);}links[i].onkeypress = links[i].onclick;

    但onkeypress會使所有鍵失去原本的功能胆筒,如Tab鍵邮破,不再能夠跳到下一個元素;同時,onclick其實也會被回車鍵觸發(fā)决乎,因此队询,如非必要派桩,不應(yīng)使用onkeypress构诚。

    加入CSS

    在index.html的head中加入:

    <link rel="stylesheet" href="style.css">

    接著新增style.css,并加入:

    body {? color: #333;? background-color: #ccc;? margin: 1em 10%;}h1 {? color: #333;? background-color: transparent;}a {? color: #c60;? background-color: transparent;? font-weight: bold;? text-decoration: none;}ul {? padding: 0;}li {? float: left;? padding: 1em;? list-style: none;}#imagegallery {? list-style: none;}#imagegallery li {? display: inline;}#imagegallery li a img {? border: 0;}

    DOM Core和HTML-DOM

    DOM Core:任何程式語言都可以使用铆惑,不限JavaScript或網(wǎng)頁范嘱,方法包括

    getElementById

    getElementsByTagName

    getAttribute

    setAttribute

    HTML-DOM:只適用于web文檔,較簡短:

    DOM Core寫法:

    element.getAttribute("src")placeholder.setAttribute("src", source);

    HTMl-DOM寫法:

    element.srcplaceholder.src = source

    建議使用DOM Core方法员魏,JavaScript目前已不只用于網(wǎng)頁范籌丑蛤,習(xí)慣同一種寫法比較有利。

    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    • 序言:七十年代末撕阎,一起剝皮案震驚了整個濱河市受裹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虏束,老刑警劉巖棉饶,帶你破解...
      沈念sama閱讀 216,324評論 6 498
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镇匀,居然都是意外死亡照藻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 92,356評論 3 392
    • 文/潘曉璐 我一進(jìn)店門汗侵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幸缕,“玉大人,你說我怎么就攤上這事晰韵》⑶牵” “怎么了?”我有些...
      開封第一講書人閱讀 162,328評論 0 353
    • 文/不壞的土叔 我叫張陵雪猪,是天一觀的道長栏尚。 經(jīng)常有香客問我,道長浪蹂,這世上最難降的妖魔是什么抵栈? 我笑而不...
      開封第一講書人閱讀 58,147評論 1 292
    • 正文 為了忘掉前任,我火速辦了婚禮坤次,結(jié)果婚禮上古劲,老公的妹妹穿的比我還像新娘。我一直安慰自己缰猴,他們只是感情好产艾,可當(dāng)我...
      茶點故事閱讀 67,160評論 6 388
    • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般闷堡。 火紅的嫁衣襯著肌膚如雪隘膘。 梳的紋絲不亂的頭發(fā)上,一...
      開封第一講書人閱讀 51,115評論 1 296
    • 那天杠览,我揣著相機與錄音弯菊,去河邊找鬼。 笑死踱阿,一個胖子當(dāng)著我的面吹牛管钳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播软舌,決...
      沈念sama閱讀 40,025評論 3 417
    • 文/蒼蘭香墨 我猛地睜開眼才漆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佛点?” 一聲冷哼從身側(cè)響起醇滥,我...
      開封第一講書人閱讀 38,867評論 0 274
    • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎超营,沒想到半個月后鸳玩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
      沈念sama閱讀 45,307評論 1 310
    • 正文 獨居荒郊野嶺守林人離奇死亡糟描,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點故事閱讀 37,528評論 2 332
    • 正文 我和宋清朗相戀三年怀喉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片船响。...
      茶點故事閱讀 39,688評論 1 348
    • 序言:一個原本活蹦亂跳的男人離奇死亡躬拢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出见间,到底是詐尸還是另有隱情聊闯,我是刑警寧澤,帶...
      沈念sama閱讀 35,409評論 5 343
    • 正文 年R本政府宣布米诉,位于F島的核電站菱蔬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏史侣。R本人自食惡果不足惜拴泌,卻給世界環(huán)境...
      茶點故事閱讀 41,001評論 3 325
    • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惊橱。 院中可真熱鬧蚪腐,春花似錦、人聲如沸税朴。這莊子的主人今日做“春日...
      開封第一講書人閱讀 31,657評論 0 22
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泡一,卻和暖如春颤殴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鼻忠。 一陣腳步聲響...
      開封第一講書人閱讀 32,811評論 1 268
    • 我被黑心中介騙來泰國打工涵但, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粥烁。 一個月前我還...
      沈念sama閱讀 47,685評論 2 368
    • 正文 我出身青樓贤笆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讨阻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
      茶點故事閱讀 44,573評論 2 353

    推薦閱讀更多精彩內(nèi)容

    • 前言 歸根結(jié)底篡殷,代碼都是思想和概念的體現(xiàn)钝吮。沒人能把一種程序設(shè)計語言的所有語法和關(guān)鍵字都記住,可以查閱參考書來解決板辽。...
      朱細(xì)細(xì)閱讀 2,931評論 4 14
    • 本文同步發(fā)表于我的個人網(wǎng)站:ZackLive 這是《JavaScript學(xué)徒》系列的第九課奇瘦,今天會進(jìn)入《JavaS...
      ZackLive閱讀 239評論 0 0
    • 勤于思考是每位有創(chuàng)新精神的網(wǎng)頁設(shè)計人員都應(yīng)該具備的特質(zhì)。 平穩(wěn)退化 第一個問題劲弦,如果JS功能被禁用耳标,會怎么樣?把h...
      fumier閱讀 272評論 0 0
    • 本章內(nèi)容 平穩(wěn)退化 確保網(wǎng)頁在沒有JS的情況下也能正常工作邑跪。 分離JS 把網(wǎng)頁的結(jié)構(gòu)和內(nèi)容與JS腳本的動作行為分開...
      fumier閱讀 263評論 0 0
    • 一次坡、JS前言 (1)認(rèn)識JS 也許你已經(jīng)了解HTML標(biāo)記(也稱為結(jié)構(gòu)),知道了CSS樣式(也稱為表示)画畅,會使用HT...
      凜0_0閱讀 2,769評論 0 8