论坛首页 Web前端技术论坛

ckeditor image上传js 修改成plugin的方法

浏览 13232 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-21   最后修改:2010-05-07

在上一个文章中,介绍了自己写的一个image上传的ckeditor的 js的 扩展 ,发现在editor.destory();后在生成editor的时候,自己写的image上传的就调用不了了,没有自己查明原因,觉得可能是 CKEditor.on('pluginsLoad',function(){})的加载的问题,于是修改成了插件的方式。

 

建立步骤如下:

 

1.首先在ckeditor的plugins文件夹下面建立一个myAddImage文件夹,注意 最好文件夹得名字的大小写 ,如果你用是linux系统,那么如果把myAddImage 写成 myaddimage 那么ckeditor会获取不到,我在测试的时候就犯了这个错误。

2.在myAddImage文件夹下建立plugin.js文件。

  文件内容:

CKEDITOR.plugins.add( 'myAddImage',{
    init : function( editor )
    {   
       /*
       /* 获取CKEditorFuncNum
       */
       var getFuncNum = function(url) {
          var reParam = new RegExp('(?:[\?&]|&)CKEditorFuncNum=([^&]+)', 'i') ;
          var match = url.match(reParam) ;
          return (match && match.length > 1) ? match[1] : '' ;
        };
       /*
       /*  iframe onload处理 
        *  这段可以放在外面,根据不同的返回值自行进行处理
        */
        var getAjaxResult = function (t){
            var _id = this.getId();
            var _doc = this.getFrameDocument();
            //获取页面返回值
            var data = _doc.getBody().getHtml();
            //firebrowser的处理
            CKEDITOR.tools.callFunction(t.listenerData, data);
            this.removeListener('load', getAjaxResult);
        }

        CKEDITOR.dialog.add( 'myAddImage', function( editor )
        {
            return {
                    title : '添加图片',
                    minWidth : 400,
                    minHeight : 200,
                    contents : 
                    [
                        {
                            id : 'addImage',
                            label : '添加图片',
                            title : '添加图片',
                            filebrowser : 'uploadButton',
                            elements :
                            [
                              {    
                                  id : 'txtUrl',
                                  type : 'text',
                                  label : '图片网址',
                                  required: true
                              },
                              {
                                    id : 'photo',
                                    type : 'file',
                                    label : '上传图片',
                                    style: 'height:40px',
                                    size : 38
                              },
                              {
                                   type : 'fileButton',
                                   id : 'uploadButton',
                                   label : '上传',
                                   filebrowser :
                                   {
                                        action : 'QuickUpload',
                                        target : 'addImage:txtUrl',
                                        onSelect:function(fileUrl, errorMessage){
                                            //在这里可以添加其他的操作
                                        }
                                   },
                                   onClick: function(){
                                        var d = this.getDialog();
                                        var _photo =  d.getContentElement('addImage','photo');
                                        _funcNum = getFuncNum(_photo.action);
                                        var _iframe =  CKEDITOR.document.getById(_photo._.frameId);
                                        //可以查看ckeditor.event doc 了解此段代码
                                        //http://docs.cksource.com/ckeditor_api/
                                        _iframe.on('load', getAjaxResult, _iframe, _funcNum);
                                   },
                                   'for' : [ 'addImage', 'photo']
                              }
                            ]
                        }
                   ],
                   onOk : function(){
                       _src = this.getContentElement('addImage', 'txtUrl').getValue();
                       if (_src.match(/(^\s*(\d+)((px)|\%)?\s*$)|^$/i)) {
                           alert('请输入网址或者上传文件');
                           return false;
                       }
                       this.imageElement = editor.document.createElement( 'img' );
                       this.imageElement.setAttribute( 'alt', '' );
                       this.imageElement.setAttribute( 'src', _src );
                       //图片插入editor编辑器
                       editor.insertElement( this.imageElement );
                   }
            };
        });
        editor.addCommand( 'myImageCmd', new CKEDITOR.dialogCommand( 'myAddImage' ) );
        editor.ui.addButton( 'AddImage',
        {
                label : '图片',
                icon:'images/images.jpg', //toolbar上icon的地址,要自己上传图片到images下
                command : 'myImageCmd'
        });
    },
    requires : [ 'dialog' ]
});
 

 

 可以看出和上个文章的myeditor.js 的代码与本文中CKEDITOR.dialog.add中没有什么区别。

 关于为什么要用额外的

getAjaxResult  

是因为有很多时候,我们的返回值不一定就直接是图片web地址,可能是json数据,要进行处理。

我没有发现firebrowser的

onSelect:function(fileUrl, errorMessage){
                                            //在这里可以添加其他的操作
                                        }

会有对目标(

 target : 'addImage:txtUrl',

的值的更新能够处理的,不论你在onselect中对fileUrl如何赋值,都不会影响txtUrl中的值。

 

3.就是外部如何调用这个plugin了

 

 var editor = CKEDITOR.replace( id,
 {
         extraPlugins : 'myAddImage', //就是这里
         toolbar : ['Source','-','Bold','Italic','Underline','Strike','-','Link','-','Unlink','-','AddImage'],
         filebrowserUploadUrl : '/upload.php'
 });
 

你也可以在config.js里面添加

 extraPlugins : 'myAddImage'

这句话

 

   发表时间:2010-06-11  
filebrowserUploadUrl : '/upload.php' 这里的upload.php是否需要返回值呢?还是只需要处理上传的文件即可?
0 请登录后投票
   发表时间:2010-06-17  
hongliang19840806 写道
filebrowserUploadUrl : '/upload.php' 这里的upload.php是否需要返回值呢?还是只需要处理上传的文件即可?

需要返回值,返回值的样式可以自己设定,在getAjaxResult  函数中进行处理返回值,返回值要包含图片上传后的路径,这样你处理后,才可以把路径插入到编辑器中
0 请登录后投票
   发表时间:2010-08-10   最后修改:2010-08-11
楼主,_iframe.on('load', getAjaxResult, _iframe, _funcNum);这句话导致getAjaxResult 这个一直都在执行,上传成功的同时,出现了溢出错误
0 请登录后投票
   发表时间:2010-08-12  
wyongzhi 写道
楼主,_iframe.on('load', getAjaxResult, _iframe, _funcNum);这句话导致getAjaxResult 这个一直都在执行,上传成功的同时,出现了溢出错误

1.是否有返回值?
2.返回值在成功的时候可以把_iframe的onload事件去掉
看看通过以上两点能处理不?
0 请登录后投票
   发表时间:2010-09-30  
楼主:我按照附件的配置好,打开页面,出现一个简单的textarea框,点击create按钮后,全部消失!但直接打开压缩包里面的index.html文件则可以正常显示,谁能帮我想想是哪方面的问题,我的是JSP
0 请登录后投票
   发表时间:2010-09-30  
tdwm 写道
wyongzhi 写道
楼主,_iframe.on('load', getAjaxResult, _iframe, _funcNum);这句话导致getAjaxResult 这个一直都在执行,上传成功的同时,出现了溢出错误

1.是否有返回值?
2.返回值在成功的时候可以把_iframe的onload事件去掉
看看通过以上两点能处理不?


请问楼主怎样去掉_iframe的onload时间呢?谢谢
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics