Мне нужно изменить во вводе текста символ '.' в ',' при вводе. В IE я меняю свойство события keyCode в событии нажатия клавиши, например
document.getElementById('mytext').onkeypress =
function (evt) {
var e = evt || window.event;
if (e.keyCode && e.keyCode==46)
e.keyCode = 44;
else if (e.which && e.which==46) {
e.which = 44;
}
};
но похоже, что в Firefox невозможно изменить символы, набранные в ключевых событиях. Какие-либо предложения?
Concur. Я предполагаю, что браузер уходит на юг, и перезапускаю его. Когда это не помогало, я начинал избегать веб-сайта.
Для вышеперечисленных комментаторов (и следующих людей, которым интересно!): Моя французская версия Excel делает это для точки на цифровой клавиатуре ... Это потому, что французы (и некоторые другие национальности) используют запятую в качестве десятичного разделителя, а не точку. Полагаю, у Пьера такая же потребность.
@PhiLho Как финн, я привык, что в качестве десятичного разделителя и кодировщика, очевидно, используются файлы. Независимо от того, какой национальный десятичный разделитель меняет, ввод пользователя при вводе кажется неправильным. Не так сложно поддержать оба или заменить их, когда значение фактически используется или, например,. onfocuslost



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуй это. Работает во всех браузерах:
window.onload = function () {
var input = document.getElementById("mytext");
input.onkeypress = function () {
var evt = arguments[0] || event;
var char = String.fromCharCode(evt.which || evt.keyCode);
// Is it a period?
if (char == ".") {
// Replace it with a comma
input.value += ",";
// Cancel the original event
evt.cancelBubble = true;
return false;
}
}
};
Обновлять:Пьер Луиджи указал на проблему выше. Он не заботится о том, чтобы позиция курсора не находилась в конце текста. Он добавит команду в конец, даже если вы вставляете текст в значение.
Решением было бы вместо добавления запятой имитировать событие нажатия клавиши для клавиши запятой. К сожалению, способ диспетчеризации синтетических событий в разных браузерах, кажется, очень разнообразен и непрост. Я посмотрю, смогу ли я найти для этого хороший и универсальный метод.
ваше решение не заботится о позиции каретки: если пользователь вводит "." не в конце текста?
Технически вы просто хотите заменить все точки запятыми.
document.getElementById('mytext').onkeyup = function(){
this.value = this.value.replace('.', ',');
}
Захватить положение каретки, заменить символы, заменить положение каретки.
Предположим, что все свойства объекта Event неизменяемы. В спецификации DOM не говорится о том, что происходит, когда вы изменяете эти значения вручную.
Вот логика, которая вам нужна: слушайте все ключевые события. Если это точка, подавлять событие и вручную добавьте запятую в позицию курсора. (Вот фрагмент кода для вставки произвольного текста в позицию курсора.)
Вы бы подавили событие в Firefox, вызвав event.preventDefault(); это говорит браузеру не продолжать действие по умолчанию, связанное с этим событием (в данном случае, ввод символа). Вы бы подавили событие в IE, установив event.returnValue на false.
Если это не период, вернитесь пораньше от своего куратора.
Спасибо, это работает! Я приму ваш фрагмент кода, хотя и с небольшими исправлениями, потому что в Firefox он не восстанавливает положение каретки.
Неужели это нужно делать на лету? Если вы собираете информацию, которая будет отправлена в форму или отправлена в базу данных, не лучше ли изменить данные после того, как они были отправлены? Таким образом, пользователь никогда не увидит сбивающего с толку изменения.
Разве не сложнее изменить что-то постфактум?
Если я посмотрю на официальный документ События объектной модели документа, поля событий мыши определены как доступные только для чтения. События клавиатуры там не определены, я полагаю, Mozilla следовала этой политике для них.
В общем, если нет какой-то хитрости, вы не можете изменить событие так, как хотите. Вероятно, вам придется перехватить ключ и вставить символ (необработанный или переведенный) в место каретки, как это делают редакторы JS HTML.
Зачем тебе это нужно? Для меня как пользователя было бы немного странно, если бы я набирал '.' в поле ввода будет отображаться ",". Я бы, наверное, подумал, что нажал не ту клавишу, и попробую еще раз.