Ajax调用后CKEditor无法正常工作

时间:2012-11-27 13:37:34

标签: ckeditor

我正在使用CKEditor作为wysiwyg编辑器。我的页面上有一些表单元素,它们通过Ajax调用加载。当我填写所有数据,包括wysiwyg编辑器,然后点击保存按钮没有保存任何内容。提交也是通过Ajax调用完成的。

由于CKEditor未正确更新原始textarea,因此无法保存任何内容。我找到了一个答案,表示在提交之前执行以下

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

每次提交表单前都会触发此操作。但是这段代码仍然没有用CKEditor的内容更新真正的textarea ......

任何人都知道如何解决这个问题?

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

修改

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

e.g。

在视图中的脚本部分中

<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'); 
}

View中应该有一个文件,名为“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();
 ?>

试试吧。

答案 2 :(得分:0)

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

$.ajax({
    type: "POST",
    url: url
}).done(function(data){
     $('#content').html(data);
}).then(function(){
     //create ckeditor
});