Горячие клавиши jQuery - отвязка?

У меня есть диалог 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');

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

Спасибо


person AnApprentice    schedule 04.02.2011    source источник
comment
пробовали ли вы .die() api.jquery.com/die   -  person Rafay    schedule 04.02.2011


Ответы (3)


Обратите внимание, что .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 внутри вашего обработчика событий, чтобы определить, какая клавиша была нажата (для чего обработчик будет привязан только один раз).

person Ben Blank    schedule 04.02.2011

Я решил аналогичную проблему, используя пространство имен для события 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

person 111    schedule 27.08.2012

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

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

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

person CoolEsh    schedule 04.02.2011