Коли закидається подія JQuery keydown?

Я використовую сторонній контроль (Aspose.Cells.GridWeb). Це в основному веб-контроль Excel. Коли користувач вибирає комірку, подія onCellSelected піднімається контролером.

Справа в тому, мені потрібно знати, який ключ натиснув користувач, щоб викликати цю подію. Мені потрібна ця інформація, щоб визначити, як керувати подією.

Я використовую подію keydown jQuery для зйомки натиснутою кнопки.

    $(document).keydown(function(event) {
        isKeyLastClicked = true;
        keyLastClickedId = event.which;
        isMouseButtonLastClicked = false;
        mouseButtonLastClickedId = null;
    });

Проблема полягає в тому, що подія controlClickSelected піднята до того, як подія keydown буде піднята. Це очікувана поведінка?

Чи є спосіб отримати ідентифікатор ключа до того, як піднята подія управління?

Заздалегідь спасибі.

0

3 Відповіді

After a long discussion at the SO chat...
Since binding the keydown event does not produce the desired results, you have to alter the onCellSelected function. It should follow the next pattern:

  1. When onCellSelected is triggered for the first time, the first argument (cell) is assigned to a (temporary) variable.
  2. Then, when a keydown event occurs, the key code is checked:
    • If the pressed key (ev.which or ev.keyCode) equals a certain key, the onCellSelected function is called again, passing the value of the temporary variable as a first argument.
    • Else, the temporary variable is cleared, since it makes no sense to remember it.

Код матиме наступну структуру. Змінити його відповідно до вашої програми:

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
});

Note: keyCode, charCode and which, see also: http://asquare.net/javascript/tests/KeyCode.html

1
додано

Я все ще не впевнений у тому, як потрапити в першу чергу події keydown (або навіть якщо це можливо). Але я дізнався, що ви можете отримати доступ до останньої події у вікні в будь-який час. Тому замість того, щоб покладатися на подію, щоб встановити змінні, як показано в моєму оригінальному запиті вище, я просто отримую доступ до 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
}
0
додано
@ ROBW: Ви впевнені? Він чудово працює в Chrome. Які еквівалентні події в інших браузерах?
додано Автор Shai Cohen, джерело
@RobW: Чи є якийсь спосіб зробити еквівалент window.event.type у FF? Якщо ні, то я, мабуть, повернувся до квадратної, де занадто пізно запускається подія keydown .
додано Автор Shai Cohen, джерело
@ ROBW: Argh :). Чи те, що Ніл заявив у іншій відповідь, правда? Що порядок має значення? Чи буде подія звільнена раніше чи пізніше залежно від того, де я підписаний на нього? Мені здається неправий. Але готові щось спробувати.
додано Автор Shai Cohen, джерело
додано Автор Shai Cohen, джерело
window.event - це нестандартна функція IE.
додано Автор Rob W, джерело
Об'єкт події має сенс у контексті слухача події. Коли запускається слухач події, першим аргументом функції є об'єкт події. window.event принаймні не підтримується в Firefox.
додано Автор Rob W, джерело
Ласкаво просимо до квадрата 1: /
додано Автор Rob W, джерело
Шай, чи можете ви передати мені джерело, де ви демонструєте свій код? Якщо ні, спробуйте обернути обробник вашого події в $ (function() {...}) і визначте цей код перед вашим сторонним кодом.
додано Автор Rob W, джерело

Це додати залежить від замовлення вашого коду.

Якийсь перший в коді стане першим.

Також краще використовувати зворотні виклики замість двох окремих функцій (які можуть бути нестабільними).

0
додано