Калі кінута JQuery KeyDown падзея?

Я выкарыстоўваю элемент кіравання трэцяй бокам (Aspose.Cells.GridWeb). Гэта ў асноўным кіраванне Excel вэб-аснове. Калі карыстальнік выбірае вочка, то onCellSelected падзея ўзнікае пасродкам кіравання.

Справа ў тым, што мне трэба ведаць, якая клавіша была націснутая карыстальнікам, каб выклікаць гэтую падзею будзе паднятае. Мне патрэбна гэтая інфармацыя, каб вызначыць, як апрацоўваць падзея.

Я выкарыстоўваю KeyDown падзея Jquery, каб захапіць кнопку націснуў.

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

Праблема заключаецца ў тым, што onCellSelected падзея элемента кіравання падымаецца ПЕРАД 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 падзея страляць першым (ці, калі гэта ўвогуле магчыма). Але, я выявіў, што вы можаце атрымаць доступ да апошніх падзеяў 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
}
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, крыніца
Сардэчна запрашаем на кругі свая: /
дададзена аўтар Rob W, крыніца
Шай, вы можаце перадаць крыніца для мяне, дзе дэманструецца код? Калі няма, паспрабуйце абгортачнай апрацоўшчык падзей $ (функцыя() {...}) , і вызначыць гэты код перад Ваш код трэцяй бокам.
дададзена аўтар Rob W, крыніца

Гэта даданне залежыць ад парадку вашага кода.

Які калі-небудзь з'яўляецца першым у кодзе будзе выкананы раней усіх.

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

0
дададзена