Вот моя версия:
<html>
<head>
<script type="text/javascript" src="jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="rx.js"></script>
<script type="text/javascript" src="rx.jQuery.js"></script>
</head>
<body>
<p id="result"></p>
<script type="text/javascript">
$(function() {
var konami = $(document).toObservable("keyup").Select(function(e) {
return e.keyCode
}).SkipWhile(function(k) {
return (k != 38)
}).BufferWithCount(
10
).Where(function(ks) {
return ks.length == 10 &&
ks[0] == 38 && ks[1] == 38 &&
ks[2] == 40 && ks[3] == 40 &&
ks[4] == 37 && ks[5] == 39 &&
ks[6] == 37 && ks[7] == 39 &&
ks[8] == 66 && ks[9] == 65
})
var konamisub = konami.Subscribe(function(e) {
$("#result").text("KONAMI!")
$("#result").fadeIn().fadeOut()
})
})
</script>
</body>
</html>
Я преобразую поток событий keyup в поток кодов клавиш с помощью Select
, затем игнорирую нажатия клавиш до тех пор, пока пользователь не нажмет вверх (код клавиши 38) с помощью SkipWhile
, затем собираем 10 нажатий клавиш с помощью BufferWithCount
, затем проверяем нажатия клавиш с помощью Where
.
Я пытался использовать BufferWithTime, но он имеет тенденцию сокращаться в середине нажатий клавиш.* Если кто-то может предложить улучшения, я хотел бы услышать их.