Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Opera, событие не возникает вновь при вдавленной кнопке. (https://javascript.ru/forum/css-html-browser/27561-opera-sobytie-ne-voznikaet-vnov-pri-vdavlennojj-knopke.html)

micscr 17.04.2012 10:35

Opera, событие не возникает вновь при вдавленной кнопке.
 
код
jQuery(document).ready(function(){
  jQuery(document).keydown(function(ev){
     if ((ev.keyCode > 36) && (ev.keyCode < 41)) {
	 nazata(ev.keyCode);	//действия 								 
     }
  });			  
});

Когда стрелку вдавливаешь, то событие должно повторяться. Так и работает во всех моих браузерах кроме оперы. Что делать?

devote 17.04.2012 11:43

Цитата:

Сообщение от micscr
Когда стрелку вдавливаешь, то событие должно повторяться.

используйте keypress, я вообще удивлен что другие браузеры обрабатывают событие keydown так же как событие keypress

micscr 17.04.2012 12:18

хм перетащил проверку стрелок на keypress , в опере стало окей.
Но в хроме стрелки не работают на keypress(это у меня записано, поэтому я их на keydown и проверял)

Kolyaj 17.04.2012 12:30

С клавишами в браузерах всё плохо, по ним можно диссертацию писать. Причём с разными клавишами по разному плохо. Если говорить про стрелки, то при их залипании
* В IE и в Chrome повторяется keydown
* В Опере повторяется keypress
* В Firefox-е повторяются и keydown, и keypress.

Вот и делай что хочешь. Получается надо оба ловить, но при этом в Firefrox-е одно из них игнорировать.

По логике, правильное поведение здесь у IE и у Chrome. Firefox решил перестраховаться, но в целом тоже покатит. А Опера в своём репертуаре мудацкого браузера.

devote 17.04.2012 12:51

Цитата:

Сообщение от Kolyaj
А Опера в своём репертуаре мудацкого браузера.

не согласен, keypress и в африке keypress. Это событие должно повторяться в тех случаях когда клавишу зажмешь и продолжаешь держать ее. Тогда при нажатии срабатывает keydown а повторы уже идут на keypress... Так что этот мудатский браузер как вы говорите, делает таки наоборот правильнее всех иных браузеров. Повторять keydown при зажатой клавише, вот это мудатство.

devote 17.04.2012 13:00

не просто так события называются так как называются:
keydown - нажали клавишу, то-есть опустили, срабатывает событие что именно нажали клавишу
keypress - от английского слова pressed (зажата) то-есть клавиша зажата, соответственно все повторы идут на это событие до тех пор пока клавиша не будет отжата.
keyup - подняли клавишу, то-есть отпустили.

Вся эта логика работает во всех языках в которых я программировал, а их более десяти как минимум. Поэтому Опера все же работает правильнее всех.

Octane 17.04.2012 13:04

А вот кстати еще удивляет по какой такой логике сделали разный порядок срабатывания:
mousedown → mouseup → click
и
keydown → keypress → keyup

----------
Помня что click последним возникает, сначала хотел написать, что логичнее было бы повторять keydown, а Opera как всегда, но потом посмотрел, как ведут себя браузеры…

devote 17.04.2012 13:15

Цитата:

Сообщение от Octane
А вот кстати еще удивляет по какой такой логике сделали разный порядок срабатывания:

А попробуй их пойми, разработчики Оперы не выдумывали никакой логики, а сделали так как принято в языке Си. Именно по порядку keydown → keypress → keyup, насчет разрабов других браузеров я сам бы хотел понять по какой такой логике решили повторять keydown при зажатой клавише.

Kolyaj 17.04.2012 13:18

devote,
это всего лишь ваши фантазии. keypress должен срабатывать, когда введён какой-то символ, а не когда нажата клавиша. Поэтому нажатие стрелок не должно вызывать keypress вовсе, т.к. никакой символ при этом не вводится. Другими словами, keypress работает с символами, которые могут отличаться на одной и той же клавише в зависимости от раскладки или от shift/caps.
http://learn.javascript.ru/keyboard-events

keydown/keyup же работают с самими клавишами, независимо от раскладки.

Kolyaj 17.04.2012 13:20

Цитата:

Сообщение от Octane
mousedown → mouseup → click

Событие click по-определению срабатывает в случае, если и mousedown, mouseup случились на одном DOM элементе. Т.е. для проверки, нужно ли сгенерировать click, нужно сначала поймать mouseup, поэтому click будет всегда после.


Часовой пояс GMT +3, время: 06:42.