不知道还有多少人对“上上下下左左右右ABBA”记忆犹新。
再次想起这个秘籍,第一反应居然是QQ音乐,好吧,就用他的代码来说事吧。
原始代码如下:
MUSIC.channel.top.egg_contra = function() {
var _konamiCode = [], _jsLoader = null;
function init(doc) {
MUSIC.event.on(doc || document, "keyup", _trick)
}
function _reset() {
_konamiCode = [65, 66, 39, 37, 39, 37, 40, 40, 38, 38]
}
function _trick(evt) {
evt = MUSIC.event.getEvent(evt);
var t = _konamiCode.pop();
try {
if (evt.keyCode - t == 0) {
if (_konamiCode.length == 0) {
if (!_jsLoader) {
_jsLoader = new MUSIC.JsLoader;
_jsLoader.onload = function() {
try {
g_eggContraEx.start()
} catch (e) {
}
};
_jsLoader.load("http://imgcache.gtimg.cn/music/portal_v3/extend/egg_contra.js",
null, "utf-8")
} else
try {
g_eggContraEx.start()
} catch (e) {
}
_reset()
}
} else
_reset()
} catch (e) {
}
}
_reset();
return {init: init}
}();
经典的揭示模块的写法,对外提供了一个简单的可调的api:init,我们来精简一下代码:
var egg = function() {
//
var _konamiCode = [], _jsLoader = null;
//初始化,用于注册事件
function init(doc) {
//如果其他事件中已经获取过document并且传递进来
//那么用之前缓存好的,否则直接绑定document元素的按键事件
doc = doc || document;
doc.addEventListener("keyup", _trick);
}
//重置按键序列
function _reset() {
_konamiCode = [65, 66, 39, 37, 39, 37, 40, 40, 38, 38]
}
//判断是否秘籍合法
function _trick(e) {
if(!e||!e.keyCode){
return false;
}
//依次取序列最后的数值
var t = _konamiCode.pop();
if(0 == e.keyCode - t){
if(0==_konamiCode.length){
//执行你想要的东西
alert('excute code.');
//重置按键序列或者也可以加标志,或者移除事件
_reset();
}
}else{
_reset()
}
}
//初始化按键序列
_reset();
return {init: init}
}();
//初始化,并调用公开API绑定事件。
egg.init()
大概就是这样了吧,睡醒再说。