Горячие клавиши jQuery - нет привязки? - PullRequest
3 голосов
/ 04 февраля 2011

У меня есть диалоговое окно jQuery, которое инициализирует горячие клавиши следующим образом:

<script type="text/javascript">
  $(document).bind('keydown', '<%=(i+1)%>',function (evt) {
     // do stuff
  });
</script>

Это перебирает 1-9 ...

Проблема в том, что если закрыть диалоговое окно и затем снова открытьдиалог.Он продолжает переплетаться, поэтому, когда вы нажимаете клавишу «1», он запускается дважды, трижды, четыре раза и т. Д., Он просто продолжает расти.

Я пытался уничтожить привязки клавиш в диалоговом окнезакрыть с

$(document).unbind('keydown', '1');
$(document).unbind('keydown', '2');
$(document).unbind('keydown', '3');
$(document).unbind('keydown', '4');
$(document).unbind('keydown', '5'); 
$(document).unbind('keydown', '6');
$(document).unbind('keydown', '7');
$(document).unbind('keydown', '8');
$(document).unbind('keydown', '9');

Но это не имело никакого эффекта.Любые идеи о том, как справиться с этим?

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

Обратите внимание, что .unbind() не поддерживает аргумент eventData, поэтому ваши открепления не работают.

Вне моей головы, у вас есть два разных подхода. Если это единственные привязки клавиш на уровне документа, вы можете выполнить «полную» привязку следующим образом:

$(document).unbind('keydown'); // unbinds *all* keydown handers on the document

В качестве альтернативы, вы можете сохранить ваш обработчик клавиш как неанонимную функцию и сохранить ссылку для возврата для отмены привязки при закрытии диалога:

function onkeydown(evt) {
   // do stuff
}

$(document).bind('keydown', '<%=(i+1)%>', onkeydown);

// later, in the dialog's "shutdown" code:
$(document).unbind('keydown', onkeydown);

Однако я не уверен на 100%, как это работает, когда одна и та же функция связана несколько раз. Вам, вероятно, лучше исключить eventData и использовать event.which внутри вашего обработчика событий, чтобы определить, какая клавиша была нажата (для этого потребуется только один раз привязать обработчик).

1 голос
/ 28 августа 2012

Я решил аналогичную проблему, используя пространство имен для события keydown в сочетании с one ()

обратите внимание на .g в "keydown.g". Это помещает его в отдельную область, которую позже я могу отсоединить, не отвязывая каждую клавишу в документе.

$(document).one("keydown.g", function(e) {
 // tab key
 if (e.which == "9") {
  e.preventDefault();
  // do something like focus on a field
  $("#target").focus();
  // once you've moved the focus, you can unbind and go back to tabbing normally
  $(document).unbind("keydown.g");
 } 
});

<3 Jquery </p>

0 голосов
/ 04 февраля 2011

Вы можете использовать

<script type="text/javascript">
$( document ).ready( function() {
    $(document).bind('keydown', '<%=(i+1)%>',function (evt) {
        // do stuff
    });
} );
</script>

Этот метод привязывает события один раз при загрузке документа.

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