Opera, событие не возникает вновь при вдавленной кнопке.
код
jQuery(document).ready(function(){
jQuery(document).keydown(function(ev){
if ((ev.keyCode > 36) && (ev.keyCode < 41)) {
nazata(ev.keyCode); //действия
}
});
});
Когда стрелку вдавливаешь, то событие должно повторяться. Так и работает во всех моих браузерах кроме оперы. Что делать? |
Цитата:
|
хм перетащил проверку стрелок на keypress , в опере стало окей.
Но в хроме стрелки не работают на keypress(это у меня записано, поэтому я их на keydown и проверял) |
С клавишами в браузерах всё плохо, по ним можно диссертацию писать. Причём с разными клавишами по разному плохо. Если говорить про стрелки, то при их залипании
* В IE и в Chrome повторяется keydown * В Опере повторяется keypress * В Firefox-е повторяются и keydown, и keypress. Вот и делай что хочешь. Получается надо оба ловить, но при этом в Firefrox-е одно из них игнорировать. По логике, правильное поведение здесь у IE и у Chrome. Firefox решил перестраховаться, но в целом тоже покатит. А Опера в своём репертуаре мудацкого браузера. |
Цитата:
|
не просто так события называются так как называются:
keydown - нажали клавишу, то-есть опустили, срабатывает событие что именно нажали клавишу keypress - от английского слова pressed (зажата) то-есть клавиша зажата, соответственно все повторы идут на это событие до тех пор пока клавиша не будет отжата. keyup - подняли клавишу, то-есть отпустили. Вся эта логика работает во всех языках в которых я программировал, а их более десяти как минимум. Поэтому Опера все же работает правильнее всех. |
А вот кстати еще удивляет по какой такой логике сделали разный порядок срабатывания:
mousedown → mouseup → clickи keydown → keypress → keyup---------- Помня что click последним возникает, сначала хотел написать, что логичнее было бы повторять keydown, а Opera как всегда, но потом посмотрел, как ведут себя браузеры… |
Цитата:
|
devote,
это всего лишь ваши фантазии. keypress должен срабатывать, когда введён какой-то символ, а не когда нажата клавиша. Поэтому нажатие стрелок не должно вызывать keypress вовсе, т.к. никакой символ при этом не вводится. Другими словами, keypress работает с символами, которые могут отличаться на одной и той же клавише в зависимости от раскладки или от shift/caps. http://learn.javascript.ru/keyboard-events keydown/keyup же работают с самими клавишами, независимо от раскладки. |
Цитата:
|
Цитата:
|
Можно, конечно, встать в позу, и кричать, что всю жизнь на Си пишу, и там вот так. А можно пойти и почитать, как оно не в Си, а в JavaScript.
Ещё раз цитата из ссылки выше Цитата:
|
мне эта цитата ни о чем не говорит, ибо я больше доверяю спецификациям.. Хотя и в них не всегда все найдешь. А то что в JS принято так как вы говорите, то это принято кем? Простыми JS программистами? А где оф. документ об этом говорящий? Нету? Ну еще бы, проще же для себя сделать выводы самому. А может вовсе вывод сделан от принятых решений в браузере допотопных времен. Я лишь знаю одно, что мои привычным требованиям в программировании, опера меня вполне устраивает, потому что я получаю то что ожидаю. А не то что где-то кто-то решил что в JS оно будет так. Флаг им в руки.
|
Хотя да вы правы, в JS оно так, и спецификацию нашел: http://dev.w3.org/2006/webapi/DOM-Le...-type-keypress но странно конечно что они решили сделать в JS именно так.
|
НО! Есть приписка в той же спецификации:
Цитата:
Так что я уверен что в будущем полюбившееся вам поведение измениться у события keypress |
спс за ответы, пока я подумал не усложнять мой код чисто из-за оперы, т.к. для своего сайта скрипт.
|
переделал все таки еще и под оперу, глянул что в рунете это оч. популярный браузер. Даже не знаю почему.
Может кому пригодится, кроссбраузерная обработка стрелок и пробела:
var agt = navigator.userAgent.toLowerCase();
var is_opera = ((agt.indexOf("opera") != -1)||(window.opera));
jQuery(document).ready(function(){
jQuery(document).keypress(function(ev){
if (ev.which == 32) {
nazata(32);
return false;
}
if (is_opera) {
if ((ev.keyCode > 36) && (ev.keyCode < 41)) {
nazata(ev.keyCode);
return false;
}
}
});
jQuery(document).keydown(function(ev){
if (is_opera) return false;
if ((ev.keyCode > 36) && (ev.keyCode < 41)) {
nazata(ev.keyCode);
return false;
}
});
});
|
Цитата:
раз уж пошла такая пьянка вот мой вариант:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
var keypressed = false, count = 0;
function _log( str ) {
document.body.innerHTML = "(" + count++ + ") " + str + ( keypressed ? ", вы продолжаете ee держать!" : "" );
}
$(document).bind( "keydown keypress", function( e ) {
var keystring = {
"37": "стрелка влево",
"38": "стрелка вверх",
"39": "стрелка вправо",
"40": "стрелка вниз"
}
var timeStamp = (new Date().getTime());
if ( !document.timeStamp || ( ( document.timeStamp + 10 ) < timeStamp ) ) {
if ( e.which === 32 ) {
_log( "Нажат пробел" );
} else if ( e.keyCode > 36 && e.keyCode < 41 ) {
_log( "Нажата функциональная клавиша: " + ( keystring[ e.keyCode ] || "код клавиши " + e.keyCode ) );
} else {
_log( "Нажата клавиша: " + ( keystring[ e.keyCode ] || "код клавиши " + e.keyCode ) );
}
document.timeStamp = timeStamp;
}
keypressed = true;
return false;
}).keyup(function(){
count = 0;
keypressed = false;
_log( "Отпустили клавиши" );
});
</script>
</head>
<body>
</body>
</html>
|
| Часовой пояс GMT +3, время: 16:18. |