2008-10-20 9 views
6

Ich muss in einer Texteingabe das Zeichen 'ändern.' zu ',' während der Eingabe. In IE ändere ich die keyCode Ereigniseigenschaft in dem KeyPress-Ereignisse, wie dieseSo ändern Sie Zeichen in Firefox eingegeben

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

aber es seemes dass es unmöglich ist in der folgenden Zeichen in Schlüsselereignissen eingegeben zu ändern. Irgendwelche Vorschläge?

+1

Warum möchten Sie das? Für mich als Benutzer würde es ein bisschen merkwürdig erscheinen, selbst wenn ich '.' Es würde "," im Eingabefeld anzeigen. Ich würde wahrscheinlich denken, dass ich den falschen Schlüssel getroffen habe und es erneut versuchen. – Gene

+0

Übereinstimmen. Ich würde annehmen, dass der Browser nach Süden geht, und es neu starten. Wenn das nicht funktionierte, würde ich anfangen, die Website zu meiden. –

+0

Zu den oben genannten Kommentatoren (und die nächsten Leute wundern sich!): Meine Französisch-Version von Excel tut das für den Ziffernblock Punkt ...Das liegt daran, dass Franzosen (und einige andere Nationalitäten) Komma als Dezimaltrennzeichen und nicht als Punkt verwenden. Ich nehme an, Pier hat ein ähnliches Bedürfnis. – PhiLho

Antwort

5

Versuchen Sie es. Es funktioniert auf allen Browsern:

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

Update:Pier Luigi ein Problem mit dem oben aufgezeigt. Es kümmert sich nicht darum, dass die Caret-Position nicht am Ende des Textes steht. Es fügt den Befehl an das Ende an, selbst wenn Sie Text in den Wert einfügen.

Die Lösung wäre, anstatt ein Komma anzuhängen, ein Tastendruckereignis für den Komma-Schlüssel zu simulieren. Leider scheint die Art und Weise, in der synthetische Ereignisse in verschiedenen Browsern laufen, sehr abwechslungsreich zu sein und keine leichte Aufgabe zu sein. Ich werde sehen, ob ich eine nette und generische Methode dafür finden kann.

+1

Ihre Lösung kümmert sich nicht um Caret-Position: wenn Benutzer "." nicht am Ende des Textes? –

+1

@Pier Luigi: Danke, dass du das erhöht hast. Ich werde meine Antwort aktualisieren. –

1

Technisch möchten Sie nur alle Punkte durch Kommas ersetzen.

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

ja es funktioniert, aber es ändert Caret-Position !! –

+0

Caret-Position erfassen, Zeichen ersetzen, Caret-Position ersetzen. – eyelidlessness

2

Angenommen, dass alle Objekte in einem Event-Objekt unveränderlich sind. Die DOM-Spezifikation behandelt nicht, was passiert, wenn Sie diese Werte manuell ändern.

Hier ist die Logik, die Sie brauchen: Achten Sie auf alle wichtigen Ereignisse. Wenn es sich um einen Punkt handelt, unterdrücken Sie das Ereignis, und fügen Sie das Komma an der Cursorposition manuell hinzu. (Hier ist a code snippet zum Einfügen beliebiger Text an der Cursorposition.)

Sie würden das Ereignis in Firefox unterdrücken, indem Sie event.preventDefault() aufrufen; Dies weist den Browser an, die mit diesem Ereignis verknüpfte Standardaktion nicht fortzusetzen (in diesem Fall das Zeichen einzugeben). Sie würden das Ereignis in IE unterdrücken, indem Sie event.returnValue auf false setzen.

Wenn es sich nicht um einen Zeitraum handelt, kehren Sie früh von Ihrem Handler zurück.

+0

danke, es funktioniert! Ich werde Ihr Code-Snippet übernehmen, allerdings mit ein wenig Korrektur, weil es in Firefox die Caret-Position nicht wiederherstellt. –

0

Muss das wirklich im laufenden Betrieb gemacht werden? Wenn Sie die Informationen sammeln, die an ein Formular gesendet oder an eine Datenbank gesendet werden sollen, wäre es dann nicht besser, die Daten nach ihrer Übermittlung zu ändern? Auf diese Weise sieht der Benutzer die verwirrende Änderung nie.

+0

Ist es nicht verwirrender, etwas nachträglich zu ändern? – eyelidlessness

1

Wenn ich das offizielle Dokument Document Object Model Events betrachte, werden Mausereignisse als schreibgeschützt definiert. Tastaturereignisse sind dort nicht definiert, ich nehme an, dass Mozilla diese Richtlinie für sie befolgt hat.

Also, es sei denn, es gibt einen cleveren Trick, Sie können ein Ereignis nicht so ändern, wie Sie es möchten. Sie müssen wahrscheinlich den Schlüssel abfangen und das Zeichen (roh oder übersetzt) ​​dort einfügen, wo das Caret ist, wie JS HTML-Editoren tun.