WebQQ自诞生以来,作为轻量级网页客户端,为不方便使用庞大体积客户端的用户提供比较稳定的服务体验。而对于研究WebQQ协议的爱好者来说,比较关心的是WebQQ后台运行的原来细节以及网页提交过程。
由于最近QQ垃圾信息群发严重,官方选择将WebQQ部分功能实现细节方面做了点手脚。比如我们提到的POST提交的Hash参数。这个Hash是在js里加密完成的。
hash参数解决刷新问题:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>New document</title>
<script language="JavaScript" type="text/javascript">
<!--
//定义刷新处理类及构造函数
function BookMarkFixer(){
//用于存储哪些函数作为状态信息
this.actions={};
}
//注册一个需要实现刷新定位的函数,其中s表示该函数的标识符
BookMarkFixer.prototype.register=function(s,action){
this.actions[s]=action;
}
//每个注册的方法在调用时都需要显示的改变浏览器的标签地址
BookMarkFixer.prototype.toHash=function(s){
var hash=document.location.hash;
hash=hash.slice(1,hash.length);
var arrHash=hash.split(".");
if(hash.length==0)arrHash=[];
var exist=false;
//如果该函数已经存在于Hash地址中,则不用重新添加
for(var i=0;i<arrHash.length;i++){
if(arrHash[i]==s){
exist=true;
break;
}
}
if(!exist)arrHash.push(s);
document.location.hash="#"+arrHash.join(".");
}
var bmf=new BookMarkFixer();
//根据浏览器的标签数据来恢复状态
function bmfOnload(){
//获取hash地址
var hash1=document.location.hash;
hash1=hash1.slice(1,hash1.length);
var arrHash1=hash1.split(".");
if(hash1.length==0)arrHash1=[];
for(var i=0;i<arrHash1.length;i++){
bmf.actions[arrHash1[i]]();
}
}
if(window.attachEvent){
window.attachEvent("onload",bmfOnload);
}else{
window.addEventListener("load",bmfOnload,true);
}
bmf.register("p1",setP1);
bmf.register("p2",setP2);
bmf.register("p3",setP3);
//定义函数,用于设置指定id节点的内容
function setContent(containerId,content){
container=document.getElementById(containerId);
container.innerHTML=content;
}
//设置id为p1的<p>节点内容
function setP1(){
setContent("p1","here is p1 content");
//将状态加入到Hash参数中
bmf.toHash("p1");
}
//设置id为p2的<p>节点内容
function setP2(){
setContent("p2","here is p2 content");
//将状态加入到Hash参数中
bmf.toHash("p2");
}
//设置id为p3的<p>节点内容
function setP3(){
setContent("p3","here is p3 content");
//将状态加入到Hash参数中
bmf.toHash("p3");
}
//-->
</script>
</head>
<body>
<a href="javascript:void(0)" onclick="setP1()">link1</a>
<a href="javascript:void(0)" onclick="setP2()">link2</a>
<a href="javascript:void(0)" onclick="setP3()">link3</a>
<p id="p1">p1</p>
<p id="p2">p2</p>
<p id="p3">p3</p>
</body>
</html>
<script language="JavaScript" type="text/javascript">
<!--
//alert(document.location.hash);
//-->
</script>