Селектор jQuery для документа и другого элемента

#jquery #jquery-selectors

#jquery #jquery-селекторы

Вопрос:

Могу ли я объединить их в jQuery? Я использую плагин горячих клавиш.

 $(document).bind('keydown', 'n', cycleNoise);
$(document).bind('keydown', 's', pickRandom);
$(document).bind('keydown', 'v', toggleTasks);
$(document).bind('keydown', 't', toggleTimer);
$(document).bind('keydown', 'up', hideTask);
$(document).bind('keydown', 'down', nextTask);
$('#duration').bind('keydown', 't', toggleTimer);
$('#duration').bind('keydown', 'n', cycleNoise);
$('#duration').bind('keydown', 's', pickRandom);
$('#duration').bind('keydown', 'v', toggleTasks);
$('#duration').bind('keydown', 'up', hideTask);
$('#duration').bind('keydown', 'down', nextTask);
  

Другими словами, возможно ли использовать document и '#duration' в одном и том же селекторе. Похоже, следующее не работает:

 $(document   ',#duration').bind(...);
  

Редактировать:

Я использую плагин горячих клавишjQuery. Это предотвращает появление пузырьков в текстовых полях по дизайну. Могу ли я отключить эту функцию только для этого конкретного текстового поля, изменив исходный код? Если да, пожалуйста, дайте мне знать, как это сделать.

Также плагин объединяет события нажатия клавиш или он действительно подключает 12 отдельных обработчиков? Я недостаточно хорошо понимаю jQuery, чтобы разобраться в этом. Каково наилучшее решение для достижения желаемого эффекта (воздействуя на горячие клавиши, за исключением случаев, когда в текстовых полях — кроме в '#duration' , где горячие клавиши должны быть привязаны).

Комментарии:

1. Боже мой, повторение кода… мои глаза… :P

2. Обратите внимание, что начиная с jQuery 1.7, вы можете (и должны) заменить .bind() на .on() . Я полагаю, что синтаксис останется неизменным, но вам следует взглянуть на документы, чтобы подтвердить. Вы можете передать несколько событий одному селектору с помощью .on() (и, я полагаю, .bind () также).

3.@James Я этого не понимаю… Почему вы привязываете шесть обработчиков к keydown событию? (Все шесть дескрипторов будут вызываться при каждом keydown событии.)

4. Я думаю, он думает, что это сработает только при нажатии определенной клавиши. По крайней мере, согласно документам jQuery, это не так…

5. @James Подключаемый модуль гарантирует, что вызывается только предполагаемый обратный вызов … (без подключаемого модуля все обратные вызовы вызывались бы при каждом keydown событии …)

Ответ №1:

Вот так:

 $( [ document, input ] ).
    keydown( 'n', cycleNoise ).
    keydown( 's', pickRandom ).
    keydown( 'v', toggleTasks ).
    keydown( 't', toggleTimer ).
    keydown( 'up', hideTask ).
    keydown( 'down', nextTask );
  

где input — это ссылка на ваш входной элемент. В этом случае:

 var input = $( '#duration' )[0];
  

Другим решением является

 $( '#duration' ).add( document ). // etc.
  

Ответ №2:

Это также должно сработать,

 var keys = {
    'n': cycleNoise,
    's': pickRandom,
    ....
    ..
    ..
}

$.each(keys, function(key, callback) {
    $(document).add("#duration").bind('keydown', key, callback);
})
  

Также рассмотрим ответ ThiefMaster.

Ответ №3:

Благодаря пузырьковому отображению событий обработчик событий, привязанный к самому документу, будет получать все события — так что вы можете просто удалить $('#duration') события.

Ваши обработчики будут срабатывать для всех клавиш, кстати, вы не можете их ограничить — вам нужно проверить, какая клавиша была нажата с помощью e.which (при условии, что первый параметр функции-обработчика назван e ) в самой функции.

Ответ №4:

Это должно сработать:

 $('body ,#duration').bind(...);
  

На самом деле, если вы привязываетесь к документу, нет необходимости привязываться к чему-либо еще.

Как указывали другие, ваш синтаксис привязки keydown также неверен.