Begrenzung der Zeichenanzahl in einem ContentEditable div

Lesezeit: 5 Minuten

Benutzer-Avatar
Bill Dami

Ich verwende contenteditable div Elemente in meiner Webanwendung und ich versuche, eine Lösung zu finden, um die Anzahl der in dem Bereich zulässigen Zeichen zu begrenzen, und sobald die Grenze erreicht ist, führt der Versuch, Zeichen einzugeben, einfach zu nichts.

Das habe ich bisher:

var content_id = 'editable_div';

// Binding keyup/down events on the contenteditable div
$('#' + content_id).keyup(function(){ check_charcount(content_id, max); });
$('#' + content_id).keydown(function(){ check_charcount(content_id, max); });

function check_charcount(content_id, max)
{
    if($('#' + content_id).text().length > max)
    {
        $('#' + content_id).text($('#' + content_id).text().substring(0, max));
    }
}

Das tut Beschränken Sie die Anzahl der Zeichen auf die durch ‘max’ angegebene Anzahl, sobald jedoch der Text des Bereichs durch die Funktion jQuery .text() festgelegt wurde, setzt sich der Cursor selbst an den Anfang des Bereichs zurück.

Wenn der Benutzer also weiterschreibt, werden die neu eingegebenen Zeichen am Anfang des Textes eingefügt und das letzte Zeichen des Textes entfernt. Also wirklich, ich brauche nur eine Möglichkeit, den Cursor am Ende des Textes des bearbeitbaren Bereichs zu halten.

Benutzer-Avatar
Benutzer113716

Übergeben Sie die event Einspruch gegen Ihre Funktion und Aufruf e.preventDefault() wenn das Maximum erreicht ist:

var content_id = 'editable_div';

max = 10;

//binding keyup/down events on the contenteditable div
$('#'+content_id).keyup(function(e){ check_charcount(content_id, max, e); });
$('#'+content_id).keydown(function(e){ check_charcount(content_id, max, e); });

function check_charcount(content_id, max, e)
{
    if(e.which != 8 && $('#'+content_id).text().length > max)
    {
       // $('#'+content_id).text($('#'+content_id).text().substring(0, max));
       e.preventDefault();
    }
}

Möglicherweise müssen Sie jedoch etwas mehr tun, damit der Benutzer Dinge wie “Löschen” ausführen kann.

Außerdem könntest du die wahrscheinlich loswerden keyup Handler. keydown sollte genug sein.

  • Klappt wunderbar! 🙂 Ich habe auch Bedingungen für Pfeiltasten und Rücktaste/Löschen hinzugefügt, ansonsten funktioniert es perfekt.

    – Bill Dami

    19. Mai 2010 um 16:52 Uhr

  • Ein Einfügen über das Kontextmenü oder das Bearbeitungsmenü könnte den Benutzer immer noch über das Limit bringen.

    – Tim unten

    19. Mai 2010 um 16:52 Uhr

  • @Tim Down – Sehr wahr. Unvermeidlich (meines Wissens nach), wenn ein contentEditable div verwendet wird, da es keine gibt change Veranstaltung. Meine Lösung war spezifisch für die Frage. Ihre decken sehr treffend die allgemeine Kehrseite des vorgestellten Ansatzes ab.

    – Benutzer113716

    19. Mai 2010 um 17:05 Uhr

  • Hören auf die input Veranstaltung ermöglicht es Ihnen, Änderungen über die Tastatur abzufangen, einzufügen und zu ziehen.

    – josh3736

    29. Oktober 2015 um 22:40 Uhr

  • Diese Tasten sollten ebenfalls erlaubt sein: var allowKeys = { 8: true, // BACKSPACE 35: true, // END 36: true, // HOME 37: true, // LEFT 38: true, // UP 39: true , // RIGHT 40: true, // DOWN 46: true // DEL }

    – Formixian

    7. April 2016 um 13:51 Uhr


Benutzer-Avatar
Tschallacka

Dies ist die Art und Weise, wie ich es durch jQuery-Bindung gemacht habe, was es mir leicht macht, indem ich einfach eine Eigenschaft data-input-length zu einem inhaltsbearbeitbaren Element hinzufüge.

Fügen Sie einfach den JavaScript-Code irgendwo in Ihrem Dokument hinzu.

$(document).ready(function(){
    // Excempt keys(arrows, del, backspace, home, end);
    var excempt = [37,38,39,40,46,8,36,35];
    // Loop through every editiable thing
    $("[contenteditable="true"]").each(function(index, elem) {
        var $elem = $(elem);
        // Check for a property called data-input-length="value" (<div contenteditiable="true" data-input-length="100">)
        var length = $elem.data('input-length');
        // Validation of value
        if(!isNaN(length)) {
            // Register keydown handler
            $elem.on('keydown', function(evt) {
                // If the key isn't excempt AND the text is longer than length stop the action.
                if(excempt.indexOf(evt.which) === -1 && $elem.text().length > length) {
                   evt.preventDefault();
                   return false;
                }
            });
        }
    });
});
div {
  background-color: #eee;
  border: 1px solid black;
  margin: 5px;
  width: 300px;
  height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div contenteditable="true" data-input-length="100">
    You can type a 100 characters here
</div>
<div contenteditable="true" data-input-length="150">
    You can type a 150 characters here
</div>
<div contenteditable="true" data-input-length="10">
    You can type a 10 characters here
</div>

Benutzer-Avatar
Peter Mortensen

Erstens ist so etwas für den Benutzer irritierend: Ich würde vorschlagen, stattdessen etwas Ähnliches wie das Kommentarfeld von Stack Overflow zu tun, das Ihnen erlaubt, so viel oder so wenig einzugeben, wie Sie möchten, und Ihnen eine Meldung anzeigt, die Ihnen sagt, wie viele Zeichen Sie haben eingegeben und ob es zu viele oder zu wenige sind, und verweigert Ihnen die Abgabe eines Kommentars, dessen Länge ungültig ist.

Zweitens, wenn Sie wirklich die Länge des Textes begrenzen müssen, ersetzen Sie den gesamten Inhalt des <div> bei jedem Tastendruck, wenn der Inhalt zu lang ist, ist unnötig teuer und führt dazu, dass der Editor auf langsameren Computern nicht mehr reagiert. Ich schlage vor, mit dem umzugehen keypress Ereignis und einfach das Einfügen des Zeichens mit verhindern preventDefault() auf der Veranstaltung (bzw Internet ExplorerFestlegen des Ereignisses returnValue zu truevorausgesetzt, Sie verwenden attachEvent).

Dies wird den Benutzer nicht daran hindern, Text einzufügen, also müssen Sie sich darum kümmern paste Ereignis (das nicht existiert in Oper oder Firefox < 3, also brauchen Sie dafür eine abfragebasierte Lösung). Da Sie nicht im Voraus auf den einzufügenden Inhalt zugreifen können, haben Sie keine Möglichkeit zu wissen, ob Sie durch das Einfügen die Zeichenbeschränkung überschreiten. Daher müssen Sie einen Timer einstellen, um die Länge in Kürze erneut zu überprüfen nach der Paste. In Anbetracht dessen scheint mir die erste Option vorzuziehen.

Benutzer-Avatar
Peter Mortensen

Dies ist der beste Weg, dies in der allgemeinsten Form zu tun, und es funktioniert einfach großartig für mich!

<div contenteditable="true" name="choice1" class="textfield" max="255"></div>
    $('.textfield').on("keypress paste", function (e) {
        if (this.innerHTML.length >= this.getAttribute("max")) {
            e.preventDefault();
            return false;
        }
    });

  • Wenn das contenteditable div dynamisch generiert wird, müssen Sie $(document).on(“keypress paste”,”.textfield”,function(e){});

    – Patrick Mutuku

    26. August 2018 um 22:49 Uhr

  • Hat Fallstricke. Es überprüft nur die Länge von innerHTML, wenn die Paste selbst zu groß ist, werden Sie das Limit überschreiten.

    – Hannes Schneidermayer

    6. Mai 2020 um 3:11 Uhr

1010210cookie-checkBegrenzung der Zeichenanzahl in einem ContentEditable div

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy