:::

臺灣百年圖書館史

臺灣百年圖書館史

THL Project

  • 題名:政大圖檔所台灣百年圖書館史暨數位圖書館先導計畫
  • 網址:http://tlh.lias.nccu.edu.tw
  • 負責建置時間:2007

台灣百年圖書館史暨數位圖書館先導計畫網站的建置之後,我就接手學長建到一半的DSpace系統,也至此與DSpace結下了不解之緣。


台灣百年圖書館史暨數位圖書館先導計畫是政大圖檔所的頂尖大學計畫發展成果。該計畫典藏臺灣圖書館界大事記、各類型圖書館介紹、圖書資訊學教育、圖書館人物、建築與各類文件,以DSpace系統開發建置而成。

這是我第一次參加具有數十人規模團隊的數位典藏計畫,我在陳志銘老師帶領之下從學長接手DSpace系統開發,對於初學Java與JSP的我來說修改得仍不是很成熟,但大部分功能修改已經不成問題。

image

當時我使用Zoomify來製作無差段圖片瀏覽器,似乎頗受好評。在這個計畫中開發出的相當多技術,也造就了後來教育部全國通識教育資源平台的成就。

 

 image

台灣百年圖書館史在作為數位圖書館的功能有張敦媛學姐的標註功能跟SRU (Search and Retrieve via URL) 開放查詢檢索的結果。前者可允許讀者在典藏內容加註筆記,如上圖,這也是我碩士論文的起源;後者是嘗試實作以網址為基礎的檢索協定。


陳佳琪學姊以臺灣百年圖書館史作為碩士論文、研究其資訊架構與搜尋引擎之間的不同。而在計畫結束後幾年,所上老師仍努力想要為此網站建置資料,因此有在持續更新。

不過實際上,能管理此網站的學弟妹應該是越來越少了。跟許多學術計畫一樣,臺灣百年圖書館史計畫也會逐漸凋零吧。雖然令人落寞,但也無可奈何。

(more...)

教育部全國通識網

布丁布丁吃布丁

教育部全國通識網

getcdb 截圖

  • 題名:教育部通識教育資源平臺建構與永續發展計畫 臺灣通識網
    (2010以前的舊名:教育部全國通識教育資源平台建構與永續發展計畫,簡稱全國通識網)
  • 網址:課程資料庫 http://get.nccu.edu.tw:8080/getcdb/
  • 負責建置時間:2006~2010

我在政大圖檔所的學生生涯中,有許多時間投注在這個平台上。我從此計畫剛起步的前兩年負責協助建置、開發,而之後則是擔任指導、諮詢的工作。至今大部分的工作都已經由專任助理們擔任,我也只有在他們有問題時提供詢問,並不直接參與開發。

由於我主要參與的期間,該計畫是以「全國通識網」稱之,所以以下我還是以慣用的「全國通識網」來敘述這個網站。


教育部全國通識教育資源平台是一個跨校大型計劃。內容包括典藏通識課程教材、通識教師資訊、通識實務規劃知識。陳志銘老師負責此計畫中技術部份的子計畫4(2010年之後更名為子計畫3),底下聘有多位助理,而身為兼任助理的我則是負責以DSpace為主的技術指導兼部分程式開發,後期撰寫DSpace技術專書,希望將此機構典藏的技術推廣出去。

全國通識網中分成多個子計畫,包括典藏通識課程的課程資料庫、可供通識教師交流的教室資料庫、學校整體通識計畫的通識實務全景。其中課程資料庫是我投注心力最多的地方。

image

我對DSpace的修改並不僅僅只是版面上的大幅度變動。原本只是典藏資料的DSpace,現在能夠即時在線上播放影片、投影片、文件檔案,這背後還搭配了多媒體檔案轉換的功能來實作。

image

除此之外,為了因應複雜的課程結構,我設計了以XML形式來儲存metadata,突破原本系統在metadata重複資料上的限制。

大部分的技術我都直接寫在「布丁布丁吃什麼?」的blog中,請參考DSpace標籤的連結。不過後來有許多功能改良之後就沒有持續更新,而是希望未來的人可以直接參考DSpace-DLLL中的程式碼。


現在此計畫仍在持續經營中,未來仍有各種豐富的價值有待開發,也能從這上面進行相當多的研究計畫,有興趣的人請與政大圖檔所的陳志銘教授聯絡吧!

(more...)

Blogger編輯網站小圖示功能

布丁布丁吃布丁

Blogger編輯網站小圖示功能

image

大概是最近幾個星期的事情,我發現到Blogger不知不覺在設計 –> 網頁元素中新增了「網站小圖示」的功能。而http://pulipuli.blogspot.com/favicon.ico這個網址也就是我可以自訂的網站圖示囉,如下圖:

image 


強制編輯網站小圖示

網站小圖示的功能有時候在網頁元素的頁面中能看得到、有時候似乎又會被拿下來,可能是因為還是在測試中的樣子。

如果你在你的Blogger管理後台看不到網站小圖示的話,那我在這邊分享一個強制編輯網站小圖示的技巧:

從網址進入網站小圖示編輯功能

網站小圖示功能的網址如下:

http://draft.blogger.com/change-favicon.g?blogID=[blogID]

這個[blogID]可以從你管理後台的網址中看到,例如在新增及排列網頁元素的功能中,你的網址會是:

http://draft.blogger.com/rearrange?blogID=[blogID]

如下圖所示:

2011-07-06_165412

不一定會生效?

其實「布丁布丁吃什麼?」原本也沒有看到網站小圖示功能,而照上述的方式強制進入、上傳圖示之後,它也不會馬上生效。倒是過了幾個禮拜之後,忽然在不知不覺間就生效了,而網頁元素中也可以看到網站小圖示的功能。

不用在範本中設定shortcut icon

之前我寫過一篇介紹「改變你的網站圖示」的文章,這是在範本中設定<link rel=”shortcut icon” href=”圖片連結”/>的方法。不過現在因為Blogger已經允許使用者自訂網站小圖示,那麼這個方法就不需要使用囉。


結語

image

我真正發現網站小圖示生效的時候,是注意到Google閱讀器中網站圖示的改變。而後來經DeDe的詢問,才想說要把這個過程記錄下來。

(more...)

以Selenium IDE建立測試案例:無限捲頁

以Selenium IDE建立測試案例:無限捲頁

 image

無限捲頁是我近日在「布丁布丁吃什麼?」新增的功能。當使用者瀏覽到網頁末端時,他不需要點選「較舊的文章」連結換下一頁,無限捲頁功能就會自動載入下一頁的內容。

現在我要撰寫一個測試案例(Test Case),檢查無限捲頁功能是否能夠正確地運作。


測試目的

  1. 將瀏覽範圍移到畫面尾端,觸發無限捲動功能,然後確定文章數量有比之前更多。

測試指令大綱

無限捲頁測試指令編號清單

功能 測試指令編號
B. 無限捲頁功能  

1. 讀取網頁

B1-1 B1-2 B1-3

2. 觸發無限捲頁

B2-1 B2-2 B2-3

無限捲頁測試指令清單

測試指令編號及測試目的 初始狀態 操作 預期輸出資料或結果
B1-1
開啟首頁
使用者在瀏覽器中開啟首頁網址 瀏覽器開啟首頁網址 首頁正確載入,JavaScript皆有正確初始化
B1-2
確認讀取前文章數量
接B1-1 計算css:.post-outer的個數,存入變數postOuterBefore 變數值低於5
B1-3
顯示讀取前文章數量
接B1-2 在記錄中顯示postOuterBefore的值 變數值低於5
B2-1
捲動頁面到最下方,觸發無限捲頁功能
接B1-3 網頁捲軸往下移動到畫面末端 觸發無限捲頁功能
B2-2
確認無限捲頁功能開始讀取
接B2-1 確認無限捲頁讀取訊息顯示 無限捲頁正常顯示讀取訊息
B2-3
確認無限捲頁功能正常讀取完畢
接B2-2 等待無限捲頁讀取訊息隱藏 讀取訊息隱藏,下一頁文章已經載入
B3-1
確認讀取後文章數量
接B2-3 計算css:.post-outer的個數,存入變數postOuterAfter 變數值低於10
B3-2
顯示讀取後文章數量
接B3-1 在記錄中顯示postOuterAfter的值 變數值低於10
B3-3
確認讀取後文章數量大於讀取前文章數量
接B3-2 確認postOuterAfter大於postOuterBefore true


建立測試指令

這次的測試指令需要用到Selenium的元素計算與變數儲存,也不是單純用錄製(Record)功能就能完成。

詳細的指令內容,請參考Selenium的指令說明。在前一篇「以Selenium IDE建立測試案例:圖片延緩載入」中介紹過的指令,這邊就只會簡略敘述而已。

設定等待時間
  • Commend: setTimeout
  • Target: 60000
  • Value:

由於「布丁布丁吃什麼?」的首頁開啟速度非常慢。為了避免open指令在開啟網頁的過程中因為讀取太久而發生錯誤,所以測試案例正式開始之前,先將逾時限制時間設定為60秒。

B1-1 開啟首頁

接著使用open指令開啟「布丁布丁吃什麼?」的首頁。開啟之後的網頁畫面如下:

image 

B1-2 確認讀取前文章數量

待首頁開啟完畢之後,接下來就是要計算進行無限捲動讀取前的文章數量。Blogger版面中,文章會放在class為post-outer的元素中。而在這個指令中,我想要把讀取前的文章數量存放入postOuterBefore變數中。

既要計算元素的數量,也要存入變數,就要使用Selenium的storeXpathCount指令:

  • Command: storeXpathCount
  • Target: //*[@class="post-outer"]
  • Value: postOuterBefore
    storeXpathCount(xpath, variableName)

參數:

  • xpath - XPath表示式。不需要用XPath的count()函式,Selenium會自動產生。

回傳:

指定XPath符合的元素數量。

這似乎是目前為止第一次用到Value欄位的指令。storeXpathCount會需要兩個參數:第一個參數是XPath表示式,寫在Target欄位中;第二個參數是變數名稱,寫在Value欄位中。

值得一提的是,第一個參數只能用XPath表示式,而不能用平常習慣的CSS選擇器。不過XPath倒也沒這麼難學,我比較一下這兩者的差別。

  • CSS選擇器:css=.post-outer
  • XPath表示式:xpath=//*[@class=”post-outer”]

相信聰明的你應該能夠輕易地從CSS選擇器轉換到XPath表示式吧。

storeXpathCount指令不會發生任何錯誤,執行完畢之後就會直接執行下一個指令。

B1-3 顯示讀取前文章數量
  • Command: echo
  • Target: postOuterBefore的數量:${postOuterBefore}篇文章
  • Value:

為了確認storeXpathCount計算時讀取前文章的數量到底正不正確,在此以echo指令來輸出postOuterBefore變數。你可以注意到postOuterBefore變數在Selenium的指令中是以「${變數名稱}」的方式使用。你也可以在JavaScript中讀取Selenium的變數,用法是「storedVars[ “變數名稱]” ] 」,這在下面指令中也會用到。

echo會在Log欄位中顯示訊息,預期的訊息將會是:

[info] echo: postOuterBefore的數量:7篇文章

由於首頁的文章數量可能會變動,所以數值也會隨之改變。在此只要先記錄讀取前的文章數量即可,以方便進行比較。

B2-1 捲動頁面到最下方
  • Command: runScript
  • Target: window.scrollTo(0, $("#footer-wrapper").offset().top);
  • Value:

接下來執行一段JavaScript程式,讓頁面捲動到頁尾的位置。$(“#footer-wrapper”)是Blogger的頁尾區塊,如下圖:

image

B2-2 確認無限捲頁功能開始讀取

如果無限捲頁有正常執行,那麼此時應該會顯示讀取中的訊息,並有一個小型的動畫圖片,如下圖:

17510352447 首頁圖

這個讀取中的訊息會包含在id為infscr-loading的元素中,所以在此要先等待這個元素顯示,使用waitForVisible指令。

  • Command: waitForVisible
  • Target: css=#infscr-loading
  • Value
    waitForVisible(locator)

    參數:

  • locator - 元素定位器

    回傳

    如果該元素呈現可見狀態(visible),則回傳true;否則回傳false。

這邊使用了waitForVisible,而不是用waitForElementPresent,這兩者的差別在於前者特別指定該元素的狀態是「可見的」,而後者只要該元素存在這頁面中,不管是顯示或隱藏,都會回傳true。

在這邊我們要確定讀取訊息的顯示,所以是用waitForVisible,而不是用waitForElementPresent。

B2-3 確認無限捲頁功能正常讀取完畢

當無限捲頁順利讀取完之後,讀取訊息會隱藏起來。在此用waitForNotVisible來確認無限捲頁讀取訊息是否有正確地隱藏。

  • Command: waitForNotVisible
  • Target: css=#infscr-loading
  • Value:

waitForNotVisible剛好跟waitForVisible相反。當無限捲頁順利讀取完成之後,這個指令就會回傳true,然後進入下一個指令。

B3-1 確認讀取後文章數量

經過無限捲頁讀取下一頁的文章之後,在此再用storeXpathCount來記錄讀取後文章的數量,並存到變數postOuterAfter中。

  • Command: storeXpathCount
  • Target: //*[@class="post-outer"]
  • Value: postOuterAfter
B3-2 顯示讀取後文章數量

跟之前顯示讀取前文章數量一樣地,現在也用echo顯示一下postOuterAfter的結果吧。

  • Command: echo
  • Target: postOuterAfter的數量:${postOuterAfter}篇文章
  • Value:
B3-3 確認讀取後文章數量大於讀取前文章數量

如果無限捲動真的讀取了下一頁的文章,那麼變數postOuterAfter應該要大於變數postOuterBefore才對。在Selenium的指令中,可以利用JavaScript語法來撰寫表示式,並用assertExpression指令來檢查該表示式的結果是否符合預期:

  • Command: assertExpression
  • Target: javascript{storedVars['postOuterAfter'] > storedVars['postOuterBefore']}
  • Value: true
assertExpression(expression, pattern)

參數:

  • expression - 一段表示式,它將會回傳一個值。
  • pattern - 預期比對的值

回傳:

expression符合pattern,則回傳true;否則回傳false。

assertExpression特別適合用來檢查JavaScript執行結果是否正確,不過在此我是用JavaScript來檢查Selenium的變數值。如果要用JavaScript表示式,那麼語法將會是「javascript{程式}」。在JavaScript中取得Selenium變數的方法則是使用「storedVars[“變數名稱"]」。

在assertExpression中的expression參數不使用JavaScript表示式的話,expression通常會被視為字串來處理,而pattern也就是字串比對的模式了。

如果無限捲頁有順利運作,postOuterAfter應該要大於postOuterBefore,而測試也會順利通過。

測試案例結束訊息

在測試案例結束時加上一個訊息,表示測試已經結束。

    • Commend: echo
    • Target: 無限捲頁測試完成
    • Value:
幫測試案例加上註解

image

最後在測試案例中寫些註解,讓人更容易理解測試的內容與目的。這樣子無限捲頁測試案例就大功告成了。


測試運作結果

image

在Selenium IDE中按下「Play current test case」按鈕,就能夠執行目前選擇的測試案例,用以檢查剛剛建立的各種測試指令是否有如預期地運作。

檔案下載
運作影片

結語

總算是寫完了。其實我還想要繼續研究一下Selenium Remote Control伺服器的架設,不過似乎沒有這麼多時間來摸索。所以這次就先學著寫測試案例,以後有機會再繼續研究吧。

(more...)

以Selenium IDE建立測試案例:圖片延緩載入

以Selenium IDE建立測試案例:圖片延緩載入

image

圖片延緩載入是我近日在「布丁布丁吃什麼?」新增的功能。在使用者開啟網頁時,此功能會停止載入瀏覽範圍外的圖片,當瀏覽範圍移至該圖片時,該圖片才正式進行載入動作。

現在我要撰寫一個測試案例(Test Case),檢查圖片延緩載入功能是否能夠正確地運作。


測試目的

  1. 確定瀏覽範圍外的某張圖片沒有載入。
  2. 將某張沒有載入的圖片移至瀏覽範圍內,確定圖片有正確載入。

測試步驟大綱

圖片延緩載入測試指令編號清單

功能 測試指令編號
A. 圖片延緩載入功能  

1. 讀取網頁與初始化

A1-1 A1-2

2. 確認瀏覽範圍外圖片沒有載入

A2-1

3. 移動瀏覽範圍到該圖片,確認圖片載入

A3-1 A3-2

圖片延緩載入測試指令清單

測試指令編號及測試目的 初始狀態 操作 預期輸出資料或結果
A1-1
開啟指定頁面
使用者在瀏覽器中開啟指定頁面網址 瀏覽器開啟指定頁面網址 指定頁面正確載入,JavaScript皆有正確初始化
A1-2
等待圖片延緩載入初始化
接A1-1 確認瀏覽範圍外的圖片出現original屬性 瀏覽範圍外的圖片出現original屬性
A2-1
確認瀏覽範圍外的圖片沒有載入
接A1-2 確認瀏覽範圍外的圖片的src屬性不是圖片正確的網址。(實際上只是佔位圖片) 瀏覽範圍外的圖片的src屬性不是正確的圖片網址
A3-1
觸發圖片延緩載入功能
接A2-1 網頁捲軸往下移動到範圍外的圖片位置 觸發圖片延緩載入功能
A3-2
確認圖片正常載入
接A3-1 等待圖片載入正確的圖片網址 圖片正確的網址順利載入


建立測試指令

由於這個功能並不是像Selenium IDE介紹影片中只是單純的網頁點擊,所以在此並不使用Selenium IDE的錄製(Record)功能,而是純手工建立一條一條的測試指令。

詳細的指令內容,請參考Selenium的指令說明。以下我僅以會使用到的部分來進行說明。

設定等待時間
  • Commend: setTimeout
  • Target: 60000
  • Value:

    下文中每條測試指令都會以上述的方式來呈現。Commend、Target、Value分別對應到Selenium IDE中的三個欄位,見下圖:

    image

    通常Target會作為指令第一個參數輸入,而Value會作為指令第二個參數來輸入。Target不一定每次都是元素定位器,要視指令需要的參數而定。

    Selenium IDE會在下方Reference裡說明指令的用途。在此我也會簡單說明初次使用的指令用法。

setTimeout(timeout)

參數:

timeout - 逾時限制時間,單位是毫秒。超過逾時限制時間的話,該指令會發生錯誤。

使用「open」(開啟網頁)與「waitFor」開頭的指令時,都會用到逾時限制時間的設定。當該指令超過逾時限制時間,則該指令會發生錯誤。預設的逾時限制時間是30秒。舉例來說,使用「open」指令開啟網頁時,當網頁開啟超過30秒仍未完成,則「open」指令會發生錯誤。

由於「布丁布丁吃什麼?」開啟網頁的速度挺沒效率的,很容易就超過預設的30秒。在整個測試正式開始之前,我先用setTimeout將逾時限制時間設定為60秒。由於setTimeout參數的單位是毫秒,60秒 x 1000 = 60000毫秒,所以輸入的參數是60000。

然後接下來就是正式開始測試了!

A1-1:開啟指定頁面
open(url)

參數:

  • url - 要開啟的網址,可以是絕對網址或相對網址(相對網址是相對於Base URL的設定)。

使用open指令就能開啟指定頁面,用法簡單易懂。開啟之後的網頁如下:

image

等待網頁開啟完成之後,就會進入下一個指令。

A1-2:等待圖片延緩載入初始化

由於我在Blog中用了一些AJAX技巧,讀完網頁之後,還需要一段時間才會載入其他的功能,所以我需要知道圖片延緩載入初始化完成的時間。

圖片延緩載入的初始化特徵是會在圖片<img>標籤加上original屬性,用於記錄原本圖片的src網址。因此我們可以藉由偵測此屬性出現的時間,得知圖片延緩載入初始化完成。

同樣的,因為這是需要等待的測試指令,在此我使用waitForElementPresent:

    • Commend: waitForElementPresent
    • Target: css=img[title="2011-06-25_233326 設計 網頁元素"][original="http://lh4.ggpht.com/-a6cwLWbFve8/Tgg8J05sfPI/AAAAAAAAIYE/lU7sCSU6L0o/Image.png"]
    • Value:
waitForElementPresent(locator)

參數:

  • locator - 元素定位器

回傳:

如果元素定位器存在,則會傳true;否則回傳false。

再複習一下元素定位器的用法

  • identify=id
  • id=id
  • name=name
  • dom=javascriptExpression
  • xpath=xpathExpression
  • link=textPattern
  • css=cssSelectorSyntax

在這個例子中,我想要找的是瀏覽畫面以外的一張圖片,他帶有title屬性、值為「2011-06-25_233326 設計 網頁元素」。看它是否有original元素出現。正確的圖片如下:

我參考CSS3選擇器的語法,制定元素選擇器的內容:

css=img[title="2011-06-25_233326 設計 網頁元素"][original=http://lh4.ggpht.com/-a6cwLWbFve8/Tgg8J05sfPI/AAAAAAAAIYE/lU7sCSU6L0o/Image.png]

image

你可以用Selenium IDE的Target旁邊的Find按鈕來確認元素定位器是否正確。Find按鈕會找尋頁面中你定位的元素,並讓捲軸跳到該處。如果找不到或是語法錯誤,則會顯示錯誤訊息。

等待orginal屬性出現之後,測試就會進入下一個指令。

A2-1:確認瀏覽範圍外的圖片沒有載入

知道圖片延緩載入功能初始化成功之後,接下來我們要確認瀏覽範圍外的圖片並沒有src屬性中載入正確的網址。

  • Commend: assertElementNotPresent
  • Target: css=img[title="2011-06-25_233326 設計 網頁元素"][src="http://lh4.ggpht.com/-a6cwLWbFve8/Tgg8J05sfPI/AAAAAAAAIYE/lU7sCSU6L0o/Image.png"]
  • Value:
assertElementNotPresent(locator)

參數

  • locator - 元素定位器

回傳

如果元素定位器並不存在,則回傳true;如果存在,則回傳false。

注意到這邊是以否定情況來測試,而這次元素定位器中css選擇器的屬性是src,而不是前一個指令中的original。

預期src的值會被取代為圖片佔位器的圖片,而不是原本圖片的網址。測試通過的話則進入下一個指令,否則終止測試。

A3-1:觸發圖片延緩載入功能

觸發圖片延緩載入的條件是將瀏覽範圍移動到該圖片的位置。Selenium並沒有移動捲軸的指令,但是卻可用runScript指令執行JavaScript程式碼,來達到移動捲軸的效果。

  • Commend: runScript
  • Target: window.scrollTo(0, $("img[title='2011-06-25_233326 設計 網頁元素']").offset().top);
  • Value:
runScript(script)

    參數

    • script - JavaScript程式碼

    由於我的Blog中已經載入了jQuery框架,所以在這邊我直接用jQuery的offset()方法來取得圖片距離頁面頂部的位置。然後再用JavaScript既有的window.scrollTo(x, y)來指定瀏覽範圍的位置。

    透過runScript指令,即使你可能還不熟Selenium所有的指令,但你可能已經可以開始用任何你熟知的JavaScript方法來操作頁面的功能了。

    runScript指令實際上是在頁尾插入一段<script>標籤,以執行指令中的JavaScript程式碼。例如上述指令則會在頁面最後插入以下程式碼:

    <script type="text/javascript">
    window.scrollTo(0, $("img[title='2011-06-25_233326 設計 網頁元素']").offset().top);
    </script>

    但是Selenium並不能掌控JavaScript程式碼執行時發生的錯誤,runScript永遠都是正確執行,並直接進入下一個指令。

    A3-2:確認圖片正常載入

    當瀏覽畫面移到該圖片的位置時,圖片延緩載入功能應該要能順利運作,將該圖片的src屬性換回正確的網址,讓圖片順利載入正確的圖片。

    上一個指令是移動瀏覽畫面,然後還要等待圖片延緩載入替換圖片的src屬性。儘管這是人類難以察覺的短暫間隔,但這仍是要等待一小段時間。因此在此我用的是waitForElementPresent指令來確認圖片是否有正常地載入。

    • Commend: waitForElementPresent
    • Target: css=img[title="2011-06-25_233326 設計 網頁元素"][src="http://lh4.ggpht.com/-a6cwLWbFve8/Tgg8J05sfPI/AAAAAAAAIYE/lU7sCSU6L0o/Image.png"]
    • Value:
    waitForElementPresent(locator)

    參數:

    • locator - 元素定位器

    回傳:

    如果元素存在,則回傳true;否則回傳false。

     

    waitForElementPresent會等待30秒鐘(可由setTimeout指令來改變預設的逾時時間),檢查該元素是否存在。如果圖片延緩載入有順利運作,那麼title為「2011-06-25_233326 設計 網頁元素」的圖片,其src屬性應該順利成為「http://lh4.ggpht.com/-a6cwLWbFve8/Tgg8J05sfPI/AAAAAAAAIYE/lU7sCSU6L0o/Image.png

    當圖片延緩載入順利啟動之後,這個測試指令就會成功。

    測試案例結束訊息

    Selenium IDE在測試結束之後不太會有明顯的通知。跑過幾次之後,我覺得是應該在測試案例最後加上測試結束的訊息。

    • Commend: echo
    • Target: 圖片延緩載入測試完成
    • Value:
    echo(message)

    參數:

    • message - 要顯示的訊息。

    echo的訊息會顯示在Selenium IDE下方的Log欄位,如下圖:

    image

    如果看到Log中有「圖片延緩載入測試完成」的訊息,那麼就表示這整個測試案例已經跑完了,可以來確認一下有沒有哪些指令發生了錯誤。

    幫測試案例加上註解

     image

    最後,為了讓測試案例容易閱讀,我們可以插入註解(Insert New Comment)來分隔各個測試指令。

    image

    註解的內容寫在Commend欄位裡面,如上圖。註解純粹只是在撰寫時給自己看的,並不會在測試時執行任何動作,也不會在Log中出現。

    至此,整個測試案例就大功告成了。


    測試運作結果

    image

    在Selenium IDE中按下「Play current test case」按鈕,就能夠執行目前選擇的測試案例,用以檢查剛剛建立的各種測試指令是否有如預期地運作。

    檔案下載

    Selenium IDE的測試案例(Test Case)跟測試組合(Test Suite)都是以HTML形式來儲存。

    image

    你也可以直接用瀏覽器來開啟,檢視測試案例的概要內容,如上圖所示。

    運作影片

    螢幕錄影是使用Cute Screen Recorder工具,這段影片沒有錄進聲音喔。


    結語

    這是我第一次製作Selenium測試案例。一開始草草上手,在寫這篇介紹的時候,又把測試案例的內容做過相當多修改。前前後後改了好幾次,也花了不少時間來寫,甚至比單純地學習如何操作Selenium IDE還要花上了更多時間。

    如果有人發現我哪裡講錯了、或是前後不合的話,請務必告知指教。

    image

    題外話,在寫這篇的時候,WLW的排版也變得非常奇怪。左邊的邊界時常在變動,讓我挺擔心最後輸出時是否會有問題。總之,總算是寫完啦。

    (more...)

    網頁應用程式測試工具Selenium IDE介紹

    網頁應用程式測試工具Selenium IDE介紹

    image

    最近在學習程式開發的時候,發現許多人都推崇Selenium使用者端網頁應用程式測試工具。於是我試著使用Selenium來建立最近撰寫的圖片延緩載入與無限捲動功能,並學習如何使用Selenium IDE來撰寫測試案例。


    Selenium簡介

    網頁應用程式開發中,使用者介面的功能測試一向是相當困難的工程。以手動操作進行測試會受限於人力、時間,不僅容易出錯,也難以達到自動化迴歸測試的目標。

    Selenium是用來解決上述測試問題的方案。它可以在Firefox中輕易地建立測試案例(Test Case),測試案例中一條一條的指令將會像自動機器人一樣確實地執行,並且記錄一切測試的過程與錯誤。然後測試案例可以用多種程式語言(Java、PHP、Ruby)模擬不同的瀏覽器(Firefox、IE、Safari)在不同的作業系統下(Windows、OS X、Linux)的運作情況,並將Selenium的功能測試整合到你的專案中,成為完整的整合測試。

    下圖將說明Selenium專案如何運作,圖片來自於How Selenium Works網頁

    how-it-works(chi)2

    Selenium IDE

    image

    Selenium的功能眾多,在此篇要講的是Selenium IDE,也就是Firefox擴充套件(add-on)方式安裝、用於撰寫Selenium測試案例的工具。光是Selenium IDE,就足以寫網站自動執行機器人了。詳細的用法可以閱讀官方的Selenium IDE介紹。Gossip也有寫過Selenium Web測試工具的介紹。稍後幾篇建立測試案例的過程中,我也會一一帶過Selenium IDE的常用功能。

    安裝

    Selenium IDE可以直接從他的網站連結上安裝(SkyDrive備份:1.0.12),Firefox add-ons搜尋會找到很多其他輔助的功能。

    快速建立測試案例

    Selenium IDE製作的這段影片簡單易懂地告訴了我們要怎麼建立測試案例。真的,幾乎就跟你在Word裡面建立巨集一樣地簡單。它做了幾件事情:

    1. 開啟Selenium IDE
    2. 開啟Selenium IDE中的錄製功能
    3. 在Google搜尋selenium wikipedia
    4. 進入Selenium維基頁面
    5. 確認文字「popular」的存在
    6. 停止錄製,然後重播整個錄製過程

    這個方法可以讓你很簡單地建立一個測試案例,然後再來微調測試案例的指令。

    Selenium指令

    Selenium最重要的核心功能就是指令了,所有測試都是以一條一條的指令所組成。Selenium的指令簡稱為「Selenese」。以下是摘錄Selenium 0.8 Reference的主要概述內容:

    Selenium的指令(command)是告訴Selenium要做些什麼事情。Selenium的指令有三種類型:操作(Actions)存取(Accessors)驗證(Assertions)。每一個指令都會是以下表單中測試表格中的一行:

    指令(command) 目標(target) 參數值(value)
    操作(Actions)

    操作(Actions)是用來操作應用程式(指瀏覽器及網頁)的指令。它會執行像是「點選這個連結」、「選擇那個選項」的動作。如果操作失敗(Action fails)、或是發生了錯誤,將會導致現在的測試中止。

    許多操作會伴隨著「AndWait」的後綴詞,例如「clickAndWait」。這個後綴詞是告訴Selenium這個操作將會導致瀏覽器去呼叫遠端的伺服器,而Selenium應該要等待新的頁面讀取之後再進行後續的檢查。

    存取(Accessors)

    存取(Accessors)是檢查應用程式的狀態,並將結果儲存在變數中,例如「storeTitle」(儲存網頁標題到變數中)。它們也用來自動產生驗證(Assertions)。

    驗證(Assertions)

    驗證(Assertions)就像是存取(Accessors),但它們是用來確認應用程式的狀態是否符合預期的結果。這些例子包括「確定網頁標題是否是X」(X將會寫在驗證指令中)、「確認這個核取表單(checkbox)是呈現勾選狀態」。

    Selenium中所有的驗證都有三種模式:「驗證(assert)」、「辨識(verify)」以及「等待(waitFor)」。例如,同樣是驗證網頁中是否有某段文字存在,你可以執行「assertText」、「verifyText」以及「waitForText」。

    前兩者之間的差別在於處理錯誤的方式。當「驗證」發生錯誤時,測試將會終止。當「辨識」發生錯誤時,測試將會繼續執行,並在記錄中保留錯誤訊息。你可以用「驗證」來確保應用程式是在正確的網頁中,如果不在正確網頁,那麼就不執行後續的測試。而「辨識」的驗證指令則可以用於測試表單的欄位值、標題文字等細節是否正確。

    「等待(waitFor)」指令將會等待某些情況發生時才生效,這對AJAX應用來說特別好用,例如頁面等待著從伺服器回傳的資料時。當指定情況發生時,等待指令會馬上變成成功的狀態。反之,當情況一直沒有發生時,而等待時間又超過了逾時(timeout)設定,等待指令就會失敗,並終止後續的測試。

    元素定位器(Element Locators)

    元素定位器(Element Locators)是用來告訴Selenium哪些HTML元素將會用於指令中。許多指令都需要元素定位器作為「目標(target)」屬性。常見的元素定位器包括「elementId」(元素的ID屬性)、「document.forms[0].element」(文件中、第1個表單底下的元素)。

    Selenium支援多種定位器寫法:

    • identifier=id
      選擇帶有特定@id屬性的元素。如果@id沒有找到元素,則會改以選擇@name中符合 id 的值。指令需要元素定位器為參數時,大多都是以此作為預設值。
    • name=name
      選擇帶有特定@name屬性的元素。
    • dom=javascriptExpression
      以JavaScript的方式選擇DOM,開頭必定是「document.」。例如「dom=document.images[56]」。
    • xpath=xpathExpression
      以XPath表示式來定位元素。
    • link=textPattern
      選擇包含指定文字比對模式(text patterns)的連結(link)或錨點(anchor)元素,也就是<a>。
    • css=cssSelectorSyntax
      以CSS選擇器來選擇元素,請參考CSS2選擇器CSS3選擇器的說明。這應該是網頁工程師最容易使用的定位器吧。
        比對模式(Patterns)

      比對模式(Patterns)有許多用途,例如,檢查輸入欄位或是選項中是否有預期的字串出現。Selenium支援多種比對模式,包含正規表示式(regular expressions)。


    小結

    其實我本來是打算做個Selenium的簡介,然後主要是介紹以Selenium IDE建置測試案例的過程。不過光是簡介好像就足以成為一篇文章了,而Selenium令人值得一提的功能還多著呢。

    接下來兩篇文章都是介紹以Selenium IDE建置測試案例的過程,希望能以Step by Step的方式,簡單易懂地說明如何建置。讓人光看就知道怎麼建置測試案例。

    這兩篇文章是:

    請多多指教。

    (more...)

    政大博士班報考書面審查資料

    布丁布丁吃布丁

    政大博士班報考書面審查資料

    CameraZOOM-20110419150245

    上圖是2011年4月18日報考政大圖檔所博士班時使用的書面審查資料,一式五份。因為每次看到這些像是電話簿一樣厚的資料都覺得頗為有趣,所以在這邊稍微記錄一下這本的製作過程。


    內容大綱

    目錄

    按照招生規定SkyDrive備份),書面審查資料必須要有「自傳及履歷(含相關工作經驗)」、「研究計畫」、「學術著作清單及代表作」、「碩士論文或相當碩士論文之學術著作」、「大學(含)以上全部成績單」、「推薦書2份(格式不拘)」、「其他有利審查之資料」。

    我按照自己的想法,將書面審查資料的內容組織如下:

    1. 自傳:
      1. 履歷:簡單的自我介紹摘要表格,以及自己的照片。
      2. 自我介紹:敘述自己的經歷。
      3. 工作經驗與經歷:研究所、大學時期的經歷列表,由近到遠排序。
      4. 程式開發成果:因為我想展示自己做過的程式成果,所以在這邊介紹了三個做過的作品:論文系統、教育部全國通識網以及百年圖書館史。
    2. 研究計畫:
      1. 學習計畫:簡單描述我想要在博士班學習的方向。儘管通常不會符合老師的期望,不過我還是想在此講一下自己的規劃。
      2. 研究計畫:數位圖書館之閱讀標註學習社群經營與加值應用研究
    3. 學術著作:
      1. 著作目錄:以專書、期刊論文、研討會論文、報告等分類陳列自己的著作書目。
      2. 代表作:DSpace開放源碼數位典藏系統建置理論與實務,是一本專書。這是二校中的版本,書面審查資料一半的厚度是來自於這份代表作。
    4. 碩士論文:合作式閱讀標註之知識萃取機制研究。這本份量也大概佔了整本論文的三分之一。
    5. 成績單:研究所與大學的成績單。
    6. 獎狀證明:我附上了研究所與大學時期做過事蹟的相關證明,就像是研究所推甄時大家都會做的事情一樣。

    至於推薦書,由於所上禁止由所上自己的老師撰寫,所以我是請大學時期的老師幫忙撰寫推薦書。

    上述大部分內容都已經寫在布丁的自我簡介(2011年版)中,像是自我介紹、工作經驗與經歷、著作目錄等等。這一本大約八百多頁,有照片的地方大多是以彩頁呈現,因此印製成本一本大概是一千多元。然後依照規定,必須印製五本,這對於貧窮的學生來說真是一筆不小的開銷。


    加工

    即使我的美感是令人遺憾等級的差勁,我還是想辦法令枯燥乏味的書面審查資料加點東西進去。

    先從書背開始設計

    image

    當初一邊做設計一邊跟朋友聊天,朋友覺得我這書背做這麼大幹嘛。不過事實上,其實書背還有很大的空間可以考量。

    至於為什麼是先從書背開始設計……因為我就是想要做書背而已!

    封面

    做完書背之後是做封面,設計參考狼與辛香料。嗯,唉,怎麼做都讓人難以滿意。

    目錄

    之後是設計目錄中每一章的圖示,背後用淡藍色梅花圖形是表示政大校徽。當時因為常用的ICON FINDER壞掉,我還大費周章去從其他網站找圖示來加工。

    各章首頁

    CameraZOOM-20110628183021

    上述的六章中,每一章的開頭首頁,我都以色紙來印製。色紙跟一般影印紙相較之下比較硬,讓人翻頁時很容易就停在各章首頁中。

    CameraZOOM-20110630161455

    另一個效果,是讓人從側面就很容易知道各章首頁的位置。綠色色紙的各章首頁夾在白色的影印紙中,呈現出一條條綠色的標示線,相當明顯。

    側標

    CameraZOOM-20110628183002

    當然,區隔各章的位置,還是用側標最方便了。像上圖一樣,我使用見出分類片黏在各章首頁、代表作、其他著作的側邊,並用顏色來分類。

    CameraZOOM-20110630164019

    此處用的並不是用書店常見的手寫側標,用的是塑膠材質的見出分類片。見出分類片可以像活頁夾一樣,自行印製小紙條夾入,免去自行手寫側標的困擾。一盒裡附有4種顏色,也方便利用顏色來分類。

    image

    CS-見出分類片(3CM),一盒24片,紅、藍、白、綠各4片,定價35元。PChome購物有賣,我是在政大門口的今日書局買的。

    image

    側標的內容則是這樣子。

    浮貼標籤

    有許多資料是直接印成A4大小呈現,通常沒有額外加入標題、說明的空間。我一直在想,這樣人家翻到這一頁的時候,不是很難判斷現在文章的內容是什麼嗎?儘管文章裡面都有標題,但是因為排版不一,讀者可能會難以判斷。

     CameraZOOM-20110628183106

    所以我就印了浮貼的標籤,將一邊貼在頁面中的空白處,另一邊浮貼在上。當讀者看到浮貼標籤時,就可以從浮貼標籤上看到統一格式的標題,應該會比較清楚吧。

    image

    浮貼標籤的內容就像上圖一樣。但是設計依舊是讓人遺憾的等級……

    貼上去的成績單

    CameraZOOM-20110628183204(馬賽克)

    書面審查資料需要附上成績單,但是成績單大小不一,而且通常都會大於A4尺寸,無法直接單頁附在書面審查資料中。因此我將成績單沿線對摺,黏貼在A4紙的兩側,並貼上浮貼標籤作為標題。這樣子比較容易讓讀者翻閱,而不必讓成績單一張一張獨立分散。


    結語

    這本書面審查資料,除了內容撰寫之外,也用了不少手工作業來製作。感謝實驗室學弟妹與助理的協助,讓我得以在最後一刻完成並繳交。

    說是這樣說,但其實我也只有備取而已。也就是說,光是用上面的方式來製作書面審查資料,仍然是有待加強。這篇記錄的製作過程僅作為參考(至於令人遺憾的設計請不要參考吧),希望未來的人可以做出更令人眼睛為之一亮的書面審查資料吧。

    (more...)

    數位圖書館之閱讀標註學習社群經營與加值應用研究

    布丁布丁吃布丁

    數位圖書館之閱讀標註學習社群經營與加值應用研究

    2011-06-28_125518 研究架構圖 

    自從上一份研究計畫之後,我重寫了這一份研究計畫。這次主題格局都變大了,參考老師與實驗室撰寫的多年期計畫架構,融合學弟妹的論文主題,將研究計畫擴大、分成多篇主題來完成。


    摘要

    近年由於國際閱讀素養研究的評比結果,臺灣的閱讀教育逐漸受到重視。數位圖書館提供了大量的閱讀資源,適合培育網路閱讀學習社群。本研究欲在數位圖書館的網路環境中,以合作式閱讀標註學習模式與網路學習社群經營理論,設計閱讀標註推薦機制、閱讀達人激勵機制,營造一個以閱讀學習為目的的閱讀標註學習社群。在閱讀標註學習社群在閱讀標註過程中會留下標註資料,本研究將之作為社群的集體智慧,結合Library 2.0與社群導覽支援的概念,在數位圖書館中發展以閱讀社群為中心的閱讀社群導覽系統,提供更佳的閱讀學習服務,促進閱讀標註學習社群蓬勃永續發展。

    檔案下載

    研究計畫文件
    心智圖草稿


    結語:博士到底要做什麼?

    儘管研究計畫改寫是改寫了,但在寫的時候我一直有個疑惑:「這真的做得到嗎?」由於我的碩士畢業論文只是一個很小的研究,對於這種多年期規劃的研究計畫,我並沒有什麼踏實感。不過,如果我當時就能將研究計畫寫得非常漂亮,那其實也不太需要來學習了吧。

    說到頭來,究竟博士論文是要做到什麼程度呢?我常常會問老師這個問題,老師都會說:「博士畢業論文要具備點、線、面,將多篇研究串聯誠一個完整的構面。」可惜我資質駑頓、難以理解老師的形容。我只知道研究是做不完的,感覺怎麼做都只是在點與點之間打轉,要串成一條線還有可能,但做到全面……我就沒個概念了。

    具體來說,大部分學校對於博士論文的要求是「一本書」,我也看過很多學術書籍是以類似論文集的方式呈現,莫非就是要做到這種程度嗎?

    這個問題還沒個解,留待未來有機會再來思考吧!總之,博士班書面資料差不多就是如此了。

    (more...)

    合作式閱讀標註之知識萃取機制改良與驗證研究

    布丁布丁吃布丁

    合作式閱讀標註之知識萃取機制改良與驗證研究

    2011-06-28_125623 研究架構圖

    這是一份研究計畫,是在報名師大圖資所博士班時書面審查所需要的研究計畫。因為報考師大的準備時間很短,我寫得很匆促,也沒有請其他人幫忙檢查,所以寫出來其實不甚滿意。在口試的時候,口委老師也覺得這份研究計畫寫得很差,實在令人汗顏。

    不過總之洋洋灑灑還是一篇二十幾頁的研究計畫,就放在這邊做個記錄吧。


    摘要

    本研究係繼承先導研究之「合作式閱讀標註之知識萃取機制研究」開發出來的知識萃取機制,改良先導研究中發現的問題,重新將知識萃取機制應用於提昇閱讀理解成效之驗證中。同時深入探討不同控制源(Locus of Control)的學生之間,在合作式閱讀標註學習環境中以知識萃取機制來激勵的閱讀效果是否有所差異,以了解知識萃取機制各方面的適用性。

     

    ……對不起,連我自己看了都覺得寫得很糟orz

    檔案下載

    研究計劃文件
    心智圖草稿

    很趕的草稿、很趕的研究計畫orz


    結語

    這份研究計畫寫完這份之後,我感覺自己這樣子實在是不行。拿這份研究計畫出去給人看,簡直是一種羞恥。於是之後我又花了很多時間重寫了另一份研究計畫。

    「其他學校不是用同一份資料去報考就可以了嗎?」雖然很多朋友都對我提出這個疑問,而我也老實跟他們說,我覺得這一份急就章的書面審查資料並不太好,我想要花時間重寫。儘管礙於時間限制,當時也只能做到這種程度,不過既然後面學校的報名截止之間還有點時間,那麼我一定會繼續改善到最後一刻。(事實上,最後一所政大報名的時間點也真的是在最後一刻)雖然考試結果都已經出來了,但我還是想跟繳交這樣一份研究計畫去的師大說聲抱歉。能力不足,讓老師見笑了。

    (more...)

    Blogger 圖片延緩載入功能 (image lazy load)

    Blogger 圖片延緩載入功能 (image lazy load)

    image image

    繼前一篇無限捲頁功能,這一篇實作了Blogger說要做但是尚未實裝的圖片延緩載入功能。我先簡單地介紹一下圖片延緩載入的原理,然後再講述要如何安裝。


    圖片延緩載入

    當網頁開啟之後,瀏覽器會嘗試讀取網頁中的所有圖片。如果電腦效能不足、網頁圖片數量過多,剛開啟網頁的時候,瀏覽器就會像是當機一樣無法動彈,甚至連拉個捲軸看看其他地方都不行。

    為了解決網頁圖片數量過多的問題,之前我提到的CSS Sprites是一個解決方案,它嘗試將許多零星的圖片合併成一張,以節省讀取圖片需要的額外載入時間(overhead)。

    image

    另一個更直接的作法,就是這篇要談的圖片延緩載入功能。當網頁內容相當多的時候,使用者並不會一口氣就閱讀所有的內容,而只會瀏覽到「視窗所看到」的範圍。那麼在這個範圍之外的圖片,就可以暫時先不載入,而可以用像是上圖一樣的灰色背景來替代。那個灰色並不是圖片本身,只是一個佔位圖片(placeholder)而已。

    圖片延緩載入功能會分析網頁指定範圍中的所有圖片,先將使用者瀏覽範圍之外圖片全部替換成佔位圖片,停止網頁進行實際上的載入動作。

    image

    當網頁瀏覽到該圖片位置的附近時,圖片延緩載入功能會偵測到這個事件發生,並將佔位圖片替換成真正的圖片,這時才即時進行載入。也許使用者在瀏覽時會覺得怎麼突然會卡一下,不過那個瞬間也是相當地短。如果每一張要讀取的圖片也不大的話,圖片延緩載入功能並不太會影響使用者瀏覽的節奏。

    題外話:圖片預先載入功能

    提到圖片延緩載入功能,就會讓人想起另一種相反的作法:圖片預先載入功能。

    圖片預先載入是先在使用者看不到的地方載入圖片,讓圖片存入瀏覽器的快取。當使用者真的要瀏覽該圖片的時候,從快取中載入的圖片會讓瀏覽更為流暢。

    實作時,通常是在讀取這網頁的前一個網頁中實作。例如有些網站會在真正的首頁前放一個Flash影片播放的網頁,那麼當使用者欣賞影片的時候,JavaScript或其他程式就在背後偷偷地載入真正首頁中的圖片。那麼當使用者看完影片、進入真正的首頁時,首頁中的圖片就能夠快速地顯示出來。

    圖片預先載入功能的重點在於「猜得到使用者接下來要看的圖片」。在導覽功能四通八達的現代網站,我們難以預料使用者的下一頁究竟會看是什麼資料、到底要預先載入什麼圖片。而早期網站設計都喜歡的假首頁(就像上面說的,用來擺放影片之類的首頁),現在也逐漸為人捨棄不用。就算是一踏入假首頁,使用者也多會略過而直接進入真正的首頁,而沒有機會用到圖片預先載入的功能。

    另一個使用圖片預先載入功能的時機是「停留替換圖片」(hover)。當滑鼠移到某張圖片或某個位置時,將該位置顯示的圖片替換成其他圖片。許多網頁都會使用這一技巧,它也很容易讓人猜到使用者接下來要讀取的下一張圖片是什麼,因此特別適合用於圖片預先載入。圖片延緩載入Image Lazy Load Plugin for jQuery的作者Mika Tuupola也有針對圖片預先載入功能提出一個方法,詳情請看Preload Images Sequentially With jQuery這篇文章。


    安裝圖片延緩載入

    安裝小工具

    跟大多數Blogger額外設定的功能一樣,圖片延緩載入功能也是從新增HTML/JavaScript小工具開始。

    2011-06-25_233326 設計 網頁元素

    進入Blogger的管理介面,進入「設計」的「網頁元素」,在頁尾的地方新增小工具。

    2011-06-25_233246 新增JavaScript

    選擇其中的HTML/JavaScript。

    image

    標題留空,內容填入以下圖片延緩載入程式碼:

    <script src='http://www.google.com/jsapi' type='text/javascript'></script>
    <script type='text/javascript'>google.load("jquery","1.2.6");</script>
    <script src='http://sites.google.com/site/puddingchen35/2011-06-blogger-image-lazy-load/jquery.lazyload.mini.js' type='text/javascript'></script>
    <script type="text/javascript">
    $("#main .blog-posts .post-body img").lazyload({
    effect : "fadeIn",
    placeholder: "https://sites.google.com/site/puddingchen35/2011-06-blogger-image-lazy-load/grey.gif"
    });
    </script>

    儲存設定,這樣就完成了。

    設定圖片延遲載入

    在圖片延遲載入的程式碼中,有兩個地方可以設定,位於以下範圍中:

    $("#main .blog-posts .post-body img").lazyload({
    effect : "fadeIn",
    placeholder: "https://sites.google.com/site/puddingchen35/2011-06-blogger-image-lazy-load/grey.gif"

    });

    1. effect:顯示真正圖片時的特效。預設值是「show」,表示直接替換;「faceIn」是淡入效果。
    2. placeholder:佔位圖片。不使用佔位圖片的話,圖片甚至連保留位置都沒有,而讀取時就會像是突然插入一張圖片、即時改變頁面的排版,我覺得不是很好看。在此採用原作者建議的灰色底圖作為佔位圖片,你也可以自行改為其他佔位圖片。

    其他還有很多設定,詳情請看Lazy Load Plugin for jQuery的說明。

    製作參考

    我在建構此功能時,一開始是先從別人的Word Press網站上看到的jQuery Image Lazy Load外掛。而這個外掛其實又是源自於jQuery的Lazy Load插件。製作者Mika Tuupola將圖片延緩載入功能寫得相當完整,因此我也沒有多做修改,以下只是額外撰寫了供Blogger使用的語法而已。


    結語

    image

    圖片延緩載入功能安裝之後,基本上就可以放著正常運作。可是我用一用赫然發現,偶爾還是會出現像上圖一樣的讀取失敗畫面。我在想這比較可能是Chrome功能的問題,而不是圖片延緩載入功能的問題吧。

    其實圖片延緩載入比前一篇的無限捲頁還要早做,而且比無限捲頁還簡單很多,但因為怕無限捲頁做到最後自己都忘了,所以這一篇才延緩到現在才寫吧。

    (more...)