Несколько определений из jls объясняют это (глава 14):
Как указано здесь , Block
является StatementWithoutTrailingSubstatement
, который, в свою очередь, является StatementNoShortIf
, который является Statement
. Таким образом, когда требуется какое-либо из них, мы можем вставить Block
.
. Хотя это также относится к for
и while
-loops, я буду использовать if
-значения. Эти правила почти одинаковы. Синтаксическое описание if-statements
можно найти здесь здесь .
IfThenStatement:
if ( Expression ) Statement
IfThenElseStatement:
if ( Expression ) StatementNoShortIf else Statement
IfThenElseStatementNoShortIf:
if ( Expression ) StatementNoShortIf else StatementNoShortIf
Итак, мы можем использовать наш блок здесь.
;
определяется как EmptyStatement
( link ), что также является StatementNoShortIf
. Поэтому в условных фрагментах кода, таких как if-statement
и циклы, мы можем заменить Block
на EmptyStatement
, если требуется StatementNoShortIf
или Statement
.
Таким образом, if(Expression)EmptyStatement
works.
Довольно просто: java дает ошибку, если находит недопустимый синтаксис. Но В вашей среде IDE должна быть опция для включения такого предупреждения. Для eclipse см. Ответ if(Expression)EmptyStatement
- вполне допустимый синтаксис. Вместо этого javac
выдает предупреждение при запуске с соответствующими параметрами. Полный список предупреждений, которые могут быть отключены для , для этой цели содержит имя-предупреждение empty
. Таким образом, компиляция с -Xlint:all
или -Xlint:empty
будет генерировать предупреждение об этом. Ctrl + Shift + A
, ввести empty body
в поле поиска и включить предупреждение (помечено на изображении)
Честно говоря, в нем мало пользы с минималистской точки зрения. Обычно есть способ добиться успеха без команды «ничего не делать». Скорее, речь идет о личных предпочтениях, предпочитаете ли вы использовать
if( a() && b() );
или
if( a() ) b();
, и это применимо и к другим случаям, в которых используется EmptyStatement
. Важным моментом для рассмотрения этой темы является читаемость кода. Бывают случаи, когда код становится более читаемым, используя no-op. С другой стороны, есть случаи, когда код становится намного сложнее понять с помощью EmptyStatement
- приведенный выше пример будет рассчитывать на более позднюю IMO.
Keydown даст вам keyCode нажатой клавиши без каких-либо изменений.
$("#keypresser").keydown(function(e){
var keycode = e.keyCode;
var valid =
(keycode > 47 && keycode < 58) || // number keys
keycode == 32 || keycode == 13 || // spacebar & return key(s) (if you want to allow carriage returns)
(keycode > 64 && keycode < 91) || // letter keys
(keycode > 95 && keycode < 112) || // numpad keys
(keycode > 185 && keycode < 193) || // ;=,-./` (in order)
(keycode > 218 && keycode < 223); // [\]' (in order)
return valid;
});
Только цифровые клавиши, буквенные клавиши и пробел будут иметь коды клавиш, соответствующие String.fromCharCode
, так как он использует значения Unicode.
Keypress - это представление введенного текста charCode. Обратите внимание, что это событие не будет срабатывать, если текст не будет «распечатан» в результате нажатия клавиши.
$("#keypresser").keypress(function(e){
var charcode = e.charCode;
var char = String.fromCharCode(charcode);
console.log(char);
});
http://jsfiddle.net/LZs2D/1/ продемонстрирует, как это работает.
KeyUp ведет себя аналогично KeyDown.
В этой статье есть список keyCodes
в Javascript
:
http://www.cambiaresearch.com/articles/15/javascript-char-codes-key- коды
Только для фона событие «keypress» даст вам свойство charCode всякий раз, когда вы нажимаете клавишу символа.
Editor.addEventListener('keypress', function(event){
if (event.charCode) {
//// character key
console.log( String.fromCharCode(event.charCode) ); /// convert charCode to intended character.
} else {
//// control key
}
Однако событие «keypress» не захватывает каждое нажатие клавиши - несколько клавиш загораются перед событием «keypress».
Напротив, событие «keydown» будет захватить каждое нажатие клавиши, но у него нет свойства charCode . Итак, как мы можем определить, является ли это символьным ключом? Проверка каждого нажатия клавиши, если значение keyCode находится в нижней и верхней границах для нескольких диапазонов, не является оптимально эффективной. Я подозреваю, что есть также проблемы для символов вне диапазона ASCII.
Мой подход - это проверка длины события «ключ». Свойство «ключ» является альтернативой «keyCode» для определения того, какой ключ был нажат. Для ключей управления свойство «ключ» является описательным (например, «rightArrow», «F12», «return» и т. Д.). Для символьных клавиш свойство «ключ» для символьного ключа - это только символ (например, «a», «A», «~», «\» и т. Д.). Следовательно, для каждого символьного ключа длина свойства «ключ» будет иметь длину 1; тогда как управляющие символы будут иметь длину больше 1.
Editor.addEventListener('keydown', function(event){
if (event.key.length == 1){
//// character key
} else {
//// control key
}
})
9
– Shmiddty 17 September 2012 в 23:10,
или%
– Alexander Elgin 19 February 2016 в 12:47e.ctrlKey === e.altKey
, потому что если точно один из них нажат, то это горячая клавиша – Somnium 26 October 2016 в 15:48