Как изменить символы, набранные в Firefox

Мне нужно изменить во вводе текста символ '.' в ',' при вводе. В 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 невозможно изменить символы, набранные в ключевых событиях. Какие-либо предложения?

Зачем тебе это нужно? Для меня как пользователя было бы немного странно, если бы я набирал '.' в поле ввода будет отображаться ",". Я бы, наверное, подумал, что нажал не ту клавишу, и попробую еще раз.

Gene 20.10.2008 16:31

Concur. Я предполагаю, что браузер уходит на юг, и перезапускаю его. Когда это не помогало, я начинал избегать веб-сайта.

Chris Noe 20.10.2008 16:43

Для вышеперечисленных комментаторов (и следующих людей, которым интересно!): Моя французская версия Excel делает это для точки на цифровой клавиатуре ... Это потому, что французы (и некоторые другие национальности) используют запятую в качестве десятичного разделителя, а не точку. Полагаю, у Пьера такая же потребность.

PhiLho 20.10.2008 17:19

@PhiLho Как финн, я привык, что в качестве десятичного разделителя и кодировщика, очевидно, используются файлы. Независимо от того, какой национальный десятичный разделитель меняет, ввод пользователя при вводе кажется неправильным. Не так сложно поддержать оба или заменить их, когда значение фактически используется или, например,. onfocuslost

Gene 20.10.2008 17:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
4
5 969
5

Ответы 5

Попробуй это. Работает во всех браузерах:

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;
        }
    }
};

Обновлять:Пьер Луиджи указал на проблему выше. Он не заботится о том, чтобы позиция курсора не находилась в конце текста. Он добавит команду в конец, даже если вы вставляете текст в значение.

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

ваше решение не заботится о позиции каретки: если пользователь вводит "." не в конце текста?

Pier Luigi 20.10.2008 16:55

Технически вы просто хотите заменить все точки запятыми.

document.getElementById('mytext').onkeyup = function(){
    this.value = this.value.replace('.', ',');
}

Захватить положение каретки, заменить символы, заменить положение каретки.

eyelidlessness 21.10.2008 04:03

Предположим, что все свойства объекта Event неизменяемы. В спецификации DOM не говорится о том, что происходит, когда вы изменяете эти значения вручную.

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

Вы бы подавили событие в Firefox, вызвав event.preventDefault(); это говорит браузеру не продолжать действие по умолчанию, связанное с этим событием (в данном случае, ввод символа). Вы бы подавили событие в IE, установив event.returnValue на false.

Если это не период, вернитесь пораньше от своего куратора.

Спасибо, это работает! Я приму ваш фрагмент кода, хотя и с небольшими исправлениями, потому что в Firefox он не восстанавливает положение каретки.

Pier Luigi 21.10.2008 11:27

Неужели это нужно делать на лету? Если вы собираете информацию, которая будет отправлена ​​в форму или отправлена ​​в базу данных, не лучше ли изменить данные после того, как они были отправлены? Таким образом, пользователь никогда не увидит сбивающего с толку изменения.

Разве не сложнее изменить что-то постфактум?

eyelidlessness 21.10.2008 04:04

Если я посмотрю на официальный документ События объектной модели документа, поля событий мыши определены как доступные только для чтения. События клавиатуры там не определены, я полагаю, Mozilla следовала этой политике для них.

В общем, если нет какой-то хитрости, вы не можете изменить событие так, как хотите. Вероятно, вам придется перехватить ключ и вставить символ (необработанный или переведенный) в место каретки, как это делают редакторы JS HTML.

Другие вопросы по теме