【乾貨】JavaScript DOM編程藝術學習筆記4-6

來源:互聯網
上載者:User

標籤:span   研究   另一個   預設   source   載入   font   圖片   nod   

四、案例研究:JavaScript圖片庫

js:

function showPic(whichpic){

    //取得連結

   var source=whichpic.getAttribute("href");

   //取得佔位圖

   var placeholder=document.getElementById("placeholder");

   //改變佔位圖src屬性

  placeholer.setAttribute("src",source);

  //取得文字描述

  var text=whichpic.getAttibute("title");

  //取得佔位文字

   var description=document.getElementById("description");

   //改變佔位文字值

   description.firstChild.nodeValue=text;

}

在html中調用:

<a onclick="showPic(this); return false;"></a>

註:

nodeValue屬性:node.nodeValue節點的值,通常用這個屬性來擷取文本值,但要注意的是在<p id="description">text</p>中,description的值是null,它的第一個子節點firstChild的值才是text

nodeType屬性:節點的nodeType屬性返回的是數字,共有12種值,其中,元素節點是1,屬性節點是2,文本節點是3.

childNodes屬性:返回的是所有類型的節點,不僅是元素節點。

 

五、最佳實務

利用元素的class屬性,將事件處理函數從html中分離出來。

window.onload=prepareLinks;

function prepareLinks(){

   //擷取所有連結 

   var links=document.getElementsByTagName("a");

  //遍曆所有連結

  for(var i=0; i<links.length; i++){

     //找出對應類的連結

    if(links[i].getAttribute("class")=="popup"){

       //為對應類的連結執行事件處理函數

       links[i].onclick=function(){

          popUp(this.getAttribute("href"));

          return false;

       }

    }

  }

}

function popUp(winURL){

   //開啟一個新視窗顯示winURL,視窗名為popup,寬320,高480

   window.open(winURL,"popup","width=320,height=480");

}

 註:

平穩退化graceful degradation:讓一些不支援javacript的瀏覽器也能順利完成基本的操作。比如就算有事件處理函數,在連結中將a href設定成真實的URL。比如搜尋機器人searchbot基本都不能理解javascript代碼,如果不能平穩退化,搜尋排名就會受損。

漸進增強:用一些額外的資訊去包裹未經處理資料,按照漸進增強原則建立的網頁幾乎都能平穩退化。css代碼負責關於表示的資訊,javascript代碼負責行為的資訊,他們都應該表現為額外的指令層。

為什麼用window.onload來執行函數,而不是直接執行:不管js代碼放在頭部還是尾部,都有可能在指令碼載入時文檔還不完整,有些方法就不能正常工作。而document對象是window對象的一個屬性,當window對象觸發onload事件時,document對象已經存在。

向後相容:對象檢測object detection如果你不理解這個方法,請離開。if(!document.getElementById) return false;

效能考慮:盡量少訪問DOM和盡量減少標記數量;合并和放置指令碼,將代碼合并到一個js檔案中,可以減少載入頁面時發送的請求數量。另外,檔案如果放在head裡會導致瀏覽器無法並行載入其他檔案,一般放在文檔末尾body之前可以讓頁面變得更快;壓縮指令碼,有很多壓縮公用程式,引用壓縮版本,另一個在即添加註釋作為副本。

 

六、案例研究:圖片庫改進版

將圖片庫案例的事件處理函數從html中分離出來,並增加了對象檢測來保證平穩退化。

function prepareGallery(){

   //對象檢測

   if(!document.getElementsByTagName) return false;

   if(!document.getElementById) return false;

   if(!document.getElementById("imagegallery")) return false;

   //取得圖片連結大架構   

   var gallery=document.getElementById("imagegallery");

   //取得圖片連結

   var links=getElementsByTagName("a");

   //遍曆連結

   for(var i=0; i<links.length; i++){

      //對每個連結執行onclick事件,在佔位showPic

      links[i].onclick=function(){

          //showPic執行成功了返回false,阻止預設行為。失敗的話返回true,繼續執行預設行為,到連結地址

          return showPic(this)? false: true;

      }

   }

}

function showPic(whichpic){

  //對象檢測

   if(!document.getElementById("placeholder")) return false;

   //取出連結的href

   var source=whichpic.getAttribute("href");

   //獲得佔位圖元素

   placeholder=document.getElementById("placeholder");

   //檢測佔位元素是否是圖片元素

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

   //改變佔位圖地址為連結圖片

   placeholder.setAttribute("src",source);

   var description=document.getElementById("description");

   //有文字描述元素的話繼續執行

   if(description){

       //連結title屬性不存在的話賦值為空白

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

       //改變文字表述為連結的title

       description.firstChild.nodeValue=text;

   }

   //函數執行成功的話,返回true

   return true;

}

註:

this :是執行事件處理函數onclick時關聯的那個元素連結

onload事件:如果只有一個函數的話直接window.onload=function1;這種情況下再加一個函數的話window.onload=function2;只有最後的那個才會被實際執行。所以如果多個的話要整合一個addloadEvent,這樣每次要增加函數的話只用增加一條語句:addLoadEvent(func2);即可。

     function addLoadEvent(func){

        //把現有的處理函數值存入oldonload

         var oldonload=window.onload;

         //如果還沒有綁定任何函數,則把func添加給它

         if(!typeof oldonload!="function"){

            window.onload=func;

        }

        //如果已經綁定了函數,則新函數追加到末尾

        else{

           window.onload=function(){

              oldonload();

              func();

           }

        }

     }

DOM Core和HTML-DOM:

getElementById getElementsByTagName getAttribute setAttribute都是DOM Core,他們並不專屬於javascript ,任何支援DOM的語言都可以使用;另外它們的用途也不僅限於處理網頁,可以處理任何一種標記語言編寫的文檔。

HTML-DOM通常更短,用一個點比如用document.forms來代替document.getElementsByTagName("a"),用placeholder.src=sourc來代替placeholder.setAttribute("src",source)

 

【乾貨】JavaScript DOM編程藝術學習筆記4-6

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.