prototype / javascript - firefox не запускает событие нажатия клавиш / нажатия клавиш, если фокус не находится в текстовом поле - PullRequest
3 голосов
/ 10 марта 2009

Следующее прекрасно работает на IE6, IE7 и Chrome. Не работает на ff 3.0.7.

<html><head>
<script src="prototype.js" type="text/javascript" ></script>
<script type="text/javascript">
Event.observe(window, 'load', 
    function(){
        Event.observe(document.body, 'keydown', myEventHandler);
        alert('window load');
    });
function myEventHandler(evt) {
    alert(evt);
}
</script>
</head>
<body >
<input type="text" /><br><br>
</body></html>

РЕДАКТИРОВАТЬ: под "не работает", я имею в виду, myEventHandler не запускает в Firefox.

EDIT2: Более того, он работает нормально, когда фокус находится на элементе ввода. Я хочу, чтобы он стрелял из всех ключей.

Ответы [ 4 ]

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

Я понятия не имею, почему ваш код не работает, но он слишком сложен - это должно сработать:

document.observe('keydown', myEventHandler);

Нет необходимости ждать load, так как document доступен немедленно.


Ваш код не работает, потому что не все ключевые события происходят из элемента body документа. У Opera есть проблемы, похожие на те, что есть в Firefox, но исходный элемент, кажется, дополнительно зависит от расположения курсора мыши.

В любом случае, исправление состоит в том, чтобы просто ловить события на уровне document, потому что, пока никто не мешает им делать это, все события DOM в конечном итоге будут пузыриться до document.

3 голосов
/ 10 марта 2009

Я также обнаружил, что мои события нажатия клавиш не запускались в Firefox для подобного кода. В моем случае мне не нужно использовать ничего, кроме Safari и Firefox, поэтому я не проверял это на IE. Тем не менее, наблюдение «document», а не «document.body», похоже, сработало:

document.observe('dom:loaded', function() {
    Event.observe(document, 'keypress', function(evt) {
       alert("In Keypress Function");
    });
});

Теперь я понимаю, что это наблюдение за нажатием клавиши, а не за нажатием клавиши. AFAIK, нажатие клавиши генерируется сразу после нажатия клавиши.

0 голосов
/ 25 мая 2010

Кстати, для tab, esc и аналогичных вам нужно использовать keyup, а не нажатие клавиши. По крайней мере, для Safari, у меня ушло довольно много времени, чтобы понять это.

Убедитесь сами, добавив эту строку: alert ("Key :" + evt.keyCode); в аноне. функция. Отвечают только глифы.

- Dave

0 голосов
/ 10 марта 2009

Попробуйте обернуть ввод элементом формы. Если это не поможет, деформируйте его в div и присоедините ваш обработчик к div.

...