Firefox onkeydown обнаруживает нажатую клавишу - PullRequest
9 голосов
/ 13 марта 2009

Из входного текста мне нужно вызвать функцию для захвата события onkeydown, и мне нужно передать параметр этому событию, например:

<input type="text" onkeydown="TextOnKeyDown('myPrefix');" />...

Тогда в этой функции мне нужно знать, какая клавиша была нажата. Я использую

function TextOnKeyDown(prefix) {
    var key = event.keyCode; 
    ...
}

Это работает как брелок в IE, но не в Firefox. Я читал, что для Firefox вы должны передать аргумент обработчику, а затем использовать его, чтобы получить ключ, что-то вроде:

<input type="text" onkeydown="detectKey(event)"/>
...
function detectKey(e){
     var key = (document.all) ? e.keyCode : e.which; 
     ...    
} 

Но я не могу передать свой параметр и необходимый параметр события для firefox. Есть предложения?

Ответы [ 5 ]

9 голосов
/ 13 марта 2009

Я написал это вчера, работает как в FF, так и в IE =>

//execute this during initialization
document.onkeydown = function(event) {
    var holder;
    //IE uses this
    if(window.event) {
        holder = window.event.keyCode;
    }
    //FF uses this
    else {
        holder = event.which;
    } 
    keyz(holder);
}

function keyz(key) {
    if(key === /*desired code*/) {
        /*execute stuff*/
    }
}

вы хотите заменить document.onkeydown на [ваш ввод] .onkeydown

7 голосов
/ 13 марта 2009

Ни одно из предложенных решений не работало так, как мне нужно было добавить мой собственный параметр помимо необходимого параметра "события" для Firefox, чтобы получить код ключа. В любом случае, помогли, спасибо, ребята. Я ставлю окончательное решение для будущих читателей:

В конце мне просто нужно было добавить параметр "событие" в вызывающую сторону:

<input type="text" onkeydown="TextOnKeyDown('myPrefix', event);" />

и обработчик:

function TextOnKeyDown(prefix, evt) {    
   var key = (evt.which) ? evt.which : evt.keyCode;
...
}

Как-то раньше это не сработало, я не знаю почему.

7 голосов
/ 13 марта 2009

Я использую это в Firefox, и он работает:

<input .... onkeypress="return isNumberKey(event);">

, а затем функция js:

function isNumberKey(evt)
{
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if(charCode==37||charCode==39||charCode==46)return true;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
    return false;

    return true;
}
1 голос
/ 06 апреля 2011

Еще один поворот, который объединяет получение события и код ключа:

function calledOnKeypress(winEvent) {
    var keyCode;
    // event passed as param in Firefox, not IE where it's defined as window.event
    if(!winEvent) {
        winEvent = window.event;
        keyCode = winEvent.keyCode;
    }
    else { // ff
        keyCode = winEvent.which;
    }
}
0 голосов
/ 13 марта 2009

Вы можете использовать arguments[0]:

<input type="text" onkeydown="detectKey(arguments[0])"/>

Чтобы добавить туда событие IE, вы можете сделать:

<input type="text" onkeydown="detectKey(arguments[0] ? arguments[0] : event)"/>

Или измените функцию detectKey(e), чтобы проверить, установлена ​​ли e, и используйте event, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...