Blog外挂之:热门文章与导航栏
By 刘未鹏
C++的罗浮宫(http://blog.csdn.net/pongba)
还是看图说话:-)
图一:导航栏
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 64.5pt" type="#_x0000_t75"><imagedata o:title="navigator_demo1" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg"></imagedata></shape>
图二:热门文章
<shape id="_x0000_i1026" style="WIDTH: 370.5pt; HEIGHT: 264pt" type="#_x0000_t75"><imagedata o:title="hotposts_demo1" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.jpg"></imagedata></shape>
导航栏的实现很容易:往main和header之间塞入一个div,往div里面写入所有的分类链接即可。
分类的获取有几个办法,一是把分类链接也收藏到del.icio.us上,这样就可以用JSON协议获取到所有分类(见上篇文章——《Blog外挂之:妙用del.icio.us实现“站内相关文章”》)。二是直接获取侧边栏上的分类列表。dodo的blog上用的就是这个办法,但这个办法太脆弱,因为分类的那个ul没有id,所以用getElementById就行不通了。只能依赖于对那个ul的顺序的掌握,先getElementById(‘rightmenu’)获得rightmenu的引用,然后再对后者getElementsByTagName(‘ul’)获得其中所有的ul容器的数组,然后基于对页面代码的观察从这个数组中取出对应于分类菜单的ul。这个办法的问题在于如果我们不小心在公告栏加入了新的ul,或者能生成ul的js代码,就会破坏分类那个ul所在的序号。另一方面,把分类链接收藏到del.icio.us上是个较好的选择,但del.icio.us帐号的空间有限,目前你最多能获取100个post,还是别浪费在分类上的好。用另一个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 < categoryList.length; ++i){
html += '<a href = "' + categoryList[i].url + '" class = "tab ';
if(GetThisURL() != categoryList[i].url)
html += 'tabUnselected">';
else
html += 'tabSelected">';
html += categoryList[i].title;
html += '</a>';
}
document.getElementById('topMenu').innerHTML = html;
}
getCategoryList你自己写。目的是获取分类列表。我用的是硬编码。
CSS调整
导航栏就这样插入到main和header之间是不行的,需要调整格式。往后台定制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: <chmetcnv w:st="on" unitname="pt" sourcevalue="12" hasspace="False" negative="False" numbertype="1" tcsc="0">12pt</chmetcnv>;
}
.tabSelected {
border-left:1px solid #CCCCCC;
border-right:1px solid #CCCCCC;
}
最重要的就是topMenu的位置。我定的是离顶部78px。你自己用firebug调节吧。tabSelected和tabUnselected的CSS一样是因为原本的效果不能在IE和firefox下统一,只好暂时就这样了。Web设计达人自己调整就是了:-)俺是程序员,只能朴素一点,用左右两条线分隔了。
热门文章的实现也不算复杂。最关键的问题是如何获取相应文章的评论数。我原本想通过blog的rss文件获得,观察rss文件会发现里面包含了每篇文章的评论数。等等,我说了每篇文章吗?唉,其实只有聊聊十几篇而已,所以没法对整个blog上的所有文章进行排名了。不过rss可以用来实现最近更新。
图三:最近更新
<shape id="_x0000_i1027" style="WIDTH: 220.5pt; HEIGHT: 208.5pt" type="#_x0000_t75"><imagedata o:title="last_posts_demo1" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image004.jpg"></imagedata></shape>
Anyway,那如何获取评论数呢?我们知道每篇文章的URL(从del.icio.us上获得的),问题转化为如何从URL到评论数。CSDN blog对文章的评论数是动态加载的:
图四:加载中…
<shape id="_x0000_i1028" style="WIDTH: 155.25pt; HEIGHT: 52.5pt" type="#_x0000_t75"><imagedata o:title="feedbackcount_demo1" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.jpg"></imagedata></shape>
图五:加载完毕
<shape id="_x0000_i1029" style="WIDTH: 146.25pt; HEIGHT: 52.5pt" type="#_x0000_t75"><imagedata o:title="feedbackcount_demo2" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image006.jpg"></imagedata></shape>
既然是动态加载的,那么必然有办法获取对应文章的评论数。偷窥一下页面代码:
图六:评论加载代码(一)
<shape id="_x0000_i1030" style="WIDTH: 415.5pt; HEIGHT: 132.75pt" type="#_x0000_t75"><imagedata o:title="feedbackcount_demo3" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image007.jpg"></imagedata></shape>
可见,每篇文章的postFoot处都有一个js调用,调用AddFeedbackCountStack将该文章的一个ID添加一下,这个ID其实就是文章URL的最后一部分。从数字大小猜测它应该是服务器上的文章编号,1601519,也就是第一百多万篇文章。随便找篇03年的文章,你会发现那时候CSDN blog系统上只有一万多篇文章。
为了节省HTTP请求,CSDN blog的页面加载过程中并非每遇到一个“评论数(…)”框都发起一次http调用获取相应文章的评论数,而是用刚才你看到的AddFeedbackCountStack先将该文章的ID保存起来,等到最后一并获取所有的评论数:
图七:评论加载代码(二)
<shape id="_x0000_i1031" style="WIDTH: 147.75pt; HEIGHT: 42.75pt" type="#_x0000_t75"><imagedata o:title="feedbackcount_demo4" src="file:///C:%5CDOCUME~1%5Cpongba%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image009.jpg"></imagedata></shape>
LoadFeedbackCount做了两件事情:先使用一路保存下来的文章ID列表来获取一个评论数列表。然后将评论数一一填充到相应的“评论数(…)”框中。如果一篇文章的ID为1234那么其评论数框的span id就是FeedbackCount_1234。见图六。
AddFeedbackCountStack和LoadFeedbackCount的代码在LoadFeedbackCount.js中。自己看它是怎么发起http请求获取评论数的吧。
最后需要注意的一点是,无论ID列表里面文章的顺序如何,返回的评论数列表总是对应于ID从大到小来排列的。也就是说如果你给出的ID列表为“ID2,ID<chmetcnv w:st="on" unitname="”" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'"><span lang="EN-US">”</span></span></chmetcnv>,假定ID2 < ID1,即第二篇文章发得较早,那么返回的评论数仍然还是feedbackCountForID1,feedbackCountForID2。所以如果del.icio.us上的文章收藏并非按从早到晚严格顺序排的,那得先sort一下,然后建立ID列表。
知道了如何获取评论数就好办了,有了URL列表,有了相应的评论数。排名那就太简单了。
最热门文章排行的主要代码如下:
var getFeedbackCountReq;
var myBlogPosts = [];
var hotPostsContainer;
function showHotPosts(ct)
{
hotPostsContainer = ct;
for(i = 0; i < Delicious.posts.length; ++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 < myBlogPosts.length; ++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);
}
}
}
font-
分享到:
相关推荐
在Qt开发中,自定义导航栏是一项常见的任务,它能够为应用程序提供更加直观且具有特色的用户界面。本文将深入探讨如何在Qt中实现自定义导航栏,并分享一个使用案例,帮助开发者创建美观、易用的树形导航结构。 首先...
1.导航栏的显示与隐藏 导航栏的显示与隐藏,分两种情况: 1.从不显示导航栏的页面push到显示导航栏的页面。 2.从显示导航栏的页面Push到不显示导航栏的页面。 注意: 1.如果导航栏不显示时,系统的侧滑返回功能...
响应式导航栏作为网站的重要组成部分,能够确保用户在不同设备上都能获得良好的导航体验。本文将详细介绍如何在HTML中创建一个响应式导航栏,包括基本的HTML结构、CSS样式和一些JavaScript来增强交互性。 响应式导航...
8. **颜色搭配**:导航栏的颜色选择应该与整体网站设计风格一致,同时要确保足够的对比度,使得文字和背景清晰可读。 9. **文字排版**:字体、字号、行高以及对齐方式都是影响导航栏美观和可读性的因素。选择易读的...
此“iPhone之简易导航栏”项目旨在教你如何在iPhone应用中创建和自定义导航栏,以提供更优秀的用户体验。我们将探讨以下几个关键知识点: 1. **UINavigationController**:它是苹果iOS SDK中的一个控制器类,负责...
本篇将深入探讨如何在Android应用中实现导航栏的隐藏与显示。 首先,Android的导航栏有两种类型:系统导航栏(System Navigation Bar)和应用内导航栏(ActionBar或Toolbar)。在这里,我们主要关注隐藏的是系统...
在IT界,设计一个美观且实用的导航栏是构建用户友好型网站的关键步骤之一。"一个漂亮的侧面导航栏"这个项目显然关注的是如何创建这样一个功能强大的界面元素,它能够随着用户的交互提供良好的导航体验。侧面导航栏在...
在网页设计中,导航栏是页面布局的重要组成部分,它帮助用户快速访问网站的不同部分。"jQuery 悬浮导航栏"是一种常见的网页交互效果,当用户滚动页面时,导航栏会固定在屏幕顶部,始终保持可见,提供便捷的导航。在...
在Qt框架中,导航栏(通常称为工具栏或QToolBar)是用户界面设计中的一个重要...对于初学者,参考提供的博客文章(http://blog.csdn.net/lys211/article/details/43743187)将有助于深入理解Qt导航栏的具体实现细节。
在IT行业中,导航栏是网页或应用程序界面设计中不可或缺的一部分,它为用户提供了一种直观的交互方式,帮助用户轻松地在各个页面之间切换。"特别漂亮的导航栏"这个资源显然聚焦于美观且易于使用的导航栏设计。下面...
在移动端导航栏中,`<nav>`标签通常用于包裹整个导航结构,表示页面的主要导航链接。 2. **响应式设计**:考虑到不同设备的屏幕尺寸和方向,一个优秀的HTML5移动端导航栏应具备响应式设计。通过使用CSS3的媒体查询...
在描述中提到的“适用浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗”,表明这个导航栏模板是跨浏览器兼容的,能够适应不同用户使用的多种主流浏览器,确保了广泛的用户覆盖。...
在网页设计中,浮动导航栏(Floating Navbar)是一种常见的元素,它始终保持在用户滚动页面时可见,提供便捷的导航链接。这个"布局:浮动导航栏练习.zip"文件显然是一个关于如何创建这种效果的学习资源,主要涉及到...
7. **插件开发与使用**:jQuery社区提供了大量插件,如`jQuery-360nav`可能是一个专门用于创建360度旋转导航栏的插件。使用插件可以节省开发时间,提升项目效率。了解如何引入和配置这些插件也是重要的技能。 8. **...
【描述】:根据提供的博文链接(https://ling091.iteye.com/blog/60106),我们可以推测这篇博客可能详细讲解了如何创建一个模仿Windows系统界面的导航栏。博主可能分享了源代码和实现步骤,帮助读者理解其工作原理...
* navHome: 导航按钮为主页home,与返回back互斥,默认false显示返回back * 外部样式类:(使用时注意权重,添加外部样式类无效果的时候,给类加点权重就可以了) * custom-icon-class: 标题左侧图标外部样式类 *...
总结来说,"qt实现导航栏Demo"是一个展示Qt框架下如何构建交互式、美观的导航栏的实例,它充分利用了Qt的信号与槽机制、QSS样式表、QPainter绘图功能以及良好的接口设计,实现了切换特效、选中状态反馈和自定义风格...
在网页设计中,导航栏是页面布局的重要组成部分,它帮助用户快速浏览网站的不同部分,提供良好的用户体验。"CSS导航栏"和"JavaScript导航栏"是两种实现方式,各有其特点和优势。 首先,我们来详细了解一下CSS(层叠...
- 路由切换:结合路由库(如React Router或Vue Router),实现导航栏与页面内容的联动。 4. **导航栏的响应式设计**: - 自适应布局:根据设备屏幕尺寸调整导航栏的大小和排列方式。 - 折叠菜单:在小屏幕设备...