1

我使用 CKEditor 作为所见即所得的编辑器。我的页面上有一些通过 Ajax 调用加载的表单元素。当我填写所有数据,包括所见即所得编辑器,然后点击保存按钮时,什么都没有保存。提交也是通过 Ajax 调用完成的。

没有保存任何内容,因为 CKEditor 没有textarea正确更新原始文件。我找到了一个答案,说在提交之前执行以下操作:

for(var instanceName in CKEDITOR.instances) {
    console.log(instanceName);
    CKEDITOR.instances['element[1][content]'].updateElement();
}

每次在我提交表单之前都会触发此操作。但是这段代码仍然没有用CKEditor拥有的内容更新真正的文本区域......

有人知道我该如何解决这个问题吗?

我正在使用最新的 CKEditor (3.6.5, 2012 年 10 月 10 日发布)

编辑

updateElement()当我运行以下命令时,刚刚通过未定义的 Firefox 控制台注意到:

CKEDITOR.instances['element[1][content]'].updateElement();

但是当我运行它时,它确实返回一个对象:

CKEDITOR.instances['element[1][content]'];
4

3 回答 3

1

有替代解决方案,您可以在 ckeditor 中添加数据而无需编辑实例的值。

例如

在视图中的脚本部分:

<script>
$(function(){
    $("#editBasic").click(function(){
        url = "<?=$this->webroot?>derivedItineraries/getDetail/<?=$derived_itinerary_id?>";
        var div = '#basic_detail';
        var data = {id: 1};
        callajax(url, data, $(div));
        return false;
    });
});
</script>

在 Ajax 调用函数中:

function callajax2(url, data, divname){
$.ajax({
        type : 'POST',
        url : url,
        dataType : 'text',
        data: data,

        success: function(data) {
            divname.text('');
            divname.append(data);
            divname.show(500);
            if (data.error === true)
                 divname.show(500);
        }
});
return false;

}

在控制器页面中:

public function getDetail($id = null) {
    $this->request->onlyAllow('ajax');
       $this->viewClass = 'Json';

       $this->loadModel('Destination');

        $this->DerivedItinerary->recursive = -1;
        $derivedItineraries = $this->DerivedItinerary->findById($id);

        $destination_covered = $this->destination_covered($id);
        $destinations = $this->Destination->find('list');

        $arrData=array(
            'itinerary'=>$derivedItineraries,
            'destination_covered' => $destination_covered,
            'destinations' => $destinations
        );
        $this->set('data', $arrData);
        $this->render('derived_basic', 'ajax'); 
}

视图中应该有文件,名为“ControllerName”/json/derived_basic.ctp

“derived_itineraries/json/derived_basic.ctp”中的文件内容:

<?php
 echo $this->Html->script('/ckeditor/ckeditor', false);
  echo $this->Form->create();
  echo $this->Form->input('inclusion', array('type'=>'textarea', 'class'=>'ckeditor', 'required'=>'true', 'div'=>'required', 'style'=>'width:200px;', 'value'=> "Test data"))."      </td></tr>";
  echo $this->Form->end();
 ?>

试试看。

于 2014-07-21T08:59:51.437 回答
1

你的第一个代码很糟糕。为什么在同一个对象上调用方法时要使用循环?这个更好:

for(var instanceName in CKEDITOR.instances) {
    CKEDITOR.instances[ instanceName ].updateElement();
}

如果仍有问题,请分享您用于创建编辑器的代码。也许您的文本区域与编辑器实例错误地关联。

于 2012-11-27T20:44:10.227 回答
0

ajax之后可以使用done()and方法then()

$.ajax({
    type: "POST",
    url: url
}).done(function(data){
     $('#content').html(data);
}).then(function(){
     //create ckeditor
});
于 2019-03-02T15:24:43.680 回答