jquery hotkeys动态绑定

时间:2011-01-18 11:32:24

标签: jquery jquery-plugins hotkeys

我正在使用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;
      });  
    }
  )


})

它现在有效,但我很好奇为什么这个有效而另一个没有。热键变量是否会覆盖最后一次迭代?此外,第一个代码看起来更有效,因为它只执行一个循环,而第二个代码执行两个循环。

1 个答案:

答案 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上有测试页面。我对其中一个进行了改造,以便在我的本地开发站点上工作,这样我就可以测试关键的组合,直到找到在页面上有效且有意义的组合。