По моему опыту String.fromCharCode(e.keyCode)
ненадежна. String.fromCharCode
ожидает кодировки unicode в качестве аргумента; e.keyCode
возвращает коды кода javascript. Коды javascript и кодовые обозначения юникода - это , а не то же самое! В частности, клавиши номерной панели возвращают разные keycode
из обычных цифровых клавиш (поскольку они являются разными клавишами), в то время как тот же keycode
возвращается как для букв upper
, так и lowercase
(вы нажали ту же клавишу в обоих случаев), несмотря на то, что они имеют разные charcodes
.
Например, обычная цифровая клавиша 1 генерирует событие с keycode
49, в то время как клавиша 1 цифровой клавиатуры (с включенным Numlock) генерирует keycode
97. Используется с String.fromCharCode
, мы получаем следующее:
String.fromCharCode(49) returns "1"
String.fromCharCode(97) returns "a"
String.fromCharCode
ожидает кодировки Unicode, а не коды javascript. Ключ a генерирует событие с keycode
из 65, независимым от случая символа, который он сгенерировал (есть также модификатор, если нажата клавиша Shift и т. Д.). Символ a имеет юникод charcode
61, тогда как символ A имеет charcode
из 41 (согласно, например, http://www.utf8-chartable.de/ ). Тем не менее, это hex
значения, преобразование в десятичную дает нам charcode
из 65 для «A» и 97 для «a». [1] Это согласуется с тем, что мы получаем из String.fromCharCode
для этих значений.
Мое собственное требование было ограничено обработкой чисел и обычными буквами (принятие или отклонение в зависимости от позиции в строке) и разрешение управляющих символов ( F-ключи, Ctrl-что-то). Таким образом, я могу проверить управляющие символы, если это не контрольный символ, который я проверяю на диапазон, и только тогда мне нужно получить фактический символ. Учитывая, что меня не беспокоит случай (я все равно меняю буквы на прописные буквы) и уже ограничил диапазон кодов клавиш, мне нужно только беспокоиться о клавишах с цифровой клавиатурой. Для этого достаточно:
String.fromCharCode((96 <= key && key <= 105)? key-48 : key)
В общем случае функция надежного возврата символа из charcode
была бы большой (возможно, как плагин jQuery), но у меня нет времени напишите это сейчас. Извините.
Я также упомянул e.which
(если вы используете jQuery), который нормализует e.keyCode
и e.charCode
, так что вам не нужно беспокоиться о том, какой ключ был нажат. Проблема с объединением его с String.fromCharCode
остается.
[1] Некоторое время я был смущен. все документы говорят, что String.fromCharCode
ожидает unicode charcode
, в то время как на практике он, похоже, работает для ASCII-кодировок, но я думаю, из-за необходимости конвертировать в десятичный код из шестнадцатеричного кода в сочетании с тем, что ASCII-символы и unicode decimal charcodes перекрываются для обычных латинских букв.
Встроенная основанная на RTTI система для сериализации опубликованных свойств уязвима для изменений в компонентах. Продвижения управляемы, пока старые свойства сохранены в новых объектах. Т.е. Вы оставляете интерфейс свойства, как, но может отказаться от содержания, если Вам нравится. Движение назад хуже - поскольку сохраненное свойство более новой версии не может быть открыто в более старой загрузке версии, и это будет проблемой.
Существуют компоненты / освобождает (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes), который может добавить сериализацию в формате XML, и это может помочь немного, поскольку можно принять решение пропустить содержание, которое Вы не знаете.
Все еще необходимо быть внимательными о том, как Вы разрабатываете свое опубликованное содержание и должны, вероятно, найти способ "проигнорировать, но распространить" содержание, которое не понимает Ваша текущая версия. Это позволит Вам открывать и изменять файл в более новом формате при попытке сохранить более новые атрибуты, вместо того, чтобы разделить их.
Форматы определенно изменятся, поскольку поставщики добавят опции к своим компонентам. Сериализация просто циклы по всем опубликованным свойствам и сохраняет их к потоку. Когда они будут считаны назад, каждое из свойств, которое читается из потока, будет задержано к компоненту. Если свойство больше не существует, у Вас есть проблема. Я не думаю, что можно сделать что-либо об этом помимо некоторой основной обработки исключений.
Лучший способ гарантировать совместимость состоит в том, чтобы сделать Вашу собственную сериализацию.
Спасибо за ответ. Я старался избегать пользовательской сериализации, и используйте в своих интересах каждый метод сериализации компонента, но с личными делами персонала отсутствия любой способ "исправить" обновление нового формата компонента я предполагаю, что пользовательская сериализация является единственным методом.