2010-07-13 2 views
3

Мне нужно определить, нажал ли пользователь клавишу точки на цифровой клавиатуре. Я написал это первый проект, который работает для меня:Определить десятичную (точную) клавишу с цифровой клавиатуры

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head><title></title> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type="text/javascript"><!-- 
(function($){ 
    var knownCodes = [ 
     [110, 46], // Firefox, IE, Chrome 
     [78, 46] // Opera 
    ]; 
    var pressedCodes = [null, null]; 

    $.fn.comma = function(){ 
     this.live("keydown", function(e){ 
      pressedCodes = [e.which, null]; 

     }).live("keypress", function(e){ 
      pressedCodes[1] = e.which; 

      for(var i=0, len=knownCodes.length; i<len; i++){ 
       if(pressedCodes[0]==knownCodes[i][0] && pressedCodes[1]==knownCodes[i][1]){ 
        $("#log").append("<li>Decimal key detected</li>"); 
        break; 
       } 
      } 
     }); 

     return this; 
    }; 
    $(function(){ 
     $('<ol id="log"></ol>').appendTo("body"); 
    }); 
})(jQuery); 

jQuery(function($){ 
    $(".comma input:text, .comma textarea").css("border", "1px solid black").comma(); 
}); 
//--></script> 
</head> 
<body> 

    <form action="" method="get" class="comma" size="20"> 
     <p><input type="text"></p> 
     <p><textarea rows="3" cols="30"></textarea></p> 
    </form> 

</body> 
</html> 

Однако, я могу только проверить его в окне Windows XP с испанской клавиатурой. Мои вопросы:

  1. Безопасно ли читать с e.which? Я использую его, потому что оба e.keyCode и e.charCode возвращают undefined хотя бы в одном браузере.

  2. Описывает ли операционная система эти цифровые коды каким-либо образом или это только материал браузера?

  3. Эти коды зависят от раскладки клавиатуры?


Справочная информация: Я не мог найти плагин JQuery для remap numeric keypad поэтому я пишу сам.

Обновление

Я объясню, в чем я нуждаюсь. Испанские клавиатуры, имеющие цифровую клавиатуру, имеют ключ .. Однако десятичный разделитель на испанском языке - ,. Это вызывает раздражение для ввода чисел в веб-приложениях. Некоторые настольные приложения, такие как MS Excel, переназначают этот ключ, чтобы он вставлял запятую. Я пытаюсь имитировать это.

Я адаптировал небольшой скрипт, который я использовал, чтобы опубликовать его здесь. Вот как я получил значение для knownCodes массивов:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head><title></title> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type="text/javascript"><!-- 
(function($){ 
    $.fn.showKeyCodes = function(){ 
     var log = function(e){ 
      $("<li></li>").text(e.type + "(): [keyCode, charCode, which]=[" + e.keyCode + ", " + e.charCode + ", " + e.which + "]").appendTo("#log"); 
     } 

     this.live("keydown", function(e){ 
      log(e); 

     }).live("keypress", function(e){ 
      log(e); 

     }).live("keyup", function(e){ 
      log(e); 

     }); 

     return this; 
    }; 
    $(function(){ 
     $('<ol id="log"></ol>').appendTo("body"); 
    }); 
})(jQuery); 

jQuery(function($){ 
    $(".showKeyCodes input:text, .showKeyCodes textarea").css("border", "1px solid black").showKeyCodes(); 
}); 
//--></script> 
</head> 
<body> 

    <form action="" method="get" class="showKeyCodes" size="20"> 
     <p><input type="text"></p> 
     <p><textarea rows="3" cols="30"></textarea></p> 
    </form> 

</body> 
</html> 

Тип . ключа в цифровой клавиатуре (или любой другой ключ заменяет его в раскладке клавиатуры) и ключ, который соответствует одному и тому же характеру в алфавитных клавиатурах , Цель состоит в том, чтобы обнаружить, что вы нажали первую, а не вторую.

+1

Примечания стороны: я надеюсь, что вы не требуете этого ключа, чтобы делать вещи, так как моя клавиатура не имеет цифровая клавиатура :) http://www.apple.com/keyboard/ –

+0

Я хочу, чтобы она вставляла кому, которая является допустимым десятичным разделителем на испанском языке. Если у вас нет клавиатуры, у вас нет проблемы, которую я пытаюсь исправить :) –

ответ

1

Ваш код не делает ничего на моем конце, поэтому я бы сказал, что это, вероятно, зависит от раскладки клавиатуры. Быстрая проверка подтверждает, что вывод на моей финской клавиатуре qwerty является ключевым кодом 44, а не ожидаемым 46.

+0

Хмм ... Я получаю '[keyCode, charCode, which] = [0, 44, 44]' с моим правильный кома ключ. У вашей клавиатуры Finish есть кома-ключ? –

+0

Keydown: 110,0,110 для numpad, 188, 0, 188 для нормальной запятой. В keypress: 44,44,44 для numpad и обычной запятой –

2

Безопасно ли читать с e.which?

Обычно в IE нет, вы получите только keyCode (хотя на keypress это на самом деле код символа не код ключа). Ваш код может читать which, потому что за кулисами jQuery копирует значение keyCode в which на IE. Без jQuery вам нужен код для определения свойств, чтобы узнать, какой из них выбрать. (Вы не можете всегда прочитать keyCode на keypress, потому что это не гарантируется при условии, и это 0 на Firefox.)

Пожалуйста, обратите внимание, я не хочу, чтобы обнаружить характер: я хочу, чтобы обнаружить ключ.

Вы не можете сделать это в keypress, который дает вам только код символа (46, ASCII для .).Вместо этого вам понадобится ловушка keydown, которая дает вам доступ к реальному коду ключа (в свойстве keyCode, а также в браузерах, которые не являются IE, в which).

keyCode для цифровой клавиатуры ./, кнопка 110 (ASCII для нижнего регистра N). За исключением оперы, где это 78, ASCII для верхнего регистра N и, следовательно, неотличимы от нажатия кнопки N.

Таким образом, вы можете потребовать событие keydown и сохранить флаг, когда нажата клавиша 110 или 78, затем подайте заявку keypress. Если был установлен флаг с последнего keydown, а свойство which (charCode) - 46, return false, чтобы предотвратить нажатие клавиши, а затем вместо этого вставить , в точку фокусировки. (Это не совсем надежно, если несколько нажатий клавиш нажаты одновременно, и при этом происходит автоповтор).

Обратите внимание, что вставка символа в фокус сама по себе не является тривиальной; см. многие предыдущие вопросы. Вам понадобится код ветвления для IE (document.selection.createRange().text=...) и другие современные браузеры (изменение ввода value на основе selectionStart/selectionEnd). Старые и мобильные или нишевые браузеры могут не поддерживать ни один способ редактирования, поэтому обнаруживайте отсутствие этих свойств и оставляйте клавиатуру в покое, если вы не можете этого сделать.

Влияет ли операционная система на эти числовые коды или это всего лишь материал браузера? Эти коды зависят от раскладки клавиатуры?

В общем, да, но не так, чтобы это повлияло на вас здесь. Ключевые события в целом по-прежнему чрезвычайно изменяют кросс-браузер, кросс-клавиатуру и кросс-платформу; их лучше избегать, если можно.

Лично я считаю, что правильное решение плохого выбора макета клавиатуры, например, десятичной точки десятичной запятой испанского, было бы изменить макет с помощью MSKLC.

0

Через некоторое время после того, как задать этот вопрос, я наконец-то нашел плагин JQuery, который делает именно это: numpad-decimal-separator

Смежные вопросы