Limit the number of character in tinyMCE

后端 未结 16 950
心在旅途
心在旅途 2020-11-29 07:44

Im using tinyMCe for my project.Everything is working fine but now i want to restrict the number of character that will be insert into tinyMce text

相关标签:
16条回答
  • 2020-11-29 07:50

    Providing support to backspace and delete keys. My version:

    max_chars : 2000,
    max_chars_indicator : ".maxCharsSpan",
    
    setup : function(ed) {  
        wordcount = 0;
        wordCounter = function (ed, e) {
            text = ed.getContent().replace(/<[^>]*>/g, '').replace(/\s+/g, ' ');
            text = text.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
            this.wordcount = ed.getParam('max_chars') - text.length;
            $(ed.getParam('max_chars_indicator')).text( this.wordcount + " (out of " +ed.getParam('max_chars')+ ") char(s) left." );
        };
    
        ed.onKeyUp.add( wordCounter );
    
        ed.onKeyDown.add(function(ed, e) {
        if (this.wordcount <= 0 && e.keyCode != 8 && e.keyCode != 46) {
             tinymce.dom.Event.cancel(e);
        }
    });
    
    0 讨论(0)
  • 2020-11-29 07:51

    Thariama's answers was awesome just implemented it and it was just what I was looking for, just made a few modifications:

        max_chars : "10",
        setup : function(ed) {
            ed.onKeyDown.add(function(ed, evt) {
                if ( $(ed.getBody()).text().length+1 > ed.getParam('max_chars')){
                    evt.preventDefault();
                    evt.stopPropagation();
                    return false;
                }
            });
        } 
    

    Thanks Thariama.

    0 讨论(0)
  • 2020-11-29 07:54

    TinyMCE 4+
    +
    jQuery

    <textarea id="description_edit" name="description_edit"><?=htmlspecialchars($this->company->description);?></textarea>
    
    <div><span>Characters left:</span> <span id="chars_left"></span></div>
    
    
    <script type="text/javascript" src="/js/tinymce/tinymce.min.js"></script>
    <script>
        var max_chars = 200; //max characters
        var max_for_html = 300; //max characters for html tags
        var allowed_keys = [8, 13, 16, 17, 18, 20, 33, 34, 35, 36, 37, 38, 39, 40, 46];
        var chars_without_html = 0;
    
        function alarmChars() {
            if (chars_without_html > (max_chars - 25)) {
                $('#chars_left').css('color', 'red');
            } else {
                $('#chars_left').css('color', 'gray');
            }
        }
    
        $(function () {
            tinymce.init({
                selector: "#description_edit",
                theme: "modern",
                width: 320,
                height: 130,
                plugins: [
                    "advlist autolink lists charmap print preview hr anchor pagebreak",
                    "searchreplace visualblocks visualchars code insertdatetime media nonbreaking",
                    "save table contextmenu directionality paste textcolor"
                ],
                image_advtab: true,
                language: 'en',
                menubar: false,
                statusbar: false,
    
                setup: function (ed) {
                    ed.on("KeyDown", function (ed, evt) {
                        chars_without_html = $.trim(tinyMCE.activeEditor.getContent().replace(/(<([^>]+)>)/ig, "")).length;
                        chars_with_html = tinyMCE.activeEditor.getContent().length;
                        var key = ed.keyCode;
    
                        $('#chars_left').html(max_chars - chars_without_html);
    
                        if (allowed_keys.indexOf(key) != -1) {
                            alarmChars();
                            return;
                        }
    
                        if (chars_with_html > (max_chars + max_for_html)) {
                            ed.stopPropagation();
                            ed.preventDefault();
                        } else if (chars_without_html > max_chars - 1 && key != 8 && key != 46) {
                            alert('Characters limit!');
                            ed.stopPropagation();
                            ed.preventDefault();
                        }
                        alarmChars();
                    });
                },
    
                toolbar: "bold italic underline | alignleft aligncenter alignright alignjustify | forecolor backcolor | bullist numlist | charmap",
                style_formats: [
                    {title: 'Bold text', inline: 'b'},
                    {title: 'Red text', inline: 'span', styles: {color: '#ff0000'}},
                    {title: 'Red header', block: 'h1', styles: {color: '#ff0000'}},
                    {title: 'Example 1', inline: 'span', classes: 'example1'},
                    {title: 'Example 2', inline: 'span', classes: 'example2'},
                    {title: 'Table styles'},
                    {title: 'Table row 1', selector: 'tr', classes: 'tablerow1'}
                ]
            });
    
            chars_without_html = $.trim($("#description_edit").text().replace(/(<([^>]+)>)/ig, "")).length;
            $('#chars_left').html(max_chars - chars_without_html);
            alarmChars();
        });
    </script>
    
    0 讨论(0)
  • 2020-11-29 07:54

    Answers above were great! I've made a small amendment so that we can set max_chars by adding it as an attribute to textarea element itself

    setup : function(ed) {
            ed.onKeyDown.add(function(ed, evt) {
                //if ( $(ed.getBody()).text().length+1 > ed.getParam('max_chars')){
                if ( $(ed.getBody()).text().length+1 > $(tinyMCE.get(tinyMCE.activeEditor.id).getElement()).attr('max_chars')){
                    evt.preventDefault();
                    evt.stopPropagation();
                    return false;
                }
            });
        } 
    
    0 讨论(0)
  • 2020-11-29 07:56

    TinyMCE + AngularJS

    Here's how you can limit max number of characters on frontend using ng-maxlength directive from AngularJS.

    Param : ngMaxlength
    Type : number
    Details : Sets maxlength validation error key if the value is longer than maxlength.

    Please note that this directive doesn't just count the displayed text characters, it counts all the text inside <textarea> in HTML like tags and scripts.

    First of all, include AngularJS, TinyMCE 4 distributive, and AngularUI wrapper for TinyMCE.

    HTML:

    <form name="form" action="#">
        <textarea ng-model="myMCEContent" ui-tinymce ng-maxlength="200" name="body"></textarea>
        <span ng-show="form.body.$error.maxlength" class="error">Reached limit!/span>
    </form>
    

    JavaScript:

    angular.module('myApp', ['ui.tinymce'])
    .config(['$sceProvider', function($sceProvider) {
        // Disable Strict Contextual Escaping
        $sceProvider.enabled(false);
    }])
    .constant('uiTinymceConfig', {/*...*/})
    .controller('myCtrl', ['$scope', function($scope) {
        // ...
    }]);
    

    jsFiddle

    ! Attention !

    Read the manual before using this solution to fully understand consequences of disabling SCE in AngularJS: $sce service.

    0 讨论(0)
  • 2020-11-29 07:58

    If you are here maybe you are looking for simple solution. Here is my solution. It is not perfect, but it is very simple

    var max_length = 3;
        tinymce.init({
            selector: '#description',
            // some my settings for tiny mce
            toolbar: ' undo redo | bold italic | formatselect',
            setup : function(ed) {
               // important part
               ed.on("keypress", function(event){
                    // get content of the tinymce and remove tags
                    // tinymce will be adding tags while you type in it.
                    // when tags are removed, you will heave real input length (the one that customer sees)
                    var content =  tinymce.activeEditor.getContent().replace(/(<([^>]+)>)/ig,"");
                    // now just compare that length to your prefered length.
                    // if it is larger or same, return false, and that will disregard last input.
                    if(content.length >= max_length){
                        return false;
                    }
                });
            }
    
        });
    
    0 讨论(0)
提交回复
热议问题