JavaScript Dom編程藝術學習筆記1

前兩章的基礎內容自己之前的JavaScript筆記已記錄過,就不再贅述,直接從第三章Dom開始,Dom內容之前也有寫筆記,這里算是補充。

  • <a href="#c1">第三章 Dom</a>
  • <a href="#c2">第四章 案例:JavaScript圖片庫</a>
  • <a href="#c22">第五章 最佳實踐</a>
  • <a href="#c222">第六章 JS圖片庫改進版</a>

第一章 JavaScript簡史

第二章 JavaScript語法

<a name="c1"></a>第三章 Dom

  • Document Object Model,文本對象模型
  • 一篇文檔就是一顆節點樹
  • 常用的三種節點:文本節點、元素節點、屬性節點
  • Dom中三種方式獲得元素節點:
    • getElementById 返回一個與有特定ID值的元素節點對應的對象
    • getElementByTagName 返回一個對象數組(更準確地說,是一個節點列表),可把通配符(*)作為其參數
    • getElemetnByClassName 返回一個對象數組(更準確地說,是一個節點列表),需要考慮解決兼容性:
function getElementsByClassName(node,classname) {
     if(node.getElementsByClassName) {//使用現有方法
        return node.getElementByClassName(classname);
    }else{
        var results = new Array();
        var eles = node.getElementsByTagName("*");
        for(var i = 0;i<elems.length;i++) {
            if(elems[i].className.indexOf(classname)!=-1){
                results[results.length] = elems[i];
            }
        }
        return false;
    }
}
  • 獲取和設置屬性
    getAttribute,setAttribute,只能用于元素節點
    object.setAttribute(attribute, value);,創建屬性,并賦值,這個很常用。
for(var i = 0; i<paras.length;i++) { 
     var title_text = paras[i].getAttribute("title");
     if (title_text) { 
        paras[i].setAttribute("title","brand new title text");     
        alert(paras[i].getAttribute("title")); 
     }

<a name = "c2"></a>第四章 JS圖片庫

function showPic(whichpic){
    var source = whichpic.getAttribute("href");
    var placeholder = document.getElementById("placeholder");
    var text = whichpic.getAttribute("title");//某個圖片鏈接被點擊時,該鏈接的title屬性值將被提取并保存到變量text中
    var description = document.getElementById("description");
    placeholder.setAttribute("src", source);//source是屬性src的值
    description.firstChild.nodeValue = text;//把description對象的第一個子節點的nodeValue屬性值設置為變量text的值
}
//上邊的注釋可作為編程的思路
  • function showPic(whichpic)
    whichpic代表一個元素節點,是一個指向某個圖片的<a>元素需要分解出圖片的文件路徑,可通過在whichpic元素上調用getAttribute得到。
  • onclick = "showPic(this); return false";
    把onclick事件處理函數嵌入到一個鏈接中時,需要把這個鏈接本身用作該函數的參數,this表示“這個對象”/“這個<a>元素節點”。
    點擊鏈接時,showPic函數會被調用,但是鏈接點擊的默認行為也會被調用,阻止默認行為:onclick = "return false;"
    當為return false時,onclick事件處理函數則認為這個鏈接未被點擊。

<a name = "c22"></a>第五章 最佳實踐

  1. 平穩退化(graceful degradation):網頁在沒有JavaScript的情況下也能正常工作。
  • JS中用window.open(url,name,features)打開新的瀏覽器窗口:
function popUp(winURL) { 
      window.open(winURL,"popup","width=320,height=480");
}
  • 調用函數時"javascript: "偽協議和內嵌事件處理函數都不能實現平穩退化
    "javascript: "偽協議:
<a href="javascript:popUp('http://www.example.com/');">Example</a>

內嵌事件處理函數:

<a href="#" onclick="popUp('http://www.example.com/'); return false;">Example</a>
  • 解決辦法:
    在鏈接里給href屬性設置真實存在的URL(依然存在不足之處:每次打開新窗口,都需要把JS代碼嵌入到標記文檔中)
<a  onclick="popUp(this.href ); return false;">Example</a>
  1. 分離JavaScript
window.onload = prepareLinks;
function prepareLinks(){ 
//把事件添加到有著特定屬性的一組元素上
    var links = document.getElementsByTagName("a"); //1.把文檔里的所有鏈接全放入一個數組里
    for (var i=0; i<links.length; i++) {//2.遍歷數組
        if (links[i].getAttribute("class") == "popup"){// 3.如果某個鏈接的class屬性等于popup,就表示這個鏈接在被點擊時應該調用popUp()函數
           popUp(this.getAttribute("href")); //1)把這個鏈接的href屬性值傳遞給popUp()函數
           return false; //2)取消這個鏈接的默認行為
        } 
    }
}
function popUp(winURL){ 
    window.open(winURL,"popup","width=320,height=480");
}
//注釋可作為編程思路
  • 把事件添加到有著特定屬性的一組元素上,步驟:
    • 把文檔里的所有鏈接全放入一個數組里;
    • 遍歷數組;
    • 如果某個鏈接的class屬性等于popup,就表示這個鏈接在被點擊時應該調用popUp()函數:
  1. 把這個鏈接的href屬性值傳遞給popUp()函數
  2. 取消這個鏈接的默認行為
  • window.onload = function{...}
    把代碼打包到函數prepareLinks里,并添加到window對象觸發的onload事件上。必須的步驟,不然加載腳本時文檔可能不完整,導致模型、DOM都不完整,代碼無法正常工作
  1. 向后兼容,對象檢測
if (!getElementyById || !getElementsByTagName)   return false;
//一定要刪掉方法后的圓括號,如果不刪掉,測試的將是方法的結果,無論方法是否存在。
  1. 性能考慮
  • 盡量少訪問DOM和減少標記
    在多個函數都會去的一組類似元素的情況下,可以考慮重構代碼,把搜索結果保存在一個全局變量里,或者把一組元素直接以參數形式傳遞給函數
  • 合并和放置腳本
    包含腳本的最佳方式是使用外部腳本,因為外部文件與標記能清晰的分離開,把多個腳本合并到一個中,減少請求。減少請求數量通常是性能優化首先要考慮的。
    把所有<script>標簽都放到文檔末尾,</body>標簽之前
  • 壓縮腳本
    把腳本中不必要的字節,如空格和注釋,統統刪除(查看網頁源碼時便能體驗到)

常用的代碼壓縮工具:
JSMin
YUI Compressor
Closure Compiler


<a name="c222"></a> 第六章 JS圖片庫改進版

1.JavaScript與HTML標記分離

開始時onclick事件處理函數直接插入到HTML文檔里:

<ul>
<li><a href = "#" onclick = "showPic(this); return false;" title = "..."></li>
...
</ul>

<ul>設置id屬性便可把JS移出文檔:
<ul id = "imagegallery">...

  • 添加事件處理函數,該函數完成以下工作:
    • 檢查當前瀏覽器是否理解getElementByTagName;
    • 檢查當前瀏覽器是否理解getElementById;
    • 檢查當前網頁是否存在一個id為imagegallery的元素;
    • 遍歷imagegallery元素的所有鏈接
    • 設置onclick事件,讓它在有關鏈接被點擊時完成以下操作:
      1)把這個鏈接作為參數傳遞給showPic函數;
      2)取消鏈接被點擊時的默認行為。
function prepareGallery() {
  if (!document.getElementsByTagName) return false;
  if (!document.getElementById) return false;
  if (!document.getElementById("imagegallery")) return false;//1.檢查點
  var gallery = document.getElementById("imagegallery");
  var links = gallery.getElementsByTagName("a");//2.變量
  for ( var i=0; i < links.length; i++) {//3.遍歷
    links[i].onclick = function() {//4.改變行為
     // return !showPic(this);
        retrun showPic(this) ? false : true;//this在這里代表links[i]
  }
    //links[i].onkeypress = links[i].onclick;盡量不使用鍵盤觸發事件
  }
}
---
links[i].onclick = function() 定義了一個匿名函數:一種在代碼執行時創建函數的辦法。這個匿名函數里的所有語句都將在link[i]元素被點擊時執行。
return !showPic(this):
1.如果showPic返回true,我們就返回false,瀏覽器不會打開那個鏈接; 
2.如果showPic返回false,我們認為圖片沒有更新,于是返回true以允許默認行為發生
3.this在這里代表links[i]
  • 共享onload事件
    把創建的函數綁定到事件上:window.onload = prepareGallery;
    如果有多個函數想在頁面加載完畢時立即執行,可以創建如下函數:
window.onload = function(){
        fisrtFunction();
        secondFunction();
        ...
}

更好的解決方案是利用函數addLoadEvent,它只有一個參數:打算在頁面加載完畢時執行的函數的名字,如下:

//代碼的注釋部分即為addLoadEvent函數將要完成的操作
function addLoadEvent(func) {//只有一個參數,在頁面加載完畢時執行的函數的名字
  var oldonload = window.onload;//把現有的window.onload事件處理函數的值存入變量oldonload
  if (typeof window.onload != 'function') {
    window.onload = func;//如果這個處理函數上還沒有綁定任何函數,把新函數添加給它
  } else {
    window.onload = function() {
      oldonload();
      func();//如果這個處理函數上已經綁定了一些函數,就把新函數追加到現有指令的末尾
    }
  }
}
addLoadEvent(prepareGallery);

2.DOM Core和HTML-DOM

getElementById,getElementsByTagName,setAttributegetAttribute等方法都是DOM Core的組成部分,不專屬于JavaScript,支持DOM的任何一種語言都可以使用。
關于HTML-DOM可以參考這里

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • 前言 歸根結底,代碼都是思想和概念的體現。沒人能把一種程序設計語言的所有語法和關鍵字都記住,可以查閱參考書來解決。...
    朱細細閱讀 2,956評論 4 14
  • 第四章 事件處理函數 在特定事件發生時調用特定的JavaScript代碼 event = "JavaScript...
    小毛同學閱讀 364評論 6 0
  • 筆記來自慕課網的js和《JavaScript DOM編程藝術》一書以及《JavaScript權威指南》一書的學習。...
    恰皮閱讀 734評論 3 3
  • 昨天看到一個堅持日更一個多月的作者,忽然提出以后不再堅持寫文了,原因是經常有人說他傳播的是雞湯文,還說他用每天自己...
    一檸有個小院子閱讀 307評論 4 6
  • 老師教了我們一句英語 I like you,but just like you 剛想說這句不錯 可是老師又告訴了我...
    絕版菇涼閱讀 147評論 0 0