2010-01-31

Blogger hack: AJAX LOADING 動態文章

loading.png

熱衷於blogger的人多半都帶有DIY改造的偏執,得了不把blog弄的很華麗就會死的病。畢竟這是自由度最高的BSP,不大改特改實在是對不起辜狗大神提供的免費午餐。這一路走來,從一開始看到什麼酷炫功能就胡亂加上,到後來越來越講究所謂的《讀者體驗》。我的改造之道漸漸趨向【不加不必要的東西】、【盡可能使用原生功能】,畢竟內容才是一個部落格的主軸,把邊欄妝點的花花綠綠實在有些譁眾取寵。

在NS近期的改造之道上,有幾個重點:就是追求載入極速、內容動態化、盡可能的強化讀者搜尋與閱讀的便利性。今天要教各位的這個小技巧,就是能把Blogger原生標籤與下方的Pager發揮淋漓盡致的動態載入功能。

如果有在碰blogger Hack的人一定有聽說過Hackosphere的Neo Template,這個可說是動態文章概念的始祖,它是透過讀取JSON的方式再用Javascript把內文格式給產生出來,誠如作者所說,這個模版超快、非常快、閃電霹靂快...

但是缺點也很明顯,作者捨棄了原有的部落格格式,透過JSON讀取所產生出來的內容會不完整(例如回應部份、還有後來blogger加入的評分、讀者觀感等新功能),再者全部透過Client端JS來作用,那麼只要碰到關閉JS的讀者,那整個blog就死掉了,因為種種原因而讓我覺得不是一個理想的呈現方式。

這當中NS也有試過hans的Table of content,還有Lvchen兄的標籤選台器2.0改造版,想讓讀者可以先快速瀏覽標題再決定要不要點選閱讀,不過成效普普通通,我想最主要是因為光看標題遠不如看文章摘要來的有吸引力。

這陣子因為blogger發佈了官方版的繼續閱讀功能,可以大幅縮減摘要文章的內容(以往的繼續閱讀只是用CSS把其他部份給隱藏,所以實際上在載入的時候還是會讀取這些html碼。官方版的則是直接在server端就把非摘要部份全部砍掉,Request回來的檔案會變清爽很多);加上我最近裝的Lazyload功能可以大幅提升含大量圖片的網頁讀取速度;再加上我最近認真的玩了一些Jquery,有種任督二脈被打通的感覺(笑)

因此我腦中靈光一現,為什麼不用AJAX了方式來Load remote page,再把現有的某區塊給更新就好呢?這樣我也不用煩惱什麼JSON解析完還要重新Render頁面的鳥事啦。

嘖~講到這大概大家要一頭霧水了,各位不妨直接體驗一下吧。

01.jpg
首先可以試試內文標籤的部份,點下之後...

02.jpg
文章不見了,出現了loading的圖示...

03.jpg
ㄟ~原本點標籤會出現的頁面怎麼出現了?!而且網頁並沒有reload的閃動,只有在主欄位這邊有變動而已。

人客阿!這就是AJAX阿!AJAX不是只有搞CSS特效而已,非同步Request跟動態更新才是箇中精髓。

04.jpg
同樣的,最底下的PAGER部份也可以完美的做到動態換頁的效果,如此一來讀者就可以快速的瀏覽整個blog的文章摘要,或者是特定標籤的文章摘要了。

05.jpg
當然~標籤Widget也可以加上這樣的動態效果,附帶一題,blogger這邊已經有了原生的標籤雲了,而且還多了【選擇欲顯示標籤】的功能,NS強烈建議原本用第三方hack的人換回正版標籤雲阿 :P

拉拉雜雜說了一堆,大家一定迫不及待想知道這個hack是怎麼做的!

06.jpg
其實原理非常簡單,如果你仔細觀察的話就會發現點選標籤會到達的頁面,跟點選pager切換的頁面,有影響到的都只有主欄位這個區塊,而呼叫這些頁面跟PHP加上一些參數值去控制頁面的內容的方法有點相似。所以,我們可以利用Jquery的.load()功能,丟進特定URL,抓取該頁面特定名稱的區塊,再載入現有的區塊內,即可達到動態載入內容的效果。

以我的部落格來說,這些文章entry都是被一個.blog-posts的div給包起來的(這應該是內建模板的預設類別,如果你不曉得自己部落格是叫什麼,可以利用Firefox外掛Web developer的顯示元素資訊去找),所以步驟就是:

  1. 將欲使用動態載入效果的超連結先綁定click事件
  2. 當連結被點擊就會觸發寫好的function
  3. function第一步是先抓到連結的href,然後在後面加上".blog-posts"字串,以方便待會使用.load()
  4. 再來就是抓到現有頁面的.blog-posts div,然後使用.load()把內容灌進去
  5. (optional)如果想讓pager也能有動態載入效果,最好把底下的pager區塊也一併更新到新的連結

打完收工,流程就是這樣而已,沒幾行程式好寫,當然你要厚工一點像我還加入loading.gif來做讀取中間的緩衝也是可以,流程部份就加上先用.html()寫入圖片這樣...

程式碼部份,請先加入大家的好朋友jquery,我建議沒有空間的人可以直連google網路函式庫<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
再來就是在document ready之後加入click事件綁定<script>
// AJAX link
$(".ajax-link").live("click",function(){
var url = $(this).attr('href');
var pagerUrl = url +" #blog-pager";
url += " .blog-posts";
$(".blog-posts").load(url);
$("#blog-pager").load(pagerUrl);
return false;
});
</script>

這邊可以看出,NS是去找DOM裡面抓.ajax-link的連結,然後綁上這個事件function,所以只要連結有掛上這個類別都會觸發事件。至於.live()這是為了讓動態載入的pager,讓載入之後仍能有作用,如果單純用.click去綁事件的話,動態載入後就算叫.ajax-link的連結也會失效喔。

以上這些JS script請放在<head></head>裡,完成這步之後就來對template動點小手術吧!(對欲作用的連結掛上ajax-link的class)

請先打開小裝置範本:

  1. 首先是內文標籤部份,找到<b:loop values='data:post.labels' var='label'>,底下應該就是內文標籤的a tag了,加上class="ajax-link"。
  2. 再來是標籤Widget的部份,找到該widget的位置,裡面應該有兩個a tag,這取決於你是選原本的行列模式還是標籤雲模式,不過嫌麻煩的話就都加上class="ajax-link"吧
  3. 最後是Pager的部份,先找到<b:if cond='data:newerPageUrl'>,把底下的a tag掛上class,再下去沒幾行有<b:if cond='data:olderPageUrl'>,同樣的步驟。

NS只有針對這三種連結加入動態載入的功能,並沒有把全站的所有連結都掛上,原因是,在載入單篇文章含回應的時候,如果是使用內嵌式回應,則內嵌回應功能會喪失;另外,動態連結並不會更新網址列的網址,會造成讀者讀到某篇文章,上頭卻不是該篇網址的靈異事件,最後一點就是,其實我也想騙一點廣告刷新的閱覽數啦 XD 畢竟我的目的是要讓讀者可以快速瀏覽文章摘要,基本上這三種連結綁上動態載入就已達到我的要求了...

姆~教學大概就是這樣,請有興趣的各位自己試看看吧!有問題請各位同學自行發問~感恩

小提醒~記得一定要先備份template阿,免得改失敗了救不回來,壞了NS恕不負責 XD

18 回應:

LVCHEN 提到...

我試了一下,真的很光速,有種更環保的感覺...大推

我只有一個問題,因為沒有換頁(AJAX),貌似無法使用瀏覽器的上一頁回到之前瀏覽的頁面。

還有,現在這個 hack 只有應用在標籤上嗎?如果文章連結也能應用,那真的就更順暢了。

NightSpirit 提到...

LVCHEN
是的,因為AJAX的關係所以上一頁沒有作用...

另外這個hack當然可以應用在單篇文章上,只要把連結也掛上ajax-link這個class即可。但如同我在文末說的:載入單篇文章時底下的嵌入式回應會失效,變成一定要用另開視窗的回應模式。還有上面的網址列會跟當前的文章內容不符。

因為一開始的目的只是單純希望讀者在找文章的時候頁面不會重複refresh,所以才單純應用在摘要部份...

kohaka 提到...

請問page的部份,我改成功後,按較舊的文章沒問題,但是換頁後最底下的較舊的文章和新文章還有home都消失了,沒辦法再按較舊的文章,請問怎麼會這樣?
就差這步了,其他改完使用上都很正常,
就page部分出問題○rz

NightSpirit 提到...

kohaka,首先你要先確定你pager的div是不是跟我預設的一樣,如果不是的話可能要到模版去做設定或是更改一下我jquery的檔案,你把你blogger的位置給我我去幫你看一下好了...

kohaka 提到...

http://kohaka.blogspot.com
這是我的blog,
雖然模版是套用別人的就是@@

kohaka 提到...

http://www.templatesblock.com/2009/12/coabat.html#more
對了,我是套用這個模版

NightSpirit 提到...

我發現問題了~ 是我自己在blog-pager裡多包了一個div tag,把js裡var pagerUrl = url +" #blog-pager div";改成var pagerUrl = url +" #blog-pager";即可 XD

老吳 提到...

你好,請問可以分享您的有話大聲說Widget製作方式嗎?感激不盡~

NightSpirit 提到...

老吳你可以去看http://www.google.com/friendconnect
google friend connect,那個是其中一個留言版功能

老吳 提到...
作者已經移除這則留言。
老吳 提到...

感謝您的回覆,我昨天找到也裝了,可以是礙於他沒有暱稱欄位,常會造成匿名留言,最後還是放棄了...

關於您這篇文章,請問如果我已經將首頁圖片套用lightbox,有方法可以讓頁面載入時,圖片載入都套用這個loading效果嗎?

昨天上網找到這篇文章http://jqueryfordesigners.com/image-loading/,不過他的方式好像每張圖片都要套一次function,可以只修改lightbox裡面的程式,讓有套lightbox的圖片載入時也是同樣效果嗎?

我用的燈箱是http://www.no-margin-for-errors.com/projects/prettyphoto-jquery-lightbox-clone/

以上感謝您的回應~

Lan 提到...

您好,請問如何修改才能實現載入頁面之後自動回到頁面的頂端呢,感激不盡

NightSpirit 提到...

在觸發ajaxlink的function裡加一行
document.getElementById('main').scrollIntoView(true);
其中main是你要跳至的div id,也可以設成header之類的,看你想定位到哪邊就設什麼囉

匿名 提到...

想請問你,這個可否應用到pixnet的blog

NightSpirit 提到...

匿名:

這是Blogger專用的喔

Nebadd 提到...

請問像我部落格這種動態標籤雲是不是不適用?
因為我加了class後還是沒反應?
另外如果要加入loading.gif的話語法該怎麼寫呢?THX

NS 提到...

動態標籤雲因為是別的js外掛~ 我要看了程式碼才會知道喔

loading gif的做法是在 .load()前用一個 .html把img tag寫進blogpost的div

Nebadd 提到...

我這有記載語法:
http://nebadd.blogspot.com/2009/02/flash.html

關於loading.gif,我參照你的語法但是出現錯誤?(因為標記 'div' 顯示在標記 'head' 內,所以您的範本無效。)
請問這問題在哪?您不也是寫在head內嗎?

張貼意見

非Blogger會員的朋友,請在"發表意見的身份"選單選用"名稱/網址"填入您的大名,這樣NS才知道該怎麼稱呼你喔 :)

文章回應

友格友品

  • 便宜又好用的契約工 - 家人聽說中壢有間外資企業的待遇、福利不錯,便不斷「鼓勵」本人轉換就業跑道,心想要是不親身體驗家人的道聽塗說,他們會像故障地錄放影機重覆播放相同的片段,認為沒去應徵這份工作很可惜。於是我用九個月的寶貴光陰,證明高中同學的先見之明(萬一沒升正職怎麼辦?),然而有智慧的他只糟蹋卅天。 人資經理與數位應...
    22 小時以前
  • 最好的時光 - Samsung NX200(十五)酒神,巴克斯 - 這幾年來,用了很多相機。 [image: Samsung_NX200_Bacchus_01] 起初只是基於購買新相機的興奮感,後來轉變成Camera log般的紀錄,練習把相機拍的漂漂亮亮,就當成是一個記錄吧。 [image: Samsung_NX200_Bacchus_02] 寫著寫著,不知不覺,自己的...
    1 天以前
  • You are my cup of coffee - 情人節,這個總是令人感到欣喜,抑或是心煩的節日,不過甜食愛好者或許值得期待,因為此時無論走到哪,巧克力都在促銷打折。 想起在倫敦小巷裡遇見的糖果店Mrs Kibble’s Olde Sweet Shoppe,只是路過,卻被櫥窗裡五顏六色的糖果給吸引,小小的店面擺滿了無比繽紛的糖果們,還以為自己不小心闖進了童話...
    2 天以前
  • 敘事曲終,人,散 - 越離越遠,我以為的那些仍然繼續開始支解崩壞; 細數空氣中的灰塵,聽每一顆光影裡殘餘的餘韻,然後一個字一個字寫下也沒甚麼人要聽的故事,暫且稱做敘事曲吧。 曲終也許就是人散。 這也沒甚麼好或不好,人生就是如此,如同房屋有拆有遷,或者與人有合有離。只是每一道流沙都會刮下細細小小的刮痕,久了才發現原來眼鏡也會因...
    2 天以前
  • 主題偵測的暫存內容 (bbfa88e0-2cbe-4988-a958-401f8cdc940e - 3bfe001a-32de-4114-a6b4-4005b770f6d7) - 尚有未刪除的暫存文件,請手動刪除。(42ad9a55-b336-488e-aa69-2e8d934548d1 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
    4 天以前
  • 阿飘有没有? - *晚上考完试,要回宿舍就必须步上梯级走过一条长长的行人天桥。* * 每次在步上梯级时,抬头一看都会觉得。。。。。。* *阿飘随时会迎面扑来啊~~~~~~~~~~~~~~~~~ *
    5 天以前
  • You hurt me, I hurt them. - Suffering doesn't necessarily help one to be more patient. The pain of being hurt, if not healed, will hurt others. Because of being afraid of being hurt a...
    1 週以前
  • 平安夜之南境之旅 Key West – Day 2 亂逛篇 - *…看 Day One* 一般來到 Key West 的遊樂行程分為數種,最受歡迎的當然就是緊張刺激的水上活動,Jet Ski、parasailing等等,搭配 12 月溫和的天氣,完全沒有鹹腥味的海水,簡直就是完美的水上天堂。可惜的是有個小 eThaN 跟在身邊,大部分的水上活動都不適合小小孩,我們只好...
    1 週以前
  • N式滷牛腱 - 上個禮拜試作了一次滷牛腱,發現這道菜簡單易學,應該又是留學生必備的一道菜式,跟我之前做過的牛肉麵比起來,我認為選用牛腱肉並整塊煨滷,口感風味上更上層樓,所以以後如果我做牛肉麵大概也會用這種方式來實現。 廢話不多說,N式廚房上菜囉。 首先當然是肉,選用Beef Shrank,一磅約3.99。 生薑去皮打扁...
    1 週以前
  • Android 4.0 技術與就業研討會 - 3/7 日下午有個「Android 4.0 技術與就業研討會」。我講的部分是 Fragments,這是 Android 3/4 中最重要的一個新架構。有興趣的歡迎報迎參加。 這個活動是由台灣知識庫主辦,時間是 3/7 1pm-5:30pm,地點應該就在台北車站附近的開封街一段32號4樓。
    2 週以前
  • - 1.yesterday is here. 2."她終於來到一個可以繼續活著也可以死去的年紀。" 3.書店關掉後,星巴克像個尷尬的中產房車每天臨停在那裏。然後改裝小電影院,停業咖啡館,整頓四不像的頹喪,停止喃喃自語,邁向庸庸碌碌,越走路越趕不上更迭。踉蹌的跌倒,順勢躺下,發現自己在家,因為也沒有地方可以去了。...
    1 個月前
  • Blogger’s Brand New Google+ Page - *(Cross posted from the Blogger Buzz Blog) * Earlier this week, the Google+ team launched Pages, a new way for you to keep up-to-date with your interests ...
    3 個月以前
  • ▌Westlife西城男孩2011台北演唱會隨筆 - Westlife的歌曲是我和妹妹的回憶、進入西洋音樂學英文歌的開始,我在以前的網誌是這樣介紹的。 當時怎麼也不會想到有天能現場看他們唱歌。 開場前,布幕映照觀眾席,有的揮舞國慶日國旗、或持Westlife出身的愛爾蘭國旗、當然也許多高舉應援燈牌左右揮舞的歌迷。外國夫妻、小孩子、大人男女被照到反映各不相同,...
    4 個月以前
  • 我要搬家了 - 謝謝大家長期以來對小弟的支持,今天終於下定決心要搬家,以後請各位朋友 來我的新部落格喔.... 新的部落格
    4 個月以前
  • 久違的豎笛組聚+學妹成發 - 命運是很奇妙的走在街上遇到阿Keng(當屆42nd豎笛組組長)其實也是巧合算算日子我們大約也有五年不見了吧...久別重逢兼以路上巧遇驚喜非常阿Keng說要去看小小小學妹(53rd)的成發還約了其他的CL寶貝們二話不說,我當下就答應決定前往 星期六(5/20)下午到達中油大樓會議廳看到出席的大家時心情真是開心今天這...
    8 個月以前
  • 生命有限,愛與夢無限 - 生命有限,這是所有人都知道的事,只是很多時候,我們並不會刻意去想它,總覺得自己會有很多很多的時間才會體會到生命有限這件事。然而命運有時會很喜歡忽然提醒我們,你的限期就在不遠處。 期限將至時,我們該如何去面對?身邊人又該如何面對?這似乎會牽引出很多很多的想像。當中對大限將至的人,我們可以有多少愛去付出?又有多少夢...
    9 個月以前
  • 屬於自己的角落 - [image: IMG_7041.jpg] 每個上班族都希望可以在下班時有個讓自己身心都放鬆的地方 這幾天晚上幾乎都是這樣度過的,開一盞微微的燈光,一個人攤坐在椅背上看書、上網... 喜歡這種光線聚焦在一個焦點的感覺,就算周遭在怎麼紛亂,此時視線也會被這道光侷限著 看不清外面的景況,也許也不會被外面的世界打...
    1 年前
  • Maroon 5 - Misery haha...too much love
    1 年前
  • GPA魔人請退散 - 真的很受不了那些對分數斤斤計較的人。是的,我知道平均成績在B以下的話就拿不到學位,可是有必要為了拿A而不停地要求教授提供extra credit嗎? 更何況即使某一堂課fail了還有其他的課可以把平均拉起來(對於某些人來說,拿不到A就等同是fail),何必把自己搞成沒有拿到A就等於世界末日來臨了? 每次...
    2 年以前