#jquery
#jquery
Вопрос:
Я использую сторонний элемент управления (Aspose.Ячейки.Сеточная сеть). По сути, это веб-элемент управления Excel. Когда пользователь выбирает ячейку, элемент управления вызывает событие onCellSelected .
Дело в том, что мне нужно знать, какая клавиша была нажата пользователем, чтобы вызвать это событие. Мне нужна эта информация, чтобы определить, как обрабатывать событие.
Я использую событие нажатия клавиши jQuery для захвата нажатой кнопки.
$(document).keydown(function(event) {
isKeyLastClicked = true;
keyLastClickedId = event.which;
isMouseButtonLastClicked = false;
mouseButtonLastClickedId = null;
});
Проблема в том, что событие onCellSelected элемента управления вызывается ДО возникновения события keydown. Это ожидаемое поведение?
Есть ли какой-либо способ получить идентификатор ключа до возникновения события элемента управления?
Заранее спасибо.
Ответ №1:
После долгого обсуждения в чате SO…
Поскольку привязка keydown
события не дает желаемых результатов, вам необходимо изменить onCellSelected
функцию. Оно должно следовать следующему шаблону:
- Когда onCellSelected запускается в первый раз, первый аргумент (
cell
) присваивается (временной) переменной. - Затем, когда
keydown
происходит событие, проверяется код ключа:- Если нажатая клавиша (
ev.which
илиev.keyCode
) равна определенной клавише,onCellSelected
функция вызывается снова, передавая значение временной переменной в качестве первого аргумента. - В противном случае временная переменная очищается, поскольку запоминать ее нет смысла.
- Если нажатая клавиша (
Код будет иметь следующую структуру. Измените его в соответствии с вашим приложением:
var lastCell = null;
function onCellSelected (cell) {
if(lastCell == null) {
lastCell = cell;
return; //Wait for the next listener
}
... //Rest of code
}
$(document).keydown(function(e){
if(lastCell == null) return; //No need to do unnecessary calculations
//Whatever you want, example:
if(e.keyCode == 32) {
onCellSelected(lastCell);
lastCell = null; //Reset
}
... //Rest of code
});
Примечание: keyCode
, charCode
и which
, смотрите также: http://asquare.net/javascript/tests/KeyCode.html
Ответ №2:
Я все еще не уверен, как заставить keydown
событие сработать первым (или если это вообще возможно). Но я обнаружил, что вы можете получить доступ к последнему событию Windows в любое время. Поэтому вместо того, чтобы полагаться на событие для установки переменных, как показано в моем первоначальном вопросе выше, я просто получаю доступ window.event.type
.
Вот несколько примеров кода: показано, как использовать window.event
:
if (window.event.type == "keydown") { //keyboard click
if (IsKeyNextType(window.event.which)) { //checks which key was pressed. In this case a key qualifying as "Next" (ie: Enter, Tab, etc)
//PERFORM NEXT ACTIONS
}
else { //"Previous" keys (ie: Up arrow, Left arrow)
//PERFORM PREVIOUS ACTIONS
}
}
else if (window.event.type == "click") { //mouse click
//PERFORM MOUSE CLICK ACTIONS
}
Комментарии:
1.
window.event
это нестандартная функция только для IE.2. @RobW: Вы уверены? Он отлично работает в Chrome. Каковы эквивалентные события в других браузерах?
3. Объект события имеет смысл в контексте прослушивателя событий. Когда запускается прослушиватель событий, первым аргументом функции является объект события.
window.event
по крайней мере, не поддерживается в Firefox.4. @RobW: Есть ли какой-нибудь способ сделать эквивалент
window.event.type
в FF? Если нет, то я, вероятно, вернулся к исходной точке, когдаkeydown
событие запускается слишком поздно.5. Добро пожаловать обратно на круги своя :/
Ответ №3:
Это зависит от порядка вашего кода.
То, что когда-либо было первым в коде, будет выполнено первым.
Также лучше использовать обратные вызовы вместо двух отдельных функций (которые могут быть нестабильными).