有什么想法,这是错的吗?无法弄明白......它说arr
不等于[17, 67]
var key = function(keys, fn) {
var arr = [];
$(document).on({
keydown: function(e) {
arr.push(e.which);
if (arr === keys) {
fn();
}
},
keyup: function() {
arr = [];
}
});
};
// ctrl + c
key([17, 67], function() {
alert(true);
});
这是fiddle
更新
由于Cymen的回答是有效的,但是如果按ctrl + a
然后再按ctrl + alt + a
,反之亦然,那么您需要两次启动第二个快捷方式才能工作,任何想法?
新fiddle。
var key = function(keys, fn) {
var arr = [];
$(document).on({
keydown: function(e) {
arr.push(e.which);
for (var i = 0; keys[i]; i++) {
if (arr[i] !== keys[i]) {
return false;
}
}
fn(e);
arr = [];
},
keyup: function() {
arr = [];
}
});
};
// ctrl + c
key([17, 67], function() {
alert(true);
});
// ctrl + alt + c
key([17, 18, 67], function() {
alert('ctrl+alt+c');
});
答案 0 :(得分:4)
您无法使用===
检查内容是否相等。使用JavaScript控制台查看:
[17, 35] === [17, 35]
false
a = [17, 35]
[17, 35]
a === a
true
所以数组上的===
检查引用而不是值。您可以使用像下划线这样的其他东西进行比较,或者如果它是某种挑战则自己写一个。或者由于您只是比较两个元素,请执行以下操作:
var key = function(keys, fn) {
var arr = [];
$(document).on({
keydown: function(e) {
arr.push(e.which);
if (arr[0] === keys[0] && arr[1] === keys[1]) {
fn();
arr = []; // added this to avoid buggyness
}
console.log(arr);
console.log(keys);
},
keyup: function() {
arr = [];
}
});
};
// ctrl + c
key([17, 67], function() {
alert(true);
});
You need an array comparison that works for variable lengths like this one:
var equalArrays = function(array1, array2) {
if (array1.length != array2.length) {
return false;
}
for (var i=0; i < array1.length; i++) {
if (array1[i] !== array2[i]) {
return false;
}
}
return true;
}
var key = function(keys, fn) {
var arr = [];
$(document).on({
keydown: function(e) {
arr.push(e.which);
console.log('arr', arr, 'keys', keys, 'match', equalArrays(arr, keys));
if (equalArrays(arr, keys)) {
fn();
arr = [];
}
console.log(arr);
console.log(keys);
},
keyup: function() {
arr = [];
}
});
};
// ctrl + c
key([17, 67], function() {
alert(true);
});
// ctrl + alt + c
key([17, 18, 67], function() {
alert('ctrl+alt+c');
});
我们需要跟踪按下了哪些按键,但是只能在一个组合中按下一个按键(我假设),而在按键时,我们应该只删除按键而不是所有按键。所以这是一个有效的方法:
var equalArrays = function(array1, array2) {
return _.isEqual(array1, array2);
}
var key = function(keys, fn) {
var arr = [];
$(document).on({
keydown: function(e) {
arr = _.without(arr, e.which);
arr.push(e.which);
if (equalArrays(arr, keys)) {
fn();
}
},
keyup: function(e) {
arr = _.without(arr, e.which);
arr = _.uniq(arr);
}
});
};
// ctrl + c
key([17, 67], function() {
alert('ctrl+c');
});
// ctrl + alt + c
key([17, 18, 67], function() {
alert('ctrl+alt+c');
});