迭代JavaScript对象以绑定键
Iterating over a JavaScript object to bind keys
考虑以下代码:
controls = {
'w': 'up',
's': 'down',
'a': 'left',
'd': 'right'
};
keysPressed = [];
for (control in controls) {
direction = controls[control];
$(document).bind('keydown', control, function() {
keysPressed.push(direction);
});
}
只有right
方向被绑定,并且它被绑定到所有四个键。这显然不是我想要的,但是我错过了什么JavaScript阻止所有属性被适当地绑定?
为了澄清,我使用jQuery。处理键名的热键。这是一个片段;可以假设所有变量都已声明。此外,代码在安全的function
包装器中。
解决方案:
我解决了这个修改:
controls = {
'w': 'up',
's': 'down',
'a': 'left',
'd': 'right'
};
keysPressed = [];
addToKeyPressArray = function(value) {
return function() {
keysPressed.push(value);
};
};
removeFromKeyPressArray = function(value) {
return function() {
keysPressed = keysPressed.filter(value);
};
};
for (control in controls) {
direction = controls[control];
$(document).bind('keydown', control, addToKeyPressArray(direction));
$(document).bind('keyup', control, removeFromKeyPressArray(direction));
}
在我看来,这可能是基本的"闭包for循环"的问题,许多人绊倒在JS。
通过google很容易找到解释和解决方案,例如:http://www.mennovanslooten.nl/blog/post/62
我是这样做的:
$( document ).keypress( function ( e ) {
var char = String.fromCharCode( e.keyCode );
if ( controls[ char ] ) {
keysPressed.push( controls[ char ] );
}
});
您没有声明direction
变量(使用var
),因此它将处于全局作用域中。这意味着for循环将运行,然后direction
将被设置为right
。
所有键都被绑定,但是所有键都调用
keysPressed.push(direction);
// and that is:
keysPressed.push("right");
我还建议你阅读Jani的帖子(以及相关文章),因为你也可能遇到这个问题。
相关文章:
- 如果数据绑定对象只有它的名称,那么敲除如何知道它
- 如何使用普通js绑定对象以更新值
- Knockoutjs 绑定对象问题
- 如何将 require('') 对象传递到绑定对象的作用域中
- 如果 ajax 刷新了绑定对象,则 .submit 不起作用
- 角度无意绑定/对象镜像
- 在 JavaScript 中传递绑定对象方法
- 循环绑定对象
- 我应该如何在ng重复中绑定对象的值
- Knockout js:用于绑定对象而不是单个值的代码
- Paper.js Z索引和绑定对象
- AngularJS-绑定对象列表
- 如何在指令的link函数中对绑定对象做出反应
- 事件创建中的Javascript绑定对象
- 删除元素时是否需要清除绑定对象?
- 为绑定对象添加属性
- javascript绑定对象's原型函数
- AngularJS用复选框绑定对象
- 有没有可能保护'this'引用绑定对象内的函数
- Angular绑定对象元素到HTML