Как изменить символы, набранные в Firefox - PullRequest
6 голосов
/ 20 октября 2008

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

Ответы [ 5 ]

5 голосов
/ 20 октября 2008

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

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

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

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

2 голосов
/ 20 октября 2008

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

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

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

Если это не точка, рано вернитесь к своему обработчику.

1 голос
/ 20 октября 2008

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

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

1 голос
/ 20 октября 2008

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

document.getElementById('mytext').onkeyup = function(){
    this.value = this.value.replace('.', ',');
}
0 голосов
/ 20 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...