2010-03-13

Blogger Hack: 最新文章 AJAX 縮圖版



最近讀到一篇關於Blogger的JSON中,如何截取出Media$thumbnail的文章,Media$thumbnail是Google自動針對網誌內的圖像所產生的72x72縮圖,利用這個JSON物件就有辦法做出帶縮圖的最新文章Widget,我把程式碼與Abin大大的最新文章模組「終極版」做了一個融合,就生出這套新插件可以給大家用啦。

使用教學:(我盡量簡單化安裝步驟,裝起來應該不會有太大難度)
  • 到[設定]->[網站提供]->將文章資訊提供改為[完整],否則本外掛會無法使用喔。
  • 到[版面配置]->[網頁元素]->新增[HTML/JAVASCRIPT]元件。
  • 在內容表格填上下列程式碼
    <style>
    /* 最新文章 */
    #RPosts ul{margin:0;padding:0;list-style:none;}
    #RPosts li{display:block; margin:1px 0;height:52px;line-height:20px;padding:0 5px;border-bottom:1px dotted #ccc;}
    .RP-title{font-size:13px;display:block; padding:5px 0 0;}
    .RP-thumb{width:40px;height:40px;border:1px solid #ccc;padding:2px;margin:3px 8px 3px 0;float:left;}
    #RP-nav{font-size:14px;margin-top:8px;text-align:center;}
    </style>

    <div id="RPosts"></div>

    <script language="javascript">
    var nPostStartIndex = 1;
    var nPostShow = 5;
    var noImage ="http://1.bp.blogspot.com/_u4gySN2ZgqE/SosvnavWq0I/AAAAAAAAArk/yL95WlyTqr0/s400/noimage.png";

    function showRecentPosts(nIndex) {
    if (!nIndex)
    nIndex = nPostStartIndex;
    var sFeedURL = '/feeds/posts/full?orderby=published&start-index='+nIndex+'&max-results='+(nPostShow+1)+'&alt=json-in-script&callback=generatePosts';
    var script = document.createElement('script');
    document.getElementById('RPosts').innerHTML = '  Loading...';
    script.setAttribute('src', sFeedURL);
    script.setAttribute('type', 'text/javascript');
    document.documentElement.firstChild.appendChild(script);
    }

    function generatePosts(json) {
    function compareentry(a,b) {
    order= Date.parse(a.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/, '$1/$2/$3 $4 GMT')) - Date.parse(b.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/, '$1/$2/$3 $4 GMT'));
    return 0-order;
    }

    var sortentry = json.feed.entry.sort(compareentry);
    var nIndex = parseInt(json.feed.openSearch$startIndex.$t);
    var nTotalPost = parseInt(json.feed.openSearch$totalResults.$t);

    var sHTML ='<ul>';

    for (var i = 0, Post; Post = sortentry[i]; i++) {
    if (i >= nPostShow)
    break;
    var title = Post.title.$t;
    // Fetch thumb script by Aneesh of www.bloggerplugins.org
    var thumb;
    try{thumb = Post.media$thumbnail.url;
    // If image source from flickr than use exsisting thumbnail
    if(thumb.match("flickr")=="flickr")thumb=thumb.replace(/\_[stmo]\.jpg|\.jpg/,"_s.jpg");
    }
    catch (error){
    s=Post.content.$t;a=s.indexOf("<img");b=s.indexOf("src=\"",a);c=s.indexOf("\"",b+5);d=s.substr(b+5,c-b-5);
    if((a!=-1)&&(b!=-1)&&(c!=-1)&&(d!="")){
    thumb=d;
    // If image source from flickr than use exsisting thumbnail
    if(thumb.match("flickr")=="flickr")thumb=thumb.replace(/\_[stmo]\.jpg|\.jpg/,"_s.jpg");
    }
    // No mediathumbnail and any image in the article
    else thumb=noImage;
    }
    var j = 0;
    while (j < Post.link.length && Post.link[j].rel != "alternate")
    j++;
    var link = Post.link[j].href;
    sHTML += '<li><a href="'+link+'"><img class="RP-thumb" src="'+thumb+'" /><span class="RP-title">'+ title +'</span></a></li>';
    }
    sHTML += '</ul>' + generatePostLink(parseInt(json.feed.entry.length), nIndex, nTotalPost);
    document.getElementById('RPosts').innerHTML = sHTML;
    }

    function generatePostLink(nFetch, nIndex, nTotalPost) {
    var bOld = (nFetch > nPostShow);
    if (bOld) nFetch = nPostShow;
    var sResult ='<div id="RP-nav">';
    if (nIndex > nPostStartIndex)
    sResult += '<a href="javascript:showRecentPosts('+(nIndex-nPostShow)+');" title="Newer Posts">上一頁</a>  ';
    sResult += '第'+nIndex+'-'+(nIndex+nFetch-1)+'篇, 共'+nTotalPost+'篇  ';
    if (bOld)
    sResult += '<a href="javascript:showRecentPosts('+(nIndex+nPostShow)+');" title="Older Posts">下一頁</a></div>';
    return sResult;
    }
    </script>

    <script language="javascript">showRecentPosts();</script>
    <a style="clear:both;float:right;font-size:8px;color:#ccc;padding:2px;" href="http://blog.nightspirit.tw/2010/03/blogger-ajax.html">MOD BY NS</a>
  • 開頭的STYLE為此元件的CSS,可以自行針對版面做客製化。
    #RPosts li - 此li元件為每一列圖片加標題的外框,我預設52px高,有加下底線,可以透過設定margin調整項與項的間距,透過padding決定內容與外框的間隔。
    .RP-title - 標題的span元件,可以透過font-size來改大小,padding來決定與頂端的間隔。
    .RP-thumb - 縮圖的img元件,可以透過width、height來調整縮圖大小,margin-right來決定與標題文字的間隔。
    #RP-nav - 底下的訊息列與上下頁籤,是一個div物件,基本上就隨你喜歡來操作囉。
  • var nPostStartIndex = 1; 此參數決定你要從第幾頁開始。
  • var nPostShow = 5; 此參數決定每頁entry的個數,建議這個不要設太高,畢竟讀取太多縮圖會花較長時間。
  • 對JS熟習者,上下頁或特定字詞可以在內碼中找到並自行替換,元件結構也可以透過填入SHTML的順序來加以變動。
  • 為了推廣此套件NS有在底下放了一個MOD BY NS的小連結,如果覺得這外掛好用的話請不要把他拿掉,如果真的覺得礙眼的話,請用CSS #RP-link{display:none;},謝謝您的支持 :)
套件特點:
縮圖第一步是先找有沒有對應的media$thumbnail,沒有則會去搜尋內文中的圖片。

這邊有加入flickr的檢查機制,如果你是用flickr當圖床,程式會自動把URL轉成flickr縮圖的位置來加速讀取時間(3/14更新,我把replace那邊換成通用的正規式,因此不論用_s,_t,_m,_o或無印應該都會轉成_s.jpg)

若是用其他圖床恐怕就必須載入原圖並因為強制縮為正方形而造成部份失真。至於什麼圖都沒找到的情況之下會填入一張無縮圖的圖像,各位可以自行把程式碼中var noImage=""的字串換成你想要的圖片URL。

2010-11-30更新
由於blogger feed的media$thumbnail有時會抓到flickr的_t.jpg縮圖,所以需將檢查機制同時加入try()跟catch(error)裡,程式碼部份已修正,請直接換用新程式碼。

延伸閱讀:
  1. Related Posts Widget for Blogger with Thumbnails - 我從這篇學到怎麼去抓thumbnail,或者從內文中找到圖片。
  2. 最新文章模組「終極版」 - 模組原型是取自於Abin大大這篇。

常見問答:
Q. 跳頁功能無法使用?
A. 主因是本外掛改自Abin大大的最新回應終極版,在做的時候並沒有把原來的更新Function改名,造成兩個外掛無法共容,最快的辦法是擇一使用之,不然就是要把我程式碼中showRecentPosts用別的字串來取代...
Q. list-style就算設成了none也無法把清單bullets移除?
A. 很多template是利用background來做清單的bullets,所以只要在#RPosts li裡加入background:none;的屬性即可把bullets移除。

最後希望大家都能快樂的hacking blogger,有問題的同學請在下面發問,洩洩!

2011/1/31 NS已推出JQuery為主的新版插件,歡迎試用。
Blogger RecentPosts 最新文章插件 V1.0.0

35 回應:

euyoung 提到...

這個好威....我找個時間再來裝一下,最近在趕東西

匿名 提到...

這個超讚的 

NightSpirit 提到...

樓上:
謝謝~ 喜歡的話還請幫小弟多多宣傳 :)

HermesLee 提到...

你好,我試著在我的網誌安裝了這個非常棒的程式,
但是發現按程式中"下一頁"時,他都不會讀取接下來的文章,請問有可能是我哪邊設定錯誤嗎?
http://jokerson.blogspot.com/ <=這是我的網誌

NightSpirit 提到...

HermesLee:
因為你底下裝了一個abin版的最新文章,因為我這是改自abin大的程式所以更新函式showRecentPosts是共用的,看你要把這函式改個名或是兩者擇一使用囉

Atlas Weng 提到...

請問一下,我的List Style是設定none,卻還是顯示,要怎麼才能讓他消失呢?

HermesLee 提到...

搞定了,這真的是ㄧ個非常棒的東西,
很感謝你的分享和講解。

NightSpirit 提到...

Atlas Weng
我剛看一下你的ul li 背景都被加上了有點的background,所以那點並不是list-style管的,我試著用web developer調但是css蓋不過去,可能你的版型有鎖住CSS,你可能要自己debug看看...

huijung 提到...

嘿,謝謝你的ajax!我忍不住裝來玩了
雖然又熬夜還是要弄到好才甘心XD
我真的一頁頁檢查縮圖有無正常出現
像福利客有時出不來的原因也找到了
若當初上傳的圖過小,但用最大尺寸的網址就會出現問題
要再選小一號就ok

還順便檢查到以前空間失效沒有叉燒包的圖
NS~GJ!!
http://huijung.blogspot.com
請驗收!

NightSpirit 提到...

Huijung:
很高興能幫到你,你能喜歡這個外掛就是我最大的榮幸囉,也請幫我推廣囉 :)

Atlas Weng 提到...

list的問題已經解決了!目前正在運作中!非常好用!超感謝你!
(不好意思,我把link拿掉了,因為它跑出格子外,不過我有聯播連結,沒關係吧!)

LVCHEN 提到...

哈,這東西真的是愈來愈炫了,我才知道有 thumbnail 可以用耶!
未來讓我也把它加進我新版的外掛裡,肯定也會很威的啊!
感謝!

LVCHEN 提到...

特別覺得,這功能對於圖文部落格特別有幫助,甚至可以當做一個單獨的功能來開發,做成類似電視牆之類的東東...呵呵
說不定比月曆形式還要有趣!

NightSpirit 提到...

LVCHEN:
給你看看我正在試作的新外掛,不過現在還有些小問題無法解決,例如圖位置會跑掉跟IE/FX無法兼容的問題。

Hudson 提到...

你好,我在我自己的部落格中嘗試安裝這個hack,但一直顯示loading,請問是否需要讓程式自行抓取一段時間後才能正常顯示呢?

我有裝abin的最新文章和最新回應,但兩者移除後這個hack還是一直在loading,不知道是什麼原因?謝謝!

璘夜 提到...

之前試都一直不成功呢。

但是試著改裝ABIN'S的掛件卻可以。
小小的研究一下才發現,原來格主所抓取的RSS是全文。
ABIN的是摘要,而我自己本身的BLOGGER RSS是只提供摘要的~
難怪一直無法出現~

謝謝格主的掛件,這個比BLOGGER原配件來的理想多了!

NightSpirit 提到...

Hudson:
剛到你網誌看過,如同璘夜所言,此外掛需要開放完整的網誌提供,請到[設定]->[網站提供]->將文章資訊提供改為[完整]。 另外你目前使用的最新文章套件是abin版的,跟這套會有衝突,請擇一使用之。

璘夜:
很開心你喜歡這個套件,你的提醒我注意到了,在安裝說明的部份我加入了這條注意事項,感謝你 :)

Hudson 提到...

謝謝格主,改過後就可以用了,非常謝謝你的幫忙,真的是很棒的掛件,看起來很賞心悅目!

樗里疾 提到...

你好 不好意思想請教一下
如果想把最新文章作成跟這blog一樣

http://phx1985.blog125.fc2.com/blog-entry-405.html

該如何下手呢? 謝謝^^

NightSpirit 提到...

樗里疾: 是說要弄成tab式的下拉選單嗎?,那你可能要去找下拉選單的外掛再把最新文章的內容寫到innerHtml了

Jimmy Yen 提到...

好東西, 請問如果想要再加上內文的前幾個 character, script 要怎麼改呢 ?

鄭凱文 提到...

感謝NS兄提供這外掛,真是帥呆了...

[啵啵啾小公主Kaylin | Life 写真の日記] 提到...

哇!你真滴好棒喔~超感謝你滴!這各很好耶^^找好久!真滴很謝謝你

ShyuWei 提到...

好東西阿 雖然很久沒碰網誌了XD 還是手癢玩了一下

St. 提到...

謝謝你...我也手癢改了一下..
還在研究Blogger hack: AJAX LOADING 動態文章中...

mokotw 提到...

發現一個BUG
程式中雖然有加入flickr的檢查機制
但是1~5項的_s,_t,_m,_o縮圖
並沒有轉成_s.jpg

請問要如何解決

mokotw 提到...

以你右側的最新文章
DIY MINI STUDIO 自製迷你攝影棚
文中的第一章圖
http://farm2.static.flickr.com/1030/5180609337_58e05e733a.jpg

被轉換成
http://.............._t.jpg
但並沒有縮成
http://.............._s.jpg

請問要如何解決

不知道nightspirit懂不懂我的意思

NS 提到...

Mokotw:
謝謝你的回報, 我還在抓bug, 若是抓到了會再通知您。

NS 提到...

Mokotw:
我抓到bug了,剛剛研究了一下新的feed,發現blogger現在會抓flickr的_t.jpg來塞到media$thumbnail這個entry,所以我的檢查機制要放到try()裡面而非底下的catch(error)。

我已經將原碼更新過了,只要直接copy paste新原碼即可。

有錯誤的話再跟我說

Christine 提到...

這是可以找到的"最新文章"工具裏, 最好用也最好看的. 謝謝你.

Christine 提到...

天才大大,
很謝謝你offer了recent posts的模組套件, It works excellent on my brogger. 但我把它加入我一個同學會部落格, 這個設定為不被search和要有密碼才能進入, 在這裡就發生error. 是否因完全封鎖就不行使用? ( 但另一個設定成不被search, 但任何人皆可瀏覽, 你的模組就work ) 因不希望不同學會部落格開放為to public, 想請問是否有解決的方法?

NS 提到...

@Christine

沒有辦法~ 如果不公開就表示抓不到json feed,那麼這個plugin就完全無用武之地。

Christine 提到...

Thanks.

墮天使 Flora 提到...

讚!!
套入BLOG囉~~~~謝謝

桃園縣第四區社區保母系統 提到...

你好~我想請問該怎麼樣才可以讓點選的文章用另開新視窗的方式開啟呢~感謝您

張貼意見

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

文章回應

友格友品

  • 最渴望的旅行(三)Olympus E-P3 - Operation - 上篇文章看過了E-P3的外觀介紹,這篇我們來看看關於E-P3的選單。 除了選單的設定以外,這篇文章還會講到兩個功能:一個是「數位遠攝轉換器」(其實就是數位變焦)、另外一個則是「保持暖色調」 (我知道有些人會直接略過講選單的文章,所以提早在文章一開頭講) 上篇文章有提到一開機的超音波除塵的燈號被取消了,那麼我們...
    15 小時以前
  • The Wolseley的英式下午茶 - 來到英國當然不能錯過下午茶,得知早早預訂了The Wolseley,就一直期待著。 The Wolseley位在高級的Ritz Hotel旁,在倫敦當地是很熱門的餐廳,也偶有名人出入,想去用餐最好早早預約。當天一行人在下午抵達,來享用下午茶套餐,當那傳說中的宛如三層公寓的點心塔一上桌,眾人真是興奮不已,由上而下...
    1 天以前
  • 与鳄鱼搏斗 - 真是太惊险了! 近身肉搏!!! 经过一番惊天动地的打斗。。。。。。 成功驯服大鳄鱼!!
    1 天以前
  • 平安夜之南境之旅 Key West – Day 2 好吃篇 - *...看 Day 2 之亂逛篇* 到處趴趴走很快就把一肚子的能量耗光,肚子空空連 Ethan 也兩腿無力,帶著兩腿無力的小孩散步,那可是世界上最恐怖的夢饜之一! 話說回來,外出旅遊怎麼能夠錯過在地的美食文化呢?對於旅遊四大要旨(吃喝玩樂)之首我們早早就規劃好囉! Banana Cafe 雖然坐落於 ...
    1 天以前
  • 便宜又好用的契約工 - 家人聽說中壢有間外資企業的待遇、福利不錯,便不斷「鼓勵」本人轉換就業跑道,心想要是不親身體驗家人的道聽塗說,他們會像故障地錄放影機重覆播放相同的片段,認為沒去應徵這份工作很可惜。於是我用九個月的寶貴光陰,證明高中同學的先見之明(萬一沒升正職怎麼辦?),然而有智慧的他只糟蹋卅天。 人資經理與數位應...
    1 週以前
  • 敘事曲終,人,散 - 越離越遠,我以為的那些仍然繼續開始支解崩壞; 細數空氣中的灰塵,聽每一顆光影裡殘餘的餘韻,然後一個字一個字寫下也沒甚麼人要聽的故事,暫且稱做敘事曲吧。 曲終也許就是人散。 這也沒甚麼好或不好,人生就是如此,如同房屋有拆有遷,或者與人有合有離。只是每一道流沙都會刮下細細小小的刮痕,久了才發現原來眼鏡也會因...
    1 週以前
  • 主題偵測的暫存內容 (bbfa88e0-2cbe-4988-a958-401f8cdc940e - 3bfe001a-32de-4114-a6b4-4005b770f6d7) - 尚有未刪除的暫存文件,請手動刪除。(42ad9a55-b336-488e-aa69-2e8d934548d1 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
    1 週以前
  • 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...
    2 週以前
  • N式滷牛腱 - 上個禮拜試作了一次滷牛腱,發現這道菜簡單易學,應該又是留學生必備的一道菜式,跟我之前做過的牛肉麵比起來,我認為選用牛腱肉並整塊煨滷,口感風味上更上層樓,所以以後如果我做牛肉麵大概也會用這種方式來實現。 廢話不多說,N式廚房上菜囉。 首先當然是肉,選用Beef Shrank,一磅約3.99。 生薑去皮打扁...
    2 週以前
  • Android 4.0 技術與就業研討會 - 3/7 日下午有個「Android 4.0 技術與就業研討會」。我講的部分是 Fragments,這是 Android 3/4 中最重要的一個新架構。有興趣的歡迎報迎參加。 這個活動是由台灣知識庫主辦,時間是 3/7 1pm-5:30pm,地點應該就在台北車站附近的開封街一段32號4樓。
    3 週以前
  • - 1.yesterday is here. 2."她終於來到一個可以繼續活著也可以死去的年紀。" 3.書店關掉後,星巴克像個尷尬的中產房車每天臨停在那裏。然後改裝小電影院,停業咖啡館,整頓四不像的頹喪,停止喃喃自語,邁向庸庸碌碌,越走路越趕不上更迭。踉蹌的跌倒,順勢躺下,發現自己在家,因為也沒有地方可以去了。...
    2 個月以前
  • 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)下午到達中油大樓會議廳看到出席的大家時心情真是開心今天這...
    9 個月以前
  • 生命有限,愛與夢無限 - 生命有限,這是所有人都知道的事,只是很多時候,我們並不會刻意去想它,總覺得自己會有很多很多的時間才會體會到生命有限這件事。然而命運有時會很喜歡忽然提醒我們,你的限期就在不遠處。 期限將至時,我們該如何去面對?身邊人又該如何面對?這似乎會牽引出很多很多的想像。當中對大限將至的人,我們可以有多少愛去付出?又有多少夢...
    9 個月以前
  • 屬於自己的角落 - [image: IMG_7041.jpg] 每個上班族都希望可以在下班時有個讓自己身心都放鬆的地方 這幾天晚上幾乎都是這樣度過的,開一盞微微的燈光,一個人攤坐在椅背上看書、上網... 喜歡這種光線聚焦在一個焦點的感覺,就算周遭在怎麼紛亂,此時視線也會被這道光侷限著 看不清外面的景況,也許也不會被外面的世界打...
    1 年前
  • Maroon 5 - Misery haha...too much love
    1 年前
  • GPA魔人請退散 - 真的很受不了那些對分數斤斤計較的人。是的,我知道平均成績在B以下的話就拿不到學位,可是有必要為了拿A而不停地要求教授提供extra credit嗎? 更何況即使某一堂課fail了還有其他的課可以把平均拉起來(對於某些人來說,拿不到A就等同是fail),何必把自己搞成沒有拿到A就等於世界末日來臨了? 每次...
    2 年以前