Limite / Conte personaggi in CKEditor con / Jquery
-
19-09-2019 - |
Domanda
Sto usando CKEditor per il mio editor WYSIWYG e ho bisogno di monitorare e limitare il numero di caratteri in quanto sta digitando Ho uno script jQuery che funziona bene per un TextArea normale
<script type ="text/javascript" language="javascript">
function limitChars(textid, limit, infodiv) {
var text = $('.' + textid).val();
var textlength = text.length;
if (textlength > limit) {
$('#' + infodiv).html('You cannot write more then ' + limit + ' characters!');
$('#' + textid).val(text.substr(0, limit));
return false;
}
else {
$('#' + infodiv).html('You have ' + (limit - textlength) + ' characters left.');
return true;
}
}
$(function() {
$('.comment-1').keyup(function() {
limitChars('comment-1', 1000, 'charlimitinfo-1');
})
});
</script>
Tuttavia questo non sembra funzionare per quando il textArea viene sostituito con il CKEditor tutte le idee?
Soluzione
Se è possibile ottenere il contenuto del CKEditor come alcuni altri messaggi descrivere Ho un'idea su come ottenere il conteggio dei caratteri immessi. Una volta che avete il contenuto, ad esempio
<b><span class="redText">H</span>ello <span>World!</span></b>
è possibile impostare che al innerHTML di un div nascosti, e quindi ottenere il conteggio di caratteri nel innerText di quel div.
var elem = document.getElementById('hiddenTestDiv');
elem.innerHTML = '<b><span class="redText">H</span>ello <span>World!</span></b>';
var innerText = elem.innerText; // equals 'Hello World!'
var contentLength = elem.innerText.length; // equals 12
Direi che non è una soluzione perfetta (ad esempio solo <hr>
nel contenuto restituirà 0 per la durata del innerText), ma può essere abbastanza vicino a lavorare per voi. E 'una specie di una strana situazione che conta la lunghezza del contenuto di HTML, come ha detto Pekka cose come la lunghezza di un tag <hr>
sono aperti all'interpretazione.
Altri suggerimenti
Non si può afferrare il contenuto di CKEditor così facilmente, per esempio con jQuery e $("iframe").contents()...
causare il ckeditor non è pronto quando il vostro fuochi di codice. Quindi è necessario associare alcune funzioni su eventi quando l'istanza dell'editor è pronto. Dopo di che, striscia fuori i tag, tagliare i spazi bianchi dall'inizio e alla fine e il conteggio può iniziare:)
<input type="text" name="count" id="count" />
<textarea id="ck"></textarea>
<script type="text/javascript">
$(document).ready(function()
{
var editor = CKEDITOR.replace('ck');
editor.on("instanceReady", function(){
this.document.on("keyup", ck_jq);
this.document.on("paste", ck_jq);
});
});
function ck_jq()
{
var len = CKEDITOR.instances['ck'].getData().replace(/<("[^"]*"|'[^']*'|[^'">])*>/gi, '').replace(/^\s+|\s+$/g, '');
$("#count").val(len.length);
}
</script>
HTH:)
L'textarea è soltanto un elemento di ripiego, e non aggiornato dal vivo con il contenuto inserito. Si dovrà afferrare il contenuto della vostra istanza CKEditor. Questo è sicuramente possibile.
Controlla gli approcci a questa domanda. contenuti che l'accesso di CKEditor su ogni cambio di contenuti.
Vedo un problema più grande per te, però. Quanti personaggi funziona questo codice ha:?
<b><span class="redText">H</span>ello <span>World!</span></b>
(la risposta - credo - è di dodici)
o questo:
<b> <p style="font-size: 30px; font-weight: bold"></p> </b>
(la risposta - credo - è di due spazi)
o questo:
<hr>
(la risposta - credo - è uno, ma questo è giù per l'interpretazione davvero)
sono stringhe tutto immaginabili che si verificano durante la scrittura e l'eliminazione di testo in CKEditor.
Supponendo che si desidera contare tutti i caratteri senza tag HTML, ignorando elementi aggiuntivi come immagini o linee orizzontali, c'è un strip_tags () funzione per JavaScript che è possibile utilizzare per smontare i dati.
Il CKEditor in realtà rende come un Iframe, è possibile ottenere il contenuto dal Iframe ( http://simple.procoding.net/2008/03/21/how-to-access-iframe-in-jquery/ ), anche se non è sarà facile. Vorrei secondo @ preoccupazione di Pekka di HTML e come si sta andando per determinare conteggio dei caratteri.
// È possibile ottenere il contenuto reale del CKedit utilizzando document.getBody () getText () come di seguito.:
//
// Esempio:
// join_content è Id di ckeditor
// Editor Html:
{$ OneJoinInfo [ 'descrizione']}
{Forma :: editore ( 'join_content', 'full', '', '', '', 1)}
var join_contentVal = CKEDITOR.instances.join_content.document.getBody().getText();
if(strlen(join_contentVal) > 1000){
return false;
}
function save()
{
var caseText = CKEDITOR.instances.caseText.getData();
var caseforlen = CKEDITOR.instances.caseText.document.getBody().getText();
if (strlen(caseforlen) > 4000) {
alert("maxnum is 2000");
return;
}
}
function strlen(str) {
var regExp = new RegExp(" ","g");
str = str.replace(regExp , "");
str = str.replace(/\r\n/g,"");
var realLength = 0, len = str.length, charCode = -1;
for (var i = 0; i < len; i++) {
charCode = str.charCodeAt(i);
if (charCode >= 0 && charCode <= 128) realLength += 1;
else realLength += 2;
}
return realLength;
};
function getCurrentCount(editor){
var currentLength = editor.getData()
.replace(/<[^>]*>/g, '')
.replace(/\s+/g, ' ')
.replace(/&\w+;/g ,'X')
.replace(/^\s*/g, '')
.replace(/\s*$/g, '')
.length;
return currentLength;
}
function checkLength(evt){
var stopHandler = false;
var currentLength = getCurrentCount(evt.editor);
var maximumLength = 350;
if(evt.editor.config.MaxLength)
{
maximumLength = evt.editor.config.MaxLength;
}
if(!evt.editor.config.LockedInitialized)
{
evt.editor.config.LockedInitialized = 1;
evt.editor.config.Locked = 0;
}
if(evt.data)
{
if(evt.data.html)
{
currentLength += evt.data.html.length;
}
else if(evt.data.text)
{
currentLength += evt.data.text.length;
}
}
if(!stopHandler && currentLength >= maximumLength)
{
if ( !evt.editor.config.Locked )
{
// Record the last legal content.
evt.editor.fire( 'saveSnapshot' );
evt.editor.config.Locked = 1;
// Cancel the keystroke.
evt.cancel();
}
else
// Check after this key has effected.
setTimeout( function()
{
// Rollback the illegal one.
if( getCurrentCount(evt.editor) > maximumLength )
evt.editor.execCommand( 'undo' );
else
evt.editor.config.Locked = 0;
}, 0);
}
}
CKEDITOR.replace('local',{
MaxLength: 255
});
CKEDITOR.instances.local.on('key', checkLength);
CKEDITOR.instances.local.on('paste', checkLength);