- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
百度文库浏览器分析及实现
引子
2003年开始玩Flash,完了两年就戒掉了;长时间不用不完慢慢就生疏了。最近应客户的需要,希望能在文档系统中实现类似百度文库的效果。考查一番,咋看起来百度用的是FlashPaper技术,也看了看FlexPaper,在GoogleCode上还看到了一个超大文件的示例,可惜链接打不开,无法去详细分析他们了。
在能看到的应用中,FlashPaper、FlexPaper都不能达到在互联网上动态加载大文档的用户体验需求;唯独百度文库有这样的用户体验,因此就只能拿百度文库开刀了,希望李彦宏同志不要见怪。
姑且拿《六十八个经典小故事》作为示例,该文档页数足够多,能够展示动态加载的效果。
百度文库浏览器原理分析步骤
找到《六十八个经典小故事》对应的链接;
清空IE缓存,在IE中浏览该页面;
使用导航将文档浏览至最后;
抓取IE缓存中的内容;
材料已取好,分析开始。
百度文库浏览器代码分析
一进来,刘姥姥进了大观园了,这个JavaScript脚本看得人脑袋那个大啊,这条路走起来挺艰难,换个思路吧;找个Flash反编译工具,反编译一下,取出来ActionScript,这个好歹还有个分行短句啊,总算还是个代码。
整理整理代码的层次结构,按照包组织一下,大致能确认应该在baidu这个文件夹吧;再看看,lib大致是用于json处理的;ui是用于用户自定义控件;iknow就应该是程序入口吧,按照一般程序要的思路先找一找main吧,果然还真有一个main类,有意思。
下面这几句代码大概就是与外部进行参数交换的吧:
var _loc_2:* = _loc_1[docurl] || :8960/play;
var _loc_3:* = _loc_1[docid] || c881e53a580216fc700afd05;
var _loc_4:* = int(_loc_1[fpn]) || 2;
var _loc_5:* = int(_loc_1[npn]) || 5;
this._reader.fpn = _loc_4;
this._reader.npn = _loc_5;
this._reader.docURL = _loc_2.replace(/(\/)+$/, ) + / + _loc_3 + ?;
如此以来就可以查找docurl、docid、fpn、npn这几个参数了,在JavaScript或者json中应该有体现的。
在看一看Reader类,再看看DocViewer类大致就知道了百度的FlashPaper的Reader的原理了。
if (this._firstPagesNum == -1)
{
tmpURL = this._docURL + pn= + (this._pagesLoaded + 1) + rn= + this._normalPageNum;
}
else
{
tmpURL = this._docURL + pn=1rn= + this._firstPagesNum;
this._firstPagesNum = -1;
}
var binaryRequest:* = new URLRequest(tmpURL);
binaryLoader.load(binaryRequest);
这就是Reader获取FlashPaper资源文件了;
binaryLoader.addEventListener(ProgressEvent.PROGRESS, this.binaryLoading);
binaryLoader.addEventListener(Event.COMPLETE, this.binaryLoadComplete);
binaryLoader.addEventListener(IOErrorEvent.IO_ERROR, this.binaryLoadError);
这个就是定义的装载进度、装载完成、装载失败的几个事件响应了;
this._delayPreLoadID = setInterval(this.preLoad, 1000, _loc_3);
这个是用于预装载的动作,实现边查看边下载其他片段的。
百度文库浏览器参数分析
根据以上代码片段就可以知道百度FlashPaper Reader的工作原理了,在初始化时根据JavaScript的参数装载FlashPaper片段,使用docurl指定路径(可以是相对路径,可以是绝对路径),使用docid指定文档的GUID,fpn指定文档起始序号,rn指定文档片段的页数;根据百度文档内部的定义应该是将文档以5页或者10页进行组织,所以fpn=5*X+1;rn=5||10。
百度文库浏览器外部调用分析
回过头在看客户端调用的JavaScript代码就有针对
文档评论(0)