使用jQuery+jSon+delicious创建'相关文章'
我的日志引擎使用的是Google的Blooger,然后FTP到61dh.com的所属服务器。所有页面都是HTML,没有使用数据库。因此和Wordpress相比之下,功能要少了很多。但是每次发布新文章,我都会把文章的加到delicious(美味书签)。这么一来,借助delicous提供的扩展接口,我给日志添加了一些功能。我在日志里曾经介绍过,如何使用美味书签创建日志分类。昨天我又给日志添加了'相关文章'的功能,这次使用到的是delicious提供的JSON Feeds。
通过http://feeds.delicious.com/v2/json/61dh,可以得到61dh.com的最新15个日志的Feeds ,Delicious提供的JSON Feed不仅仅是罗列保存的书签链接,而且还可以输出具有相同标签的链接。因此只要根据一篇日志的标签信息,就可以找出具有相同标签的帖子信息了。例如:通过http://feeds.delicious.com/v2/json/61dh/css+html 可以找出标签是css和html的文章链接。 Feeds输出是JSON格式,大致如下:
[{"u":"http:\/\/www.61dh.com\/blog\/2009\/03\/jquery-ajax-xml.html","d":"jQuery ajax - \u5982\u4f55\u4f7f\u7528XML","t":["jQuery","PHP","ajax"],"dt":"2009-03-09T03:14:29Z","n":"","a":"61dh"},{...}, //第二篇文章... //第三、第四...]
上面,我只列出一个完整文章的JSON对象格式,很显然不同的JSON Feed有着不同的Object Attributes。在Delicious提供的JSON feed里,每个Object包含有6个属性:
- 1. u - 链接URL,在这里代表每一篇日志的永久地址
- 2. d - 链接名称,在这里代表日志的标题
- 3. t - 链接标签,在这里代表日志的标签
- 3. dt - 链接代表加入时间
- 4. n - 链接注释,在这里是空白
- 5. a - 书签的所有者, 这里是61dh
知道了JSON的输出格式后,就可以使用jQuery的getJSON()方法来处理输出结果。这里我们感兴趣的是相关文章的地址和标题,也就是u和d。jQuery代码如下:
$.getJSON("http://feeds.delicious.com/v2/json/61dh/CSS+HTML+Jquery?callback=?",function(data){//data这里是JSON对象,它可以是由多个JSON对象组成$.each(data, function(i,item){//每一个对象包含有一个日志的信息//item.u 就是日志的地址;item.d就是日志的标题$('<a href='+item.u+'>'+item.d+'</a><br />').appendTo("#related-post");if ( i == 8 ) return false; //默认下,JSON feed 提供15个链接,这里我只取8个});});
注意:.getJSON的第一个变量是可以提供JSON格式输出的URL,URL的参数要根据实际情况而定,delicious提供的JSON,使用callback作为参数名:callback=?, jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
上面的代码可以把标签为CSS、HTML和jQuery的文章链接找出,但是就这么写还不行,相对一篇文章,我们要自动找出该文章的所属的标签,然后动态的加入到JSON URL上。另外还有考虑找不到结果(标签有误) 和只有一个结果(找到文章本身)的情况。所以完整的代码如下:
<script type="text/javascript">//改函数用于判断JSON object所包含的子object个数function getOnum(object) {var num = 0;for(var i in object) { num ++; }return num;}$(document).ready(function(){var cat ="";$(".blogger-labels a[rel='tag']").each(function(){ //找出标签的名称cat += $(this).text() + '+'; //标签用+分隔});cat = cat.slice(0,-1); //去掉最后一个‘+’号$.getJSON("http://feeds.delicious.com/v2/json/61dh/"+cat+"?callback=?",function(data){var Onum = getOnum (data);if ((Onum == 0) || (Onum == 1)) //结果为0或者1$('<p>找不到相关文章</p>').appendTo("#related-post");else{ //结果 > 1$('<ul>').appendTo("#related-post");$.each(data, function(i,item){$('<li><a href='+item.u+'>'+item.d+'</a></li>').appendTo("#related-post");if ( i == 8 ) return false;});$('</ul>').appendTo("#related-post");}});});</script><div id="related-post"><h4>相关文章: </h4></div>
除了getJSON,上面的代码里还有一些小知识点:
- 1. 如何判断Object是否为空: getOnum()函数
- 2. jQuery selector - 选择所有class name 为blogger-labels区内的rel属性为tag的<a>: $(".blogger-labels a[rel='tag']") -
- 3. 去除字符串的最后一个字符:cat = cat.slice(0,-1);
- 4. 往一个HTML元素里添加加HTML代码:appendTo("#related-post")
标签: Ajax, Javascript, Jquery

