隠しコマンドサポーター
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ 隠しコマンドを簡単に作れる関数です
◆ keyCode と ASCII での比較なので半角文字だけです(↑↑↓↓← {略}は一応できる)
◆ キーが入力されたらコールバック関数が呼び出される仕様です
◆ keyCode と ASCII での比較なので半角文字だけです(↑↑↓↓← {略}は一応できる)
◆ キーが入力されたらコールバック関数が呼び出される仕様です
なんとなーくで 隠しコマンドをサポートする関数を作りました
DOM の要素とコマンドのキーワードリストとコールバック関数を渡すと コマンドが正しく入力されると 入力したコマンドを引数にコールバック関数が呼び出されるものです
指定された要素で keydown イベントを監視しています
間違えると入力不可能状態になります
Escape キーでリセット BackSpace キーで一文字戻れます
ただ BackSpace を押すと場所によってはブラウザのページバックになるので input 以外のところで設定すると BackSpace は使えないです
判定はキーコードとASCIIコードでやってるので 数字や半角文字はできますが 記号などが入ってくるとずれてきます
有名な ↑↑↓↓←←→→ を登録したいときは &&((%'%' と言う文字列を登録すれば反応してくれます
DOM の要素とコマンドのキーワードリストとコールバック関数を渡すと コマンドが正しく入力されると 入力したコマンドを引数にコールバック関数が呼び出されるものです
指定された要素で keydown イベントを監視しています
間違えると入力不可能状態になります
Escape キーでリセット BackSpace キーで一文字戻れます
ただ BackSpace を押すと場所によってはブラウザのページバックになるので input 以外のところで設定すると BackSpace は使えないです
function hiddenCommand(elem, keywords, cb){
keywords = keywords.map(e => e.toUpperCase())
var log = [keywords]
var filtered = keywords
var n = 0
elem.addEventListener("keyup", eve => {
switch(eve.keyCode){
case 8: // backspace
n && n-- && (filtered = log.pop())
return
case 27: // escape
reset()
return
default:
filtered = filtered.filter(e => e.charCodeAt(n) === eve.keyCode)
if(filtered.length === 0){
n = NaN
return
}
n++
var match = filtered.filter(e => e.length === n)
if(match.length){
cb(match.shift())
reset()
return
}else{
log.push(filtered)
}
}
}, true)
function reset(){
filtered = keywords
log = [keywords]
n = 0
}
}
hiddenCommand(window, ["abc", "def", "&&((%'%'"], e => console.log(e))
keywords = keywords.map(e => e.toUpperCase())
var log = [keywords]
var filtered = keywords
var n = 0
elem.addEventListener("keyup", eve => {
switch(eve.keyCode){
case 8: // backspace
n && n-- && (filtered = log.pop())
return
case 27: // escape
reset()
return
default:
filtered = filtered.filter(e => e.charCodeAt(n) === eve.keyCode)
if(filtered.length === 0){
n = NaN
return
}
n++
var match = filtered.filter(e => e.length === n)
if(match.length){
cb(match.shift())
reset()
return
}else{
log.push(filtered)
}
}
}, true)
function reset(){
filtered = keywords
log = [keywords]
n = 0
}
}
hiddenCommand(window, ["abc", "def", "&&((%'%'"], e => console.log(e))
["abc" と入力]
ABC
["ab"(Escape)"def" と入力]
DEF
["aabc" と入力]
[↑↑↓↓←→←→ と入力]
&&((%'%
ABC
["ab"(Escape)"def" と入力]
DEF
["aabc" と入力]
[↑↑↓↓←→←→ と入力]
&&((%'%
判定はキーコードとASCIIコードでやってるので 数字や半角文字はできますが 記号などが入ってくるとずれてきます
有名な ↑↑↓↓←←→→ を登録したいときは &&((%'%' と言う文字列を登録すれば反応してくれます