WebQQ自誕生以來,作為輕量級網(wǎng)頁客戶端,為不方便使用龐大體積客戶端的用戶提供比較穩(wěn)定的服務(wù)體驗(yàn)。而對于研究WebQQ協(xié)議的愛好者來說,比較關(guān)心的是WebQQ后臺運(yùn)行的原來細(xì)節(jié)以及網(wǎng)頁提交過程。
由于最近QQ垃圾信息群發(fā)嚴(yán)重,官方選擇將WebQQ部分功能實(shí)現(xiàn)細(xì)節(jié)方面做了點(diǎn)手腳。比如我們提到的POST提交的Hash參數(shù)。這個(gè)Hash是在js里加密完成的。
hash參數(shù)解決刷新問題:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>New document</title>
<script language="JavaScript" type="text/javascript">
<!--
//定義刷新處理類及構(gòu)造函數(shù)
function BookMarkFixer(){
//用于存儲哪些函數(shù)作為狀態(tài)信息
this.actions={};
}
//注冊一個(gè)需要實(shí)現(xiàn)刷新定位的函數(shù),其中s表示該函數(shù)的標(biāo)識符
BookMarkFixer.prototype.register=function(s,action){
this.actions[s]=action;
}
//每個(gè)注冊的方法在調(diào)用時(shí)都需要顯示的改變?yōu)g覽器的標(biāo)簽地址
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;
//如果該函數(shù)已經(jīng)存在于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();
//根據(jù)瀏覽器的標(biāo)簽數(shù)據(jù)來恢復(fù)狀態(tài)
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);
//定義函數(shù),用于設(shè)置指定id節(jié)點(diǎn)的內(nèi)容
function setContent(containerId,content){
container=document.getElementById(containerId);
container.innerHTML=content;
}
//設(shè)置id為p1的<p>節(jié)點(diǎn)內(nèi)容
function setP1(){
setContent("p1","here is p1 content");
//將狀態(tài)加入到Hash參數(shù)中
bmf.toHash("p1");
}
//設(shè)置id為p2的<p>節(jié)點(diǎn)內(nèi)容
function setP2(){
setContent("p2","here is p2 content");
//將狀態(tài)加入到Hash參數(shù)中
bmf.toHash("p2");
}
//設(shè)置id為p3的<p>節(jié)點(diǎn)內(nèi)容
function setP3(){
setContent("p3","here is p3 content");
//將狀態(tài)加入到Hash參數(shù)中
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>