我正在使用jresig的jquery热键,看起来它适用于单个热键。问题是我有一个来自数据库的热键列表,我想读取它们并动态分配热键。所以我有一个热键和值列表,这是我的js:
$(document).ready(function() {
var keyList = [];
$('.hotkey').each( function(){
hotkey = $(this).attr('value');
hotkey = hotkey.substring(1,hotkey.length-1);
myVal = $(this).next().attr('value');
alert("binding " + hotkey);
$(document).bind('keydown', hotkey, function() {
alert("YOU PRESSED " + hotkey);
$('.chosen-category-id').attr('value', hotkey);
$('.chosen-category-name').attr('value', myVal);
});
})
})
现在发生的事情是,每按一次键,它就会警告它绑定的最后一个热键。这里的逻辑有问题吗?我正在保持自己不要复制粘贴一个数十亿的文档。绑定行,所以我试图动态地这样做。
修改的
我用这个重构了我的代码:
$(document).ready(function() {
var keyList = [];
var keyValues = [];
$('.hotkey').each( function(){
hotkey = $(this).attr('value');
hotkey = hotkey.substring(1,hotkey.length-1);
keyList.push(hotkey);
keyValues.push($(this).next().attr('value')) ;
})
$.each(
keyList,
function(index, key) {
$(document).bind('keydown', key, function() {
alert("O HAI YOU PRESSED " + key);
$('.chosen-category-id').attr('value', key);
$('.chosen-category-name').attr('value', keyValues[index]);
return false;
});
}
)
})
它现在有效,但我很好奇为什么这个有效而另一个没有。热键变量是否会覆盖最后一次迭代?此外,第一个代码看起来更有效,因为它只执行一个循环,而第二个代码执行两个循环。
答案 0 :(得分:0)
我有类似的问题。我有这个:
$(document).bind('keypress', keyBinding, function(e) {
e.preventDefault();
$(this).trigger("click");
});
但在阅读了一些例子后,我将其改为:
$(document).bind('keydown', keyBinding, function(e) {
$(this).trigger("click");
return false;
});
这两个都在每个循环中,就像你在我将keybinding var指定为“Ctrl + s”或“Ctrl + Right”之类的东西。有趣的部分显然是“按键”和“返回假”;我现在所做的一切都很好。我使用的第一个代码并不适用于所有浏览器(chrome)但在FF中工作。
我学到的另一个小问题是你必须小心绑定。某些绑定不适用于所有浏览器。例如,Ctrl + n在Chrome中不起作用(可能是其他人)。 github site上有测试页面。我对其中一个进行了改造,以便在我的本地开发站点上工作,这样我就可以测试关键的组合,直到找到在页面上有效且有意义的组合。