2015-09-08 9 views
5

Ich verwende derzeit eine HTML-Tabelle innerhalb meiner Webseite, um dem Benutzer die Eingabe bestimmter Details zu ermöglichen. Da die Zeicheneingabe jedoch nicht begrenzt ist, kann die Tabelle stark gestreckt werden, wenn der Benutzer so viele Zeichen eingibt, wie er möchte.Wie Zeicheneingabe in contenteditable innerhalb einer HTML-Tabelle zu begrenzen

Ich habe mich gefragt, wie man diese Zufriedenheit begrenzen kann, um dies zu verhindern?

Unten ist ein Ausschnitt aus dem Code, den ich für den Tisch

<tr> 
<td>One Off Capital</td> 
<td><div contenteditable> </div></td> 
<td><div contenteditable> </div></td> 
</tr> 

ich jedoch zu einem ähnlichen Problem unter diesem Link verwenden sind neu in jQuery und einem Amateur-Entwickler gefunden habe, ich kämpfen würde zu verstehen die gegebenen Antworten und wie ich sie benutzen kann.

Limiting Number of Characters in a ContentEditable div

+0

Warum wollen Sie die Eingabe begrenzen wollen? Haben Sie eine begrenzte Speicherkapazität oder ist es rein visuell? Es ist in Ordnung, wenn die Eingabe in die nächste Zeile springt? Haben Sie darüber nachgedacht, 'input' oder' textara' zu verwenden? – Halcyon

+0

Nur sichtbar, innerhalb der Seite erstreckt sich die Tabelle zu weit, verhindert die nächsten Spalten zu sehen, wenn eine Zelle zu viele Zeichen hat – 1D9C

+0

Ja, es wäre in Ordnung, in die nächste Zeile zu verschieben. Ich habe contenteditable verwendet, da der Benutzer in der Tabelle eingeben muss, ein Textbereich wäre nicht geeignet – 1D9C

Antwort

3

Sie können etwas tricky mit keypress() Ereignishandler tun. Verhindern keypress Ereignis, wenn der Inhalt größer ist als Ihr Limit ist durch false

UPDATE Rückkehr: hinzufügen Zuhörer paste Ereignis. Überprüfen Sie dann die Inhaltslänge. Verhindere auch die Option "Ziehen", um das Ziehen von Inhalten zu verhindern.

var limit = 10; 
 
$('div[contenteditable]').keypress(function() { 
 
    return this.innerHTML.length < limit; 
 
}).on({ 
 
    'paste': function(e) { 
 
    var len = this.innerHTML.length, 
 
     cp = e.originalEvent.clipboardData.getData('text'); 
 
    if (len < limit) 
 
     this.innerHTML += cp.substring(0, limit - len); 
 
    return false; 
 
    }, 
 
    'drop': function(e) { 
 
    e.preventDefault(); 
 
    e.stopPropagation(); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<tr> 
 
    <td>One Off Capital</td> 
 
    <td> 
 
    <div contenteditable></div> 
 
    </td> 
 
    <td> 
 
    <div contenteditable></div> 
 
    </td> 
 
</tr>

+0

Dies ist keine vollständige Lösung. Ich kann 'ctrl + v' (oder Rechtsklick + Einfügen) verwenden, um mehr als 10 Zeichen hinzuzufügen. – Halcyon

+0

@Halcyon: aktualisierte Antwort –

+0

Ich kann auch mehr Zeichen hinzufügen, wenn ich Text aus einem anderen Dokument ziehe. – Halcyon

0

hinzufügen eine Überlaufpolitik, so etwas wie:

<div style="width: 300px; overflow: auto;" contenteditable="contenteditable"></div> 

Wenn Sie wissen, wie CSS-Klassen, die Verwendung zu verwenden.

0

Ich habe die jQuery Bind Funktion verwendet, die eine Funktion 'editableContentChanged' aufruft, wenn ein div eines der folgenden Ereignisse auftritt 'blur keyup paste kopieren cut mouseup'. Sie können die Dokumentation betrachten und der Bindefunktion bei Bedarf Ereignisse hinzufügen. Die Funktion editableContentChanged ersetzt zuerst den Inhalt des editierbaren div und ruft dann die Methode setCaret auf, die den Cursor an das Ende des Inhalts setzt. Heres ein funktionierendes Beispiel https://jsfiddle.net/vacfkono/4/
HTML

<tr> 
<td>One Off Capital</td> 
<td><div contenteditable>fadsfasd </div></td> 
<td><div contenteditable> fasdfasd </div></td> 
</tr> 

Javascript/jQuery

$(document).ready(function() { 
     $('div').bind('blur keyup paste copy cut mouseup', editableContentChanged); 
    }); 

var maxLength = 20; 
function editableContentChanged() { 
    if($(this).html().length >= maxLength) { 
     $(this).html($(this).html().substring(0, maxLength-1)); 
     setCaret(this); 
    } 
} 

function setCaret(el) { 
    var range = document.createRange(); 
    var sel = window.getSelection(); 
    range.setStart(el.childNodes[0], 19); 
    range.collapse(true); 
    sel.removeAllRanges(); 
    sel.addRange(range); 
    el.focus(); 
} 
Verwandte Themen