Когда генерируется событие jQuery keydown?

#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 функцию. Оно должно следовать следующему шаблону:

  1. Когда onCellSelected запускается в первый раз, первый аргумент ( cell ) присваивается (временной) переменной.
  2. Затем, когда 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:

Это зависит от порядка вашего кода.

То, что когда-либо было первым в коде, будет выполнено первым.

Также лучше использовать обратные вызовы вместо двух отдельных функций (которые могут быть нестабильными).