2008-10-20 5 views
6

Мне нужно изменить в текстовом вводе символ '.' на ',' при наборе текста. В IE изменить свойство KEYCODE событий в случае нажатия клавиши, как этотКак изменить символы, введенные в Firefox

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

но seemes, что в Firefox это невозможно изменить символы, набранные в ключевых событиях. Любые предложения?

+1

Зачем вам это нужно? Для меня, как пользователя, было бы странно, что даже если я наберу «.» он отобразил бы «,» в поле ввода. Вероятно, я думаю, что я набрал неправильный ключ и повторю попытку. – Gene 2008-10-20 12:31:26

+0

Concur. Я бы предположил, что браузер идет на юг и перезагружает его. Когда это не сработает, я начну избегать веб-сайта. – 2008-10-20 12:43:39

+0

К вышеупомянутым комментаторам (и следующим людям интересно!): Моя французская версия Excel делает это для цифровой клавиатуры ...Это потому, что французские люди (и некоторые другие национальности) используют запятую как десятичный разделитель, а не точку. Я полагаю, что Пир имеет аналогичную потребность. – PhiLho 2008-10-20 13:19:23

ответ

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

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

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

+1

ваше решение не заботится о позиции каретки: если пользовательский тип «.» а не в конце текста? – 2008-10-20 12:55:55

1

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

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

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

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

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

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

0

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

1

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

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