小米的javascript除了數據部分,下面就只剩871行的javascript了。javascript
下面分模塊進行分析。首先從簡單的工具類入手。css
從616行到最後。一共253行。java
小米因爲採用了一個數組,存儲全部的靜態字符串。因此須要手動對代碼進行翻譯jquery
var Util = {
time: function() {
var a = m.$("reback");
if (count === 0x0) {//count應該是一個計數器,是倒計時使用的
m.$("box-close").innerHTML = "X";//一個關閉的X
a.innerHTML = "進入活動";
a.className ="reback_btn_next";
this.start();
return false
};
count = count - 0x1;//倒計時減一
a.innerHTML = 」從新進入(<span id='initCount'>「 + count + 」</span>)「 json
},數組
//以上的time函數,是顯示您正在排隊倒計時的那個窗口,count這個值,我們先記住,看看是從何而來 服務器
start: function() {
var b = this,
a = m.$(」reback「); //這裏的m.$應該相似於jquery的選擇符,選擇的是對象的id
a.onclick = function() {
getStatus.jsonInter(CONFIG.srcs.hdget, 」hdget「, true);//是搶購的關鍵函數,在這裏觸發搶購,若是搶購成功,頁面會自動跳轉,這裏須要注意下:以前的搶購這個按鈕是存在的,因此我點一下reback,就是稍後那個10秒到5秒的倒計時,請求真的會從新提交給服務器,而不用等30秒。18號的搶購中,卻刪除了這個按鈕,致使我搶購失敗。也讓鬱悶的我決定寫這篇文章。
b.retime();//下一個函數
_gaq.push([」_trackEvent「, 」活動「, 」搶購「,」進入活動「);
a.onclick = null;
return false
}
},cookie
//以上,點擊開始搶購後的執行的代碼,注意這裏return false,你懂得。
retime: function() {
m.$(」box-close「).innerHTML =」 「;
m.$(」reback「).className = 」reback_btn「;
count = CONFIG.count //count是等待的秒數
},app
//以上,進行重試的倒計時
changebg: function() {
stop = false;
setInterval(function() {
if (!stop) {
m.$("top").className = "topmitv";
stop = true
} else {
m.$("top").className = "topmi3";
stop = false
}
},
0x1388) //5秒鐘後自動換背景哦。
},dom
//以上,自動背景替換,5秒換一下
showVideo: function(g) {
if (typeof document.body.style.maxHeight !== 」undefined「) {//只顯示一個等待框。
var a = document.body.scrollWidth;
var e = document.body.scrollHeight;
var b = m.$(」videoBoxMask「);
b.style.width = a + 」px「;
b.style.height = e + 」px「;
b.style.display = 」block「;
b.onclick = function() {
Util.closeBox()
};
var c = 」<span class="close" onclick="Util.closeBox()" title="關閉">X「;
var f = document.getElementById(」videoBox「);
var d = g.getAttribute(」data-url「);
f.innerHTML = c.replace(」{{videoUrl}}「, d);
f.style.display =」block「;
return false
}
},
//以上,顯示風起雲涌的人山人海的對話框,等吧,兄弟們。
closeBox: function() {
m.$(」videoBox「).style.display = 」none「;
m.$(」videoBox「).innerHTML =」「;
m.$(」videoBoxMask「).style.display =」none「;
},
//以上,關閉搶購排隊對話框
getBookInfo: function(c) { //傳入一個c,c是什麼呢?
var a = 」「,
e = 」「,
d = 」「,
b = function(g, f, h) {
return 」<h3>很遺憾,您沒有預定「 + g + 」喔</h3>參與開放購買須要提早預定,別灰心,你可返回首頁嘗試購買「 + f + 」, 也可當即預定11月26日星期二開放購買</p>「 + h + 」返回活動首頁「
};
switch (c) { //原來c是搶購的種類
case 」phone「:
a = 」小米手機「;
e = 」小米電視及小米盒子「;
d = CONFIG.urls.bookPhone;
break;
case 」tv「:
a = 」小米電視「;
e = 」小米手機及小米盒子「;
d = CONFIG.urls.bookTv;
break;
case 」box「:
a = 」小米盒子「;
e = 」小米手機及小米電視「;
d = CONFIG.urls.bookBox;
break
};
m.$(」box-reg-wrap「).innerHTML = b(a, e, d);
m.$(」box-reg-wrap「).style.background =」url(http://p.www.xiaomi.com/open/131101/images/mitu-1.png) no-repeat 5px 0「 //來張漂亮背景
},
//以上,只是用來通知哥們沒有預定。。不能搶購。
pushGA: function(b) {
var a = 」「;
switch (b) {
case 」phone「:
a = 」購買手機「;
break;
case 」tv「:
a = 」購買電視「;
break;
case 」box「:
a = 」購買盒子「;
break
};
_gaq.push([」_trackEvent「, 」活動「, 」搶購「, a])
},
//以上,是用來借用google的分析引擎,記錄用戶行爲和流量
bookedPop: function(c, d) { //d很關鍵,d裏面有預約的url
var b = CONFIG.isBook,
a = d.getAttribute(」href「);
if (m.cookie(CONFIG.cookies.userid)) { //採用cookie進行權限驗證,下降服務器負載
if ((c === 」phone「 && b.phone === false) || (c === 」tv「 && b.tv === false) || (c === 」box「 && b.box === false)) {//沒預約的判斷
this.getBookInfo(c);//提示哥們沒有預約
getStatus.boxy(true, 」-reg「) //去預約吧
} else {
window.open(a) //打開支付的頁面,
}
} else {
location.href = CONFIG.urls.login//悲催的沒登錄。。。
};
return false
},
//以上,是支付的代碼
showBox: function(b) {
var a = CONFIG.isBook;
this.pushGA(b);
if (m.cookie(CONFIG.cookies.userid)) {
CONFIG.proType = b;
if ((b === 」phone「 && a.phone === false) || (b === 」tv「 && a.tv === false) || (b === 」box「 && a.box === false)) {
this.getBookInfo(b);
getStatus.boxy(true, 」 -reg「);
return false
};
getStatus.jsonInter(CONFIG.srcs.hdget,」hdget「, true)
} else {
location.href = CONFIG.urls.login
}
},
animate: function(e, b) {
var c = document.getElementById(e);
var d = b;
var a = function() {
var i = d / 0xa;
var g = 0x0;
var f = function() {
g++;
if (g == 0xa) {
clearInterval(h)
};
var j = 0x0 - 0x5a * g;
c.style.backgroundPosition = j +」px 0「
};
f();
var h = setInterval(f, i)
};
a();
window.loadingAnimate = setInterval(a, d)
},
resetServertime: function() {
var a = 0x1e * 0xea60;
window.resetTime = setInterval(function() {
getStatus.jsonInter(CONFIG.srcs.hdinfo, 」hdinfo「, false)
},
a)
}
};
//以上,是顯示用的動畫
var loginInfo = {
data: {
userId: 0x0,
userName: 」「 //用cookie存用戶信息
},
init: function() {
this.data.userId = m.cookie(CONFIG.cookies.userid); //取出用戶名
if (!this.data.userId) {
return false
};
this.data.userName = (this.data.userId) ? m.cookie(」XM_「 + this.data.userId + 」_UN「) : 」「;//這裏要hack的人要注意了,是cookie的格式,應該能夠僞造
if (this.data.userName == null || this.data.userName == 」「) {
var a = document.createElement(」script「);
a.src = 」https://account.xiaomi.com/pass/userInfoJsonP?userId=「 + this.data.userId + _$[277];
a.type = 」&callback=loginInfo.getAccountInfo「;
a.async = true;
document.getElementsByTagName(」text/javascript「)[0x0].appendChild(a)
} else {
this.upUserInfo()
}
},
//以上,是右上角登錄狀態的顯示
upUserInfo: function() {
var a = this.data.userName;
if ( !! m.$(」LoginArea「)) {
m.$(」LoginArea「).innerHTML = 」歡迎您 「 + a + 」!<a href='http://order.xiaomi.com/site/logout'>退出「;
m.$(」LoginArea「).style.paddingLeft = 」12px「
}
},
//以上,同上,寫的好業餘
getAccountInfo: function(b) {
if (b.userId) {
this.data.userName = (b.uniqName) ? b.uniqName: b.userId;
var a = {
path: 」/「,
domain:」.xiaomi.com「
};
m.cookie(」XM_「+ this.data.userId + 」_UN「, this.data.userName, a);//這算掩耳盜鈴嗎?
this.upUserInfo()
}
}
};
//以上,用戶信息
//下面是,網頁進入完畢後自動執行的。參考 jquery的ready
m.ready(function() { //愈來愈像改寫的jquery了,爲了防止衝突,加了個m
m.phone(CONFIG.mIndex);
getStatus.init();
loginInfo.init();
Util.changebg();
m.$(」box-cache-btn「).onclick = function() {
getStatus.jsonInter(CONFIG.srcs.hdget, 」hdget「, true) //按鈕,觸發搶購,而後開始等待30秒。。
};
//以上是註冊點擊搶購按鈕的事件,點擊搶購按鈕,就執行getStatus.jsonInter方法
m.addEvent(m.$(」linksCon「), 」mouseover「,
function() {
m.$(」hdLnks「).style.display = 」block「;
m.$(」linksCon-span「).style.cssText = 」background-color:#fff;color:#333「
});
m.addEvent(m.$(「linksCon」),"mouseout",
function() {
m.$("hdLnks").style.display = "none";
m.$("linksCon-span").style.cssText = "background:none;border:0;"
})
});
//以上
//如下是自動執行代碼,是給google用來作分析的
var _gaq = _gaq || [];
_gaq.push([「_setAccount」, 「UA-24946561-1」]);
_gaq.push([「_addOrganic」,「baidu」, 「word」]);
_gaq.push([「_addOrganic」, 「soso」, 「w」]);
_gaq.push([「_addOrganic」, 「vnet」, 「kw」]);
_gaq.push([「_addOrganic」, 「sogou」, 「query」]);
_gaq.push([「_addOrganic」, 「youdao」, 「q」]);
_gaq.push([「_addOrganic」, 「so」, 「q」]);
_gaq.push(["_setDomainName", "xiaomi.com"]);
_gaq.push(["_setAllowLinker", true]);
_gaq.push(["_trackPageview"]); (function() {
var b = document.createElement("script");
b.type = "text/javascript";
b.async = true;
b.src = ("https:"== document.location.protocol ? " https://ssl" : "http://www") + ".google-analytics.com/ga.js";
var a = document.getElementsByTagName("script")[0x0];
a.parentNode.insertBefore(b, a)
})();
var _msq = _msq || [];
_msq.push(["setDomainId", 0x64]);
_msq.push(["trackPageView"]); (function() {
var a = document.createElement("script");
a.type = "text/javascript";
a.async = true;
a.src = " http://p.www.xiaomi.com/js/xmst.js";
var b = document.getElementsByTagName("script")[0x0];
b.parentNode.insertBefore(a, b)
})();
//以上,基本與搶購沒啥關係了,是谷歌的查詢統計
今天有點累了。不過再總結一句,在源代碼的config部分裏面,有個30秒超時的設置,也就是說任何人去搶購,去點擊按鈕,無論你點多塊,實際上是沒用的,這個頁面只會在30秒後提交第二次。因此,基本上全部的手機,都是30秒內被搶光的。解決辦法之一,就是你開30個網頁,甚至100個網頁,1000個網頁,這些打開搶購開關的網頁,某個頁面會在30秒內跳轉到可購買的頁面。
修改完畢