JavaScript Dom編程藝術(shù)學(xué)習(xí)筆記1

前兩章的基礎(chǔ)內(nèi)容自己之前的JavaScript筆記已記錄過嗤形,就不再贅述精偿,直接從第三章Dom開始,Dom內(nèi)容之前也有寫筆記派殷,這里算是補(bǔ)充还最。

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

第一章 JavaScript簡史

第二章 JavaScript語法

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

  • Document Object Model,文本對象模型
  • 一篇文檔就是一顆節(jié)點(diǎn)樹
  • 常用的三種節(jié)點(diǎn):文本節(jié)點(diǎn)、元素節(jié)點(diǎn)毡惜、屬性節(jié)點(diǎn)
  • Dom中三種方式獲得元素節(jié)點(diǎn):
    • getElementById 返回一個與有特定ID值的元素節(jié)點(diǎn)對應(yīng)的對象
    • getElementByTagName 返回一個對象數(shù)組(更準(zhǔn)確地說拓轻,是一個節(jié)點(diǎn)列表),可把通配符(*)作為其參數(shù)
    • getElemetnByClassName 返回一個對象數(shù)組(更準(zhǔn)確地說经伙,是一個節(jié)點(diǎn)列表)偿凭,需要考慮解決兼容性:
function getElementsByClassName(node,classname) {
     if(node.getElementsByClassName) {//使用現(xiàn)有方法
        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;
    }
}
  • 獲取和設(shè)置屬性
    getAttribute坤塞,setAttribute法严,只能用于元素節(jié)點(diǎn)
    object.setAttribute(attribute, value);辜伟,創(chuàng)建屬性,并賦值,這個很常用。
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");//某個圖片鏈接被點(diǎn)擊時张弛,該鏈接的title屬性值將被提取并保存到變量text中
    var description = document.getElementById("description");
    placeholder.setAttribute("src", source);//source是屬性src的值
    description.firstChild.nodeValue = text;//把description對象的第一個子節(jié)點(diǎn)的nodeValue屬性值設(shè)置為變量text的值
}
//上邊的注釋可作為編程的思路
  • function showPic(whichpic)
    whichpic代表一個元素節(jié)點(diǎn),是一個指向某個圖片的<a>元素需要分解出圖片的文件路徑酪劫,可通過在whichpic元素上調(diào)用getAttribute得到吞鸭。
  • onclick = "showPic(this); return false";
    把onclick事件處理函數(shù)嵌入到一個鏈接中時,需要把這個鏈接本身用作該函數(shù)的參數(shù)覆糟,this表示“這個對象”/“這個<a>元素節(jié)點(diǎn)”刻剥。
    點(diǎn)擊鏈接時,showPic函數(shù)會被調(diào)用滩字,但是鏈接點(diǎn)擊的默認(rèn)行為也會被調(diào)用造虏,阻止默認(rèn)行為:onclick = "return false;"
    當(dāng)為return false時,onclick事件處理函數(shù)則認(rèn)為這個鏈接未被點(diǎn)擊麦箍。

<a name = "c22"></a>第五章 最佳實(shí)踐

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

內(nèi)嵌事件處理函數(shù):

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

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


<a name="c222"></a> 第六章 JS圖片庫改進(jìn)版

1.JavaScript與HTML標(biāo)記分離

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

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

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

  • 添加事件處理函數(shù)施符,該函數(shù)完成以下工作:
    • 檢查當(dāng)前瀏覽器是否理解getElementByTagName往声;
    • 檢查當(dāng)前瀏覽器是否理解getElementById;
    • 檢查當(dāng)前網(wǎng)頁是否存在一個id為imagegallery的元素操刀;
    • 遍歷imagegallery元素的所有鏈接
    • 設(shè)置onclick事件烁挟,讓它在有關(guān)鏈接被點(diǎn)擊時完成以下操作:
      1)把這個鏈接作為參數(shù)傳遞給showPic函數(shù);
      2)取消鏈接被點(diǎn)擊時的默認(rèn)行為骨坑。
function prepareGallery() {
  if (!document.getElementsByTagName) return false;
  if (!document.getElementById) return false;
  if (!document.getElementById("imagegallery")) return false;//1.檢查點(diǎn)
  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;盡量不使用鍵盤觸發(fā)事件
  }
}
---
links[i].onclick = function() 定義了一個匿名函數(shù):一種在代碼執(zhí)行時創(chuàng)建函數(shù)的辦法撼嗓。這個匿名函數(shù)里的所有語句都將在link[i]元素被點(diǎn)擊時執(zhí)行。
return !showPic(this):
1.如果showPic返回true欢唾,我們就返回false且警,瀏覽器不會打開那個鏈接; 
2.如果showPic返回false礁遣,我們認(rèn)為圖片沒有更新斑芜,于是返回true以允許默認(rèn)行為發(fā)生
3.this在這里代表links[i]
  • 共享onload事件
    把創(chuàng)建的函數(shù)綁定到事件上:window.onload = prepareGallery;
    如果有多個函數(shù)想在頁面加載完畢時立即執(zhí)行祟霍,可以創(chuàng)建如下函數(shù):
window.onload = function(){
        fisrtFunction();
        secondFunction();
        ...
}

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

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

2.DOM Core和HTML-DOM

getElementById,getElementsByTagName,setAttribute崭添,getAttribute等方法都是DOM Core的組成部分寓娩,不專屬于JavaScript,支持DOM的任何一種語言都可以使用呼渣。
關(guān)于HTML-DOM可以參考這里棘伴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屁置,隨后出現(xiàn)的幾起案子焊夸,更是在濱河造成了極大的恐慌,老刑警劉巖蓝角,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淳地,死亡現(xiàn)場離奇詭異怖糊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颇象,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門伍伤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遣钳,你說我怎么就攤上這事扰魂。” “怎么了蕴茴?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵劝评,是天一觀的道長。 經(jīng)常有香客問我倦淀,道長蒋畜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任撞叽,我火速辦了婚禮姻成,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愿棋。我一直安慰自己科展,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布糠雨。 她就那樣靜靜地躺著才睹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甘邀。 梳的紋絲不亂的頭發(fā)上琅攘,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音松邪,去河邊找鬼乎澄。 笑死,一個胖子當(dāng)著我的面吹牛测摔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播解恰,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼锋八,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了护盈?” 一聲冷哼從身側(cè)響起挟纱,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腐宋,沒想到半個月后紊服,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檀轨,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年欺嗤,在試婚紗的時候發(fā)現(xiàn)自己被綠了参萄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡煎饼,死狀恐怖讹挎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吆玖,我是刑警寧澤筒溃,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站沾乘,受9級特大地震影響怜奖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翅阵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一歪玲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怎顾,春花似錦读慎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至募强,卻和暖如春株灸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擎值。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工慌烧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸠儿。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓屹蚊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親进每。 傳聞我的和親對象是個殘疾皇子汹粤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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