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>