JQuery горячие клавиши связываются динамически - PullRequest
2 голосов
/ 18 января 2011

Я использую горячие клавиши jresig jresig, и похоже, что это работает для отдельных горячих клавиш. Проблема в том, что у меня есть список горячих клавиш из БД, и я хочу прочитать их и назначить горячие клавиши динамически. Итак, у меня есть список горячих клавиш и значений, и это мой 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);
    });  

  })
})

Что происходит сейчас, так это то, что каждый раз, когда я нажимаю клавишу, она просто предупреждает последнюю горячую клавишу, с которой она связана. Здесь что-то не так с логикой? Я не позволяю себе копировать и вставлять строки zillion document.bind, поэтому я пытаюсь сделать это динамически.

EDIT

Я рефакторинг моего кода с этим:

$(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 голосов
/ 14 февраля 2012

У меня была похожая проблема.У меня было это:

$(document).bind('keypress', keyBinding, function(e) {
    e.preventDefault();
    $(this).trigger("click");
});

, но после прочтения некоторых примеров я изменил это на:

$(document).bind('keydown', keyBinding, function(e) {
    $(this).trigger("click");
    return false; 
});

Оба они находятся / были внутри каждого цикла так же, как ваш, где яназначьте привязку var к чему-то вроде «Ctrl + s» или «Ctrl + Right».Интересными частями, очевидно, являются «нажатие клавиш» и «возврат ложных»;То, что у меня сейчас работает, прекрасно работает.Первый код, который у меня работал, работал не во всех браузерах (chrome), но работал в FF.

Другой важный момент, который я узнал, заключается в том, что вы должны быть осторожны с привязками.Некоторые привязки не будут работать во всех браузерах.Например, Ctrl + n не работает в Chrome (может быть, другие).На сайте github имеются тестовые страницы.Я переоборудовал один из них для работы на своем локальном сайте разработки, чтобы я мог тестировать сочетания клавиш, пока не найду те, которые работают и имеют смысл на странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...