如何检查CKEditor中是否有文本?

问题描述 投票:0回答:8

我有一个包含几个字段的 HTML 表单。其中之一是由 CKEditor 管理的文本区域。

当用户想要提交表单时,我想检查他是否在所有字段中输入了值。

我知道如何检查 CKEditor 控件中是否有任何内容,但它可能是“空”HTML 标记,其中没有任何文本。

如何检查文本?

服务器端我使用类似PHP的trim(strip_tags($content))的东西,所以我想在JavaScript中也有同样的东西。

使用 jQuery 的解决方案也是可用的。

javascript ckeditor fckeditor
8个回答
34
投票

这会起作用:

$("#editorContainer iframe").contents().find("body").text();

它将只包含文本,不包含任何 html 标签。

更新

它绝对适用于 CKEditor 演示页面。使用 Firefox 和 Firebug,转到 Firebug 控制台,然后输入:

$("#demoInside iframe").contents().find("body").text();

控制台将打印出编辑器中的文本,不带 html 标签。确保您的特定应用程序中的选择器正确。您可以像这样测试您的选择器:

$("#demoInside iframe").contents().find("body").length;

它应该等于 1。如果它是 0,那么你的选择器是错误的。

更新2

同样,我的代码仍然正确,并且它仍然可以在该页面上运行。您只需要正确的选择器。在您链接到的页面上,它是一个

<span>
,id 为
cke_editor1
。该特定页面不使用 jQuery,因此需要一些额外的工作来证明该示例有效。安装 FireQuery,“jqueryify”页面,然后在 Firebug 控制台中执行此操作(请注意,您必须使用
jQuery
而不是
$
。这就是 FireQuery 的工作原理)。

jQuery("#cke_editor1 iframe").contents().find("body").text();

简而言之,确保您有正确的选择器来访问您的 iframe。无论您是从

<div>
还是
<textarea>
创建 CKEditor 并不重要。只要你可以选择CKEditor注入到DOM中的
<iframe>
,你就可以使用
.contents().find("body").text()
来获取该iframe的文本。你测试过你的jquery选择器来看看是否
.length == 1
吗?


17
投票

CKeditor 有自己的内置函数,用于在文本编辑器中检索数据:

function CheckForm(theForm) 
{
    textbox_data = CKEDITOR.instances.mytextbox.getData();
    if (textbox_data==='')
    {
        alert('please enter a comment');
    }
}

文档


6
投票

您可以使用以下代码片段来检查 ckeditor 是否有一些文本。

var _contents = CKEDITOR.instances.editor1.document.getBody().getText();
if (_contents == '') {
    alert('Please provide the contents.') ;
}

1
投票

CKEditor 5 - 经典编辑器

这是一个老问题,但是,由于它是谷歌的第一个结果之一,我认为更新最新版本的ckeditor的答案会很有帮助,就我而言是ckeditor 5版本11.0.1

ckeditor 5 的问题是,即使它/看起来是空的,在提交表单时,它也不会像您期望的那样发送空值,而是发送以下字符串:

<p>&nbsp;</p>

这不是您想要的,尤其是当您想在服务器端设置一些验证规则时。

为了避免这种头痛,我使用了这段基于 light-flight 答案的代码片段:

$(document).ready(function() {

    var editorContainer = document.querySelector('#editor');

    var check_if_empty = function(val) {

        return $.makeArray($(val)).every(function(el) {

            return el.innerHTML.replace(/&nbsp;|\s/g, '').length === 0;
        });
    };

    var clear_input_if_empty_content = function(input) {

        var $form = $(input).parents('form');

        $form.on('submit', function() {

            if (check_if_empty($(input).val())) {

                $(input).val('');
            }
        });
    };

    ClassicEditor.create( editorContainer )
        .then(function(editor) {
            clear_input_if_empty_content(editorContainer)
        })
        .catch(function(error) {
            console.log(error);
        });
});

1
投票

<script>
CKEDITOR.replace('messagechat');

var feedback = CKEDITOR.instances.messagechat.document.getBody().getChild(0).getText(); 
// get Data
alert(feedback);
</script>

0
投票

我们使用原型、该库和以下附加内容:

Element.addMethods({  
  getInnerText: function(element) {
    element = $(element);
    return element.innerText && !window.opera ? element.innerText
      : element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ');
  }
});

(感谢托比·兰格尔

我能够使用以下函数来确定 CKEditor 中是否有任何实际文本:

function editorEmpty(instanceName){

    var ele = (new Element('div')).update(CKEDITOR.instances[instanceName].getData()); 

    return (ele.getInnerText() == '' || innerText.search(/^(&nbsp;)+$/i) == 0);
}

还要注意

&nbsp;
的测试 - 通常当编辑器显示为空时,它实际上包含类似以下内容:
<p>&nbsp;</p>


0
投票

您可以通过首先更新所有实例来检查该字段是否有任何内容,首先,创建一个函数来执行此操作:

function updateInstances(){
    for( instance in CKEDITOR.instances )`
CKEDITOR.instances[instance].updateElement();
}

然后,提交后,

只需调用

updateInstances()
函数,之后就可以正常测试字段了,

var fieldValue = $.trim($(document).find('textarea#field_ID').val());
if(fieldValue.length != 0){
//your code
}

0
投票

我们在 CKEditor 5 中处理带有嵌入图片的长文本,并且功能

editor.getData()
对于长文档来说很重。每次更改都调用它来确保编辑器是否为空太慢了。

所以这是我的解决方案:

isEditorEmpty(editor) {
    // Get root node of editor document
    const root = editor.model.document.getRoot();
    
    // Root node is empty
    if (root.childCount === 0 || root.isEmpty) {
        return true;
    }
    
    // Root contains more then one initial paragraph 
    if (root.childCount >= 2 ) {
        return false
    }

    // Root contains one empty paragraph or one node with content
    return !editor.getData();
}

// Initialization and event binding
ClassicEditor.create( el, config )
    .then( editor => {
        editor.model.document.on('change:data', () => {
            if ( isEditorEmpty(editor) ) {
                doSomething_itIsEmpty();
            } else {
                doSomethingElse_itHasContent();
            }
        });
    })
; 

希望对您有帮助。请参阅文档节点的 isEmpty 属性的文档。

© www.soinside.com 2019 - 2024. All rights reserved.