parsley.js 不适用于 ckeditor textarea

parsley.js does not work for ckeditor textarea

我用 parsley.js 验证器为我的表单编写了代码,但是它工作正常,除了 CKEditor textareas。问题出在哪里?这是屏幕截图

这是我的代码:

<script type="text/javascript">
 CKEDITOR.on('instanceReady', function(){
      $.each( CKEDITOR.instances, function(instance) {
        CKEDITOR.instances[instance].on("change",function(e) {
          for ( instance in CKEDITOR.instances)
          CKEDITOR.instances[instance].updateElement();
        });
      });
  });
</script>

<h2 class="heading">Description</h2>
<div class="controls">
  <textarea name="description" id="description" required="" data-parsley-errors-container="#description-errors" data-parsley-required-message="Это поле необходимо!"></textarea>
</div>
<div style="margin-bottom: 20px;" id="description-errors"></div>

<script>
  CKEDITOR.replace('description');
</script>

<h2 class="heading">Purpose</h2>
<div class="controls">
  <textarea name="purpose" id="purpose" required="" data-parsley-errors-container="#purpose-errors" data-parsley-required-message="Это поле необходимо!"></textarea>
  <div style="margin-bottom: 20px;" id="purpose-errors"></div><br><br>
  <button type="submit" name="submit">Submit</button>
</div>


<script>
  CKEDITOR.replace('purpose');
</script>

如果您提供一个最小的工作示例,回答问题总是容易得多...

ckeditor 隐藏 <textarea> 并通过 Javascript 填充它。

可能是错误容器放错了地方。

也很有可能 ckeditor 没有触发 input 事件(不太为人所知)。如果是这种情况,以下代码应该可以解决问题:

$('textarea').on('change', function() { $(this).trigger('input') })

请更新是否可行。

您的问题与 required 属性有关。之后,这一行:

CKEDITOR.on('instanceReady', function () {

您需要为每个文本区域再次添加这样的属性,因为在 CKEDITOR 初始化阶段丢失了(即:CKEDITOR.replace('purpose');)。

对于特定的文本区域,您可以这样写:

$('#description').attr('required', '');

对于属于以下形式的所有文本区域:

$('form textarea').attr('required', '');

来自您的评论:

When the error shows in other inputs and when I type something it removes automatically. But in textareas it does not leave

为了解决这部分,在CKEDITOR change事件上,你需要触发parsley验证。下面一行可以解决问题:

$('form').parsley().validate();

更新后的代码(jsfiddle here):

CKEDITOR.on('instanceReady', function () {
    $('form textarea').attr('required', '');
    $.each(CKEDITOR.instances, function (instance) {
        CKEDITOR.instances[instance].on("change", function (e) {
            for (instance in CKEDITOR.instances) {
                CKEDITOR.instances[instance].updateElement();
                $('form').parsley().validate();
            }
        });
    });
});