热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Blog外挂之:热门文章与导航栏

Blog外挂之:热门文章与导航栏By刘未鹏C++的罗浮宫(http:blog.csdn.netpongba)还是看图说话:-)图一:导航栏图二:热门文章导航栏的实现很容易:往main

Blog外挂之:热门文章与导航栏

 

By 刘未鹏

C++的罗浮宫(http://blog.csdn.net/pongba)

 

还是看图说话:-)

 

图一:导航栏

 

图二:热门文章

 

导航栏的实现很容易:往mainheader之间塞入一个div,往div里面写入所有的分类链接即可。

 

分类的获取有几个办法,一是把分类链接也收藏到del.icio.us上,这样就可以用JSON协议获取到所有分类(见上篇文章——Blog外挂之:妙用del.icio.us实现站内相关文章)。二是直接获取侧边栏上的分类列表。dodoblog上用的就是这个办法,但这个办法太脆弱,因为分类的那个ul没有id,所以用getElementById就行不通了。只能依赖于对那个ul的顺序的掌握,先getElementById(‘rightmenu’)获得rightmenu的引用,然后再对后者getElementsByTagName(‘ul’)获得其中所有的ul容器的数组,然后基于对页面代码的观察从这个数组中取出对应于分类菜单的ul。这个办法的问题在于如果我们不小心在公告栏加入了新的ul,或者能生成uljs代码,就会破坏分类那个ul所在的序号。另一方面,把分类链接收藏到del.icio.us上是个较好的选择,但del.icio.us帐号的空间有限,目前你最多能获取100post,还是别浪费在分类上的好。用另一个del.icio.us帐号的办法又会增加一个http请求。想想还是不要杀鸡用牛刀了。于是结果使用的是brute force,直接把分类链接及标题硬编码到代码中了:-)反正分类的修改也并不频繁。比如我的分类之前都快一年没改动了。

 

导航栏实现的主要代码如下:

 

function insertTopMenuDiv()

{

  var topMenuDiv = document.createElement('div');

  topMenuDiv.setAttribute('id', 'topMenu');

 

  var main = document.getElementById('main');

  main.parentNode.insertBefore(topMenuDiv, main);

 

  return topMenuDiv;

}

 

function appendNavigatorBar()

{

  var topMenuDiv = insertTopMenuDiv();

 

  var categoryList = getCategoryList();

 

  var html = '';

  for(var i = 0; i

    html += '    if(GetThisURL() != categoryList[i].url)

      html += 'tabUnselected">';

    else

      html += 'tabSelected">';

    html += categoryList[i].title;

    html += '';

  }

  document.getElementById('topMenu').innerHTML = html;

}

 

getCategoryList你自己写。目的是获取分类列表。我用的是硬编码。

 

CSS调整

导航栏就这样插入到mainheader之间是不行的,需要调整格式。往后台定制CSS栏加入代码调整其位置,我的是:

 

#topMenu {

  position:absolute;

  top: 78px;

  padding-left: 20px;

}

 

#topMenu a:hover {

  background: #0044BB none repeat scroll 0%;

  color: #FFFFFF;

  text-decoration: none;

}

 

.tabUnselected {

  border-left:1px solid #CCCCCC;

  border-right:1px solid #CCCCCC;

}

 

.tab {

  margin:0em 0em 0em 0.25em;

  padding:2px;

  font-size: 12pt ;

}

 

.tabSelected {

  border-left:1px solid #CCCCCC;

  border-right:1px solid #CCCCCC;

}

 

最重要的就是topMenu的位置。我定的是离顶部78px。你自己用firebug调节吧。tabSelectedtabUnselectedCSS一样是因为原本的效果不能在IEfirefox下统一,只好暂时就这样了。Web设计达人自己调整就是了:-)俺是程序员,只能朴素一点,用左右两条线分隔了。

 

热门文章的实现也不算复杂。最关键的问题是如何获取相应文章的评论数。我原本想通过blogrss文件获得,观察rss文件会发现里面包含了每篇文章的评论数。等等,我说了每篇文章吗?唉,其实只有聊聊十几篇而已,所以没法对整个blog上的所有文章进行排名了。不过rss可以用来实现最近更新

 

图三:最近更新

 

Anyway,那如何获取评论数呢?我们知道每篇文章的URL(从del.icio.us上获得的),问题转化为如何从URL到评论数。CSDN blog对文章的评论数是动态加载的:

 

图四:加载中

图五:加载完毕

既然是动态加载的,那么必然有办法获取对应文章的评论数。偷窥一下页面代码:

 

图六:评论加载代码(一)

 

可见,每篇文章的postFoot处都有一个js调用,调用AddFeedbackCountStack将该文章的一个ID添加一下,这个ID其实就是文章URL的最后一部分。从数字大小猜测它应该是服务器上的文章编号,1601519,也就是第一百多万篇文章。随便找篇03年的文章,你会发现那时候CSDN blog系统上只有一万多篇文章。

 

为了节省HTTP请求,CSDN blog的页面加载过程中并非每遇到一个“评论数(…)”框都发起一次http调用获取相应文章的评论数,而是用刚才你看到的AddFeedbackCountStack先将该文章的ID保存起来,等到最后一并获取所有的评论数:

 

图七:评论加载代码(二)

 

LoadFeedbackCount做了两件事情:先使用一路保存下来的文章ID列表来获取一个评论数列表。然后将评论数一一填充到相应的“评论数(…)”框中。如果一篇文章的ID1234那么其评论数框的span id就是FeedbackCount_1234。见图六。

 

AddFeedbackCountStackLoadFeedbackCount的代码在LoadFeedbackCount.js中。自己看它是怎么发起http请求获取评论数的吧。

 

最后需要注意的一点是,无论ID列表里面文章的顺序如何,返回的评论数列表总是对应于ID从大到小来排列的。也就是说如果你给出的ID列表为“ID2ID 1 ,假定ID2 ,即第二篇文章发得较早,那么返回的评论数仍然还是feedbackCountForID1feedbackCountForID2。所以如果del.icio.us上的文章收藏并非按从早到晚严格顺序排的,那得先sort一下,然后建立ID列表。

 

知道了如何获取评论数就好办了,有了URL列表,有了相应的评论数。排名那就太简单了。

 

最热门文章排行的主要代码如下:

 

var getFeedbackCountReq;

var myBlogPosts = [];

var hotPostsContainer;

 

function showHotPosts(ct)

{

  hotPostsCOntainer= ct;

  for(i = 0; i

myBlogPosts.push(

{url:Delicious.posts[i].u,

id:urlToId(Delicious.posts[i].u),

title:Delicious.posts[i].d, feedbackCount:0}

);

  }

 

  myBlogPosts.sort(compareById);

 

  var idList = '';

  for(i = 0; i

    idList += myBlogPosts[i].id + ',';

  }

 

  getFeedbackCountReq = HTTP.newRequest();

  getFeedbackCountReq.Onreadystatechange=

handleGetFeedbackCountReq;

  getFeedbackCountReq.open('GET',

'/NewCount.aspx?FeedbackCountStack=' + idList);

  getFeedbackCountReq.send(null);

}

 

function handleGetFeedbackCountReq()

{

  if(getFeedbackCountReq.readyState==4){

    if(getFeedbackCountReq.status==200){

      handleGetFeedbackCountReq2(

getFeedbackCountReq.responseText);

    }

  }

}

 

function handleGetFeedbackCountReq2(feedbackStr)

{

  var feedbackList = feedbackStr.split(',');

  var i;

  for(i = 0; i

    myBlogPosts[i].feedbackCount = feedbackList[i];

  }

  myBlogPosts.sort(compareByFeedbackCount);

   

  var title = document.createElement('h3');

  title.appendChild(document.createTextNode('blog评论最多文章'));

  hotPostsContainer.appendChild(title);

 

  var NGList =

 ['http://blog.csdn.net/pongba/archive/ 2004/08/26 /84978.aspx',

'http://blog.csdn.net/pongba/archive/ 2004/11/26 /195052.aspx',

'http://blog.csdn.net/pongba/archive/ 2004/11/26 /195075.aspx'];

 

  var maxNumHotPosts = 12 + NGList.length;

  if(myBlogPosts.length

maxNumHotPosts = myBlogPosts.length;

 

  var ul = document.createElement('ul');

  ul.setAttribute('id', 'my_hot_posts');

 

  for(i = 0; i

    if(IsIn(myBlogPosts[i].url, NGList))continue;

    var li = document.createElement('li');

    var a = document.createElement('a');

    a.setAttribute('href', myBlogPosts[i].url);

a.appendChild(document.createTextNode(myBlogPosts[i].title

 + '(' + myBlogPosts[i].feedbackCount + ')'));

    li.appendChild(a);

    ul.appendChild(li);

  }

 

  hotPostsContainer.appendChild(ul);

}

 

function compareByFeedbackCount(post1, post2)

{

  return post2.feedbackCount - post1.feedbackCount;

}

 

function compareById(post1, post2){

  return post2.id - post1.id;

}

 

其中NGList是排除在外的文章列表。如果你blog上也有一些你觉得价值不大的口水文章也可以排除一下:-)

 

Further Work

按评论数排行是最平凡的热门文章排行方式。揉合进点击率,tag等信息会是一个不错的选择。但似乎点击率没法获取,tag信息倒是有,但目前也没想到较好的利用办法。Tag越小文章越特殊是一个观察,但未必特殊的文章就一定重要。所以如果要加入文章的重要性,还不如直接利用del.icio.us手动收藏重要性文章。

 

 

推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 凡客诚品官方网站的前端改进建议
    打开http:www.vancl.com发现采用的Asp.net,这点我感到很欣慰,毕竟国内采用.net技术体系的优秀网站少之又少。好奇之余右键-查看源 ... [详细]
  • 高仿CSDN社区树形图 .
    一直感觉CSDN社区的树形结构特别的人性化,直观化。最近做系统的时候需要用到这个树形结构,于是模仿CSDN的树形结构做了一个自己的树形结构, ... [详细]
  • http会话(session)详解by:授客QQ:1033553122会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
瑶看瀑布挂前川
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有