我有以下 $broadcast
来捕获 Angular 中的按键:
$document.bind('keypress', function(event) {
var key = event.which;
$rootScope.$broadcast('keypress', event);
$rootScope.$broadcast('keypress:' + key, event);
});
我用$on
来听
但是,我想检测何时同时按下两个键,例如同时按下 enter
和 s
(不是一一组合的组合)由另一个)。
执行此操作的最佳方法是什么?
编辑
我的想法是:
var keys = [];
$document.bind('keydown', function(event) {
keys[event.which] = true;
});
$document.bind('keyup', function(event) {
delete keys[event.which];
});
$document.bind('keypress', function(event) {
var key = event.which;
var keysPressed = [];
angular.forEach(keys, function(value, key) {
keysPressed += 'keypress:' + key;
});
$rootScope.$broadcast('keypress', event);
$rootScope.$broadcast(keysPressed, event);
});
因此,如果我有多个按键,那么我会创建正确的 $broadcast
。然而,问题在于现在的顺序很重要(即,如果我按 a
然后按 enter
,那么 $broadcast
就是 keypress:58keypress:13
如果我按其他方式,我会得到 keypress:13keypress:58
)
最佳答案
在我看来,广播使用得太多了。相反,也许使用自定义指令?这是用户按下 Shift+Tab 的示例,它会触发如下事件:
<input on-shift-tab="prevStep($event,'email')" />
app.directive('onShiftTab', function() {
return function(scope, element, attrs) {
var map = {9: false, 16: false};
element.on("keydown", function(event) {
if (event.which in map) {
map[event.which] = true;
if (map[9] && map[16]) {
scope.$apply(function(){
scope.$eval(attrs.onShiftTab, {'$event': event});
});
event.preventDefault();
}
}
});
element.on("keyup", function(event) {
if (event.which in map) {
map[event.keyCode] = false;
}
});
};
})
关于AngularJS - 同时按下多个按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23160124/