Chrome zählt Zeichen falsch in textarea mit dem Attribut maxlength
Hier ist ein Beispiel:
JS:
$(function() {
$('#test').change(function() {
$('#length').html($('#test').val().length)
})
})
HTML:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id=test maxlength=10></textarea>
length = <span id=length>0</span>
Füllen textarea mit Linien (Zeichen auf einer Zeile), bis browser ermöglicht.
Wenn Sie fertig sind, verlassen textarea-und js-code berechnet Charaktere.
So, in meinem Fall konnte ich nur 7 Zeichen (einschließlich Leerzeichen) vor chrome hat mich gestoppt. Obwohl der Wert von maxlength-Attribut 10:
- Ähnlich: stackoverflow.com/q/12924591/266535
- ODER oder vielleicht diese: stackoverflow.com/questions/11839413/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Wagenrücklauf werden als 2 Zeichen, wenn es um maxlength.
Aber es scheint, dass javascript kann nur eine der
\r\n
(ich bin nicht sicher, welche), die nur fügt hinzu, bis zu 7.19.0.1084.1
) und ich habe immer noch dieses Problem.Hier ist, wie man den javascript-code entsprechend der Menge der Zeichen, die der browser glaubt, ist in die textarea:
http://jsfiddle.net/FjXgA/53/
Grundsätzlich nur zählen den gesamten Zeilenumbrüche in der textbox und fügen Sie 1, um die Anzahl der Zeichen für jedes.
$('#length').html(x.replace(/(\r\n|\n|\r)/g, '--').length);
Aus unbekannten Gründen jQuery immer konvertiert alle Zeilenumbrüche in den Wert einer
<textarea>
für ein einzelnes Zeichen. Das heißt, wenn der browser gibt es\r\n
für einen Zeilenvorschub, jQuery stellt sicher, dass es nur\n
im Rückgabewert von.val()
.Chrome-und Firefox-beide zählen die Dauer der
<textarea>
tags der gleichen Weise für die Zwecke der "maxlength".Jedoch die HTTP-Spezifikation besteht darauf, dass die Zeilenumbrüche dargestellt werden, wie
\r\n
. So, jQuery, webkit und Firefox, alle verstehen das falsch.Das Ergebnis ist, dass "maxlength" auf
<textarea>
- tags ist ziemlich nutzlos, wenn Sie Ihre server-side-code hat wirklich eine Feste maximale Größe für ein Feld-Wert.Bearbeiten — in diesem Moment (Ende 2014) es sieht aus wie Chrome (38) verhält sich korrekt. Firefox (33) aber noch nicht zählt jede Absatzmarke als 2 Zeichen.
.val()
gibt es falsch (1 Zeichen), aber der browser richtig sieht es als 2 Zeichen, so dass diemaxlength
berücksichtigen, 2 Zeichen für jede Zeile. Wenn das der Fall ist, und Ihre back-End-Datenbank hat eine Feste max, ich sehe nicht, wiemaxlength
ist nutzlos, weil es richtig ist, zählt die Menge der Zeichen, wie Sie in der Datenbank gespeichert.maxlength
überprüfung hat nicht berücksichtigen Sie die CR-Zeichen. Das bedeutet, dass der eingebautemaxlength
wird es der textarea enthalten ist - Zeichen in der client -, als zulässig sind. Also, wenn Sie ein Datenbank-Feld, das die 500 Zeichen lang sein, und Sie sagenmaxlength=500
eine geschrieben form kann einen Wert enthalten, der mit mehr als 500 Zeichen. Das Attribut ist daher nutzlos.maxlength
von 10, aber er ist nur in der Lage, geben Sie 7 Zeichen (inklusive 1 Zeichen für jeden newline), wenn er den Typen in der textarea. Dies zeigt deutlich, dass diemaxlength
wird, berücksichtigt die 2 Zeichen für jede neue Zeile. Meine eigenen Tests bestätigt dies...maxlength
auf<textarea>
aber es ordnungsgemäß gemeldet, die Länge des Wertes (das ist das carriage return count).maxlength
Attribut problem.Es scheint, wie die richtige Methode, basierend auf einer Spitzen Antwort oben, ist die Zählung aller neuen Linien als zwei Zeichen. Das standardisieren es ist in allen Browsern und mit, was wird gesendet, wenn es gepostet.
So konnten wir die Folgen der Spezifikation und ersetzen Sie alle vorkommen von Carriage Return, nicht gefolgt von einer Neuen Zeile, und alle Neuen Linien nicht, gefolgt von einem Wagenrücklauf, die mit einem Carriage-Return - Line-Feed-pair-Mädchen.
Dann verwenden Sie die variable zur Anzeige der Länge der textarea-Wert, oder es begrenzen, und so weiter.
Es sieht so aus, javascript ist in Anbetracht der Länge des neue-Zeile-Zeichen auch.
Versuchen Sie es mit:
Habe ich es in Ihrer fiddle und es hat funktioniert. Hoffe, das hilft.
Dass da eine neue Zeile eigentlich 2 bytes, und daher 2 lange. JavaScript nicht sehen es so und deshalb wird es zählen nur 1, so dass die Summe 7 (3 neue Linien)
Hier ist eine Universelle Lösung, die überschreibt die jQuery 'val' - Funktion. Wird dieses Problem in einem blog-post kurz und die Verlinkung hier.
Wenn Sie möchten, um die Verbleibende Länge des Inhalts von text-Bereich können Sie dann entsprechend auf den string mit den Zeilenumbrüche.
HTML:
JS:
funktioniert perfekt auf google schon im IE zu vermeiden, das Skript! Im IE die "Pause" -Zeile " nur einmal gezählt wird, so vermeiden Sie diese Lösung im IE!
Texteingabefelder sind noch nicht vollständig in sync unter den Browsern. Bemerkte ich 2 große Probleme: Wagenrücklauf und Zeichenkodierungen
Carriage return
Standardmäßig manipuliert werden als 2 Zeichen \r\n (Windows style).
Das problem ist, dass Chrome und Firefox wird, zählt es als ein Zeichen. Sie können auch wählen, es zu beobachten, es ist ein invisivle Charakter ausgewählt als ein Raum.
Einen workaround finden Sie hier:
Jquery Wort zählt, wenn die Benutzer geben Zeilenumbruch
Internet explorer auf der anderen hand hat, zählen als 2 Zeichen.
Ihre Vertretung ist :
und werden dargestellt in UTF-8 als 2 Zeichen gezählt und für maxlength als 2 Zeichen.
HTML-entities
1) Erzeugt aus dem javascript-code:
2) Analysiert, die aus dem Inhalt der textarea:
3) Eingefügt mit der Tastatur Enter-Taste
4) Definiert als die multiline Inhalt der textbox
Zeichenkodierung
Zeichencodierung ein Eingabefeld wie textarea ist Unabhängiger als die Zeichenkodierung der Seite. Dies ist wichtig, wenn Sie planen, um die Anzahl der bytes an. Also, wenn Sie einen meta-header zu definieren, der ANSI-Codierung der Seite (mit 1 byte pro Zeichen), der Inhalt deiner textbox ist immer noch UTF-8 mit 2 Byte pro Zeichen.
Einen workaround für das character encoding ist hier zu sehen:
HTML-Codierung verloren gehen, wenn das Attribut gelesen Eingabefeld