久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

CKEditor插件開(kāi)發(fā)

 看見(jiàn)就非常 2014-05-12

最近忙于開(kāi)發(fā)工作流,,想起之前開(kāi)發(fā)的OA ,缺少一個(gè)重要的功能:表單設(shè)計(jì)器,。因?yàn)槲覀兊腛A是基于Sharepoint開(kāi)發(fā)的,,如果沒(méi)有表單設(shè)計(jì)器,定義一個(gè)列表的界面需要開(kāi)發(fā)一個(gè) feature,,或則需要VS開(kāi)發(fā)一個(gè)aspx頁(yè)面,。這事一個(gè)很麻煩的事情。所以考慮實(shí)現(xiàn)一個(gè)表單設(shè)計(jì)器,。
于是我到網(wǎng)上找HTML 編輯器,,找到好幾個(gè),分別有CKEditor,TinyMCE,還有一個(gè)基于JQuery的一個(gè)編輯器XHEditor,。這幾個(gè)編輯器我就不做比較了,。我這里選擇使用CKEditor。既然要做表單設(shè)計(jì)器,,我們的需要擴(kuò)展這HTML編輯器,,CKEditor提供了方便可擴(kuò)展的插件體系,我們可以很方便的自定義一些自己的插件,。這只介紹概述CKEditor插件開(kāi)發(fā),。
首先我們到http://ckeditor.com/download下載CKEditor,這里我使用的是CKEditor 3.6。解壓后目錄如下:

Dir

CKEditor的源碼存放在_source目錄下面,,根目錄下面的ckeditor.js是經(jīng)過(guò)壓縮的代碼,。Dom元素操作,,事件處理,,初始化腳本和其他一些環(huán)境設(shè)置都在ckeditor\_souce\core目錄下面。其他功能,,如格式化,,復(fù)制粘貼,,圖片和鏈接都是以插件的形式實(shí)現(xiàn)的,存放在ckeditor\_source\plugins文件夾下面,,每一個(gè)文件夾為一個(gè)插件,。每個(gè)文件夾下面都有一個(gè)plugin.js的腳本文件。

為了減少HTML 請(qǐng)求數(shù)量,,CKEditor壓縮并打包成ckeditor.js 和ckeditor_basic.js,。默認(rèn)運(yùn)行壓縮后的ckeditor。在開(kāi)發(fā)過(guò)程中,,如果你想運(yùn)行未壓縮的源碼,,則把ckeditor.js替換成ckeditor_source.js就可以了。

我們以Hello World插件為例子,。呵呵,。在plugins目錄下面新建一個(gè)HelloWorld文件夾,并在下面建立一個(gè)plugin.js文件,。

插件配置

CKEditor能夠調(diào)用我們開(kāi)發(fā)的插件,,我們需要在CKEditor注冊(cè)我們開(kāi)發(fā)的插件。打開(kāi)根目錄下面的config.js,。設(shè)置CKEDITOR.editorConfig屬性

config.extraPlugins = 'HelloWorld';

完整的代碼如下:

CKEDITOR.editorConfig = function( config )
{
    // Define changes to default configuration here. For example:
    // config.language = 'fr';
    // config.uiColor = '#AADC6E';
    config.extraPlugins = 'HelloWorld';
};

這樣CKEditor會(huì)從Plugin文件夾找HelloWorld文件夾下面的plugin.js,,并加載插件。

工具欄按鈕

我們需要在CKEditor的工具欄上加入HelloWorld的按鈕,。單擊按鈕出發(fā)一個(gè)命令,。命令可以觸發(fā)一個(gè)事件,或調(diào)用方法,。我們通過(guò)CKEDITOR.plugins.add方法來(lái)添加插件,。

CKEDITOR.plugins.add('HelloWorld', {
    init: function (editor) {
        var pluginName = 'HelloWorld';
        CKEDITOR.dialog.add(pluginName, this.path + 'dialogs/HelloWorld.js');
        editor.addCommand(pluginName, new CKEDITOR.dialogCommand(pluginName));
        editor.ui.addButton(pluginName,
        {
            label: 'Hello',
            command: pluginName
        });
    }
});

上面代碼中,我們添加了一個(gè)HelloWorld的按鈕,,和HelloWorld的命令,。
通過(guò)方法editor.ui.addButton添加一個(gè)按鈕,這個(gè)方法有兩個(gè)參數(shù),。一個(gè)是按鈕的名字,,另外一個(gè)是按鈕的定義。
定義有以下幾個(gè)屬性:
label:當(dāng)鼠標(biāo)移動(dòng)到按鈕上面是提示此文本信息,。
className:樣式名,,默認(rèn)是'cke_button_' + command
click:按鈕的單擊事件出發(fā)的方法。如果沒(méi)有實(shí)現(xiàn)單擊事件,,則執(zhí)行指定key的命令,。
command:按鈕單擊默認(rèn)執(zhí)行的命令。
下面是按鈕的部分源碼,。

CKEDITOR.ui.button = function( definition )
  {
      // Copy all definition properties to this object.
      CKEDITOR.tools.extend( this, definition,
          // Set defaults.
          {
              title        : definition.label,
              className    : definition.className || ( definition.command && 'cke_button_' + definition.command ) || '',
              click        : definition.click || function( editor )
                  {
                      editor.execCommand( definition.command );
                  }
          });
  
      this._ = {};
  };

editor表示一個(gè)編輯器的實(shí)例,。通過(guò)調(diào)用其addCommand(commandName, commandDefinition) 方法,,來(lái)添加命令。我們實(shí)例化了一個(gè)CKEDITOR.dialogCommand,,此命令繼承至CKEDITOR.commandDefinition,,該命令執(zhí)行時(shí)打開(kāi)一個(gè)特定的對(duì)話框。我們現(xiàn)在把這個(gè)按鈕加入到ToolBar里,,修改Config.js,。

CKEDITOR.editorConfig = function (config) {
    // Define changes to default configuration here. For example:
    // config.language = 'fr';
    // config.uiColor = '#AADC6E';
    config.toolbar =
                [
                    { name: 'document', items: ['Source', '-', 'Save', 'NewPage', 'DocProps', 'Preview', 'Print', '-', 'Templates'] },
                    { name: 'clipboard', items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo'] },
                    { name: 'editing', items: ['Find', 'Replace', '-', 'SelectAll', '-', 'SpellChecker', 'Scayt'] },
                    { name: 'forms', items: ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'] },
                    '/',
                    { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat'] },
                    { name: 'paragraph', items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl'] },
                    { name: 'links', items: ['Link', 'Unlink', 'Anchor'] },
                    { name: 'insert', items: ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe'] },
                    '/',
                    { name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },
                    { name: 'colors', items: ['TextColor', 'BGColor'] },
                    { name: 'tools', items: ['Maximize', 'ShowBlocks', '-', 'About'] },
                    '/',
                    { name: 'extent', items: ['HelloWorld'] }
                ];
    config.extraPlugins += (config.extraPlugins ? ',HelloWorld' : 'HelloWorld');
};

注釋:’/’表示換行,’-‘標(biāo)識(shí)分隔符 。

config.toolbar的默認(rèn)值是Full,。Full的菜單有哪些呢,?打開(kāi)ckeditor\_source\plugins\toolbar\plugin.js查看toolbar_Full的定義。

CKEDITOR.config.toolbar_Full =
[
    { name: 'document',        items : [ 'Source','-','Save','NewPage','DocProps','Preview','Print','-','Templates' ] },
    { name: 'clipboard',    items : [ 'Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
    { name: 'editing',        items : [ 'Find','Replace','-','SelectAll','-','SpellChecker', 'Scayt' ] },
    { name: 'forms',        items : [ 'Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField' ] },
    '/',
    { name: 'basicstyles',    items : [ 'Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat' ] },
    { name: 'paragraph',    items : [ 'NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','CreateDiv','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl' ] },
    { name: 'links',        items : [ 'Link','Unlink','Anchor' ] },
    { name: 'insert',        items : [ 'Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe' ] },
    '/',
    { name: 'styles',        items : [ 'Styles','Format','Font','FontSize' ] },
    { name: 'colors',        items : [ 'TextColor','BGColor' ] },
    { name: 'tools',        items : [ 'Maximize', 'ShowBlocks','-','About' ] }
];

那么我們可以模仿來(lái)定義Mine的ToolBar,。再次編輯config.js,。

CKEDITOR.editorConfig = function (config) {
    // Define changes to default configuration here. For example:
    // config.language = 'fr';
    // config.uiColor = '#AADC6E';
    config.toolbar_Mine =
                [
                    { name: 'document', items: ['Source', '-', 'Save', 'NewPage', 'DocProps', 'Preview', 'Print', '-', 'Templates'] },
                    { name: 'clipboard', items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo'] },
                    { name: 'editing', items: ['Find', 'Replace', '-', 'SelectAll', '-', 'SpellChecker', 'Scayt'] },
                    { name: 'forms', items: ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'] },
                    '/',
                    { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat'] },
                    { name: 'paragraph', items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl'] },
                    { name: 'links', items: ['Link', 'Unlink', 'Anchor'] },
                    { name: 'insert', items: ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe'] },
                    '/',
                    { name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },
                    { name: 'colors', items: ['TextColor', 'BGColor'] },
                    { name: 'tools', items: ['Maximize', 'ShowBlocks', '-', 'About'] },
                    '/',
                    { name: 'extent', items: ['HelloWorld'] }
                ];
    config.toolbar = 'Mine';
    config.extraPlugins += (config.extraPlugins ? ',HelloWorld' : 'HelloWorld');
};
我們運(yùn)行下,查看下效果 ,。 
firstshow
這個(gè)按鈕已經(jīng)出來(lái)了,。可惜沒(méi)有圖片,。在HelloWorld的插件目錄下面新增一文件夾images,,添加一個(gè)16*16的圖標(biāo)。
修改ckeditor\_source\plugins\HelloWorld\plugin.js,。
CKEDITOR.plugins.add('HelloWorld', {
    init: function (editor) {
        var pluginName = 'HelloWorld';
        CKEDITOR.dialog.add(pluginName, this.path + 'dialogs/HelloWorld.js');
        editor.addCommand(pluginName, new CKEDITOR.dialogCommand(pluginName));
        editor.ui.addButton(pluginName,
        {
            label: 'Hello',
            command: pluginName,
            icon: this.path + 'images/hello.png'
        });
    }
});

Dialogs:

Dialog是開(kāi)發(fā)插件的關(guān)鍵,,在前面我們使用CKEDITOR.dialog.add方法添加了一個(gè)對(duì)話框。 有兩個(gè)參數(shù),。一個(gè)是對(duì)話框名,,一個(gè)對(duì)話框定義。
然后我們還添加了一個(gè)dialog命令,。這個(gè)命令會(huì)打開(kāi)我們的dialog,。

editor.addCommand(pluginName, new CKEDITOR.dialogCommand(pluginName));

我們的對(duì)話框定義放在ckeditor\_source\plugins\HelloWorld\dialogs\HelloWorld.js。

(function () {
    function HelloWorldDialog(editor) {
 
        return {
            title: '對(duì)誰(shuí)說(shuō)Hello',
            minWidth: 300,
            minHeight: 80,
            buttons: [{
                type: 'button',
                id: 'someButtonID',
                label: 'Button',
                onClick: function () {
                    alert('Custom Button');
                }
            },
            CKEDITOR.dialog.okButton,
            CKEDITOR.dialog.cancelButton],
            contents:
            [
                {
                    id: 'info',
                    label: '名字',
                    title: '名字',
                    elements:
                    [
                        {
                            id: 'text',
                            type: 'text',
                            style: 'width: 50%;',
                            label: '名字',
                            'default': '',
                            required: true,
                            validate: CKEDITOR.dialog.validate.notEmpty('名字不能為空'),
                            commit: function () {
                                var text = ‘Hello ’+this.getValue();
                                alert(text);
                            }
                        }
                    ]
                }
            ],
            onLoad: function () {
                alert('onLoad');
            },
            onShow: function () {
                alert('onShow');
            },
            onHide: function () {
                alert('onHide');
            },
            onOk: function () {
                this.commitContent();
            },
            onCancel: function () {
                alert('onCancel');
            },
            resizable: CKEDITOR.DIALOG_RESIZE_HEIGHT
        };
    }
 
    CKEDITOR.dialog.add('HelloWorld', function (editor) {
        return HelloWorldDialog(editor);
    });
})();
詳細(xì)的Dialog定義,,可以查看http://docs./ckeditor_api/symbols/CKEDITOR.dialog.definition.html,。這里介紹幾個(gè)屬性:
title:窗體的標(biāo)題

minWidth:窗體最小的寬度

minHeight:窗體的最小高度

buttons:顯示在窗體的按鈕。默認(rèn)CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton,。也就是確定,,和取消按鈕。也可以自己定義一個(gè)Button,。
{
    type: 'button',
    id: 'someButtonID',
    label: 'Button',
    onClick: function () {
        alert('Custom Button');
    }
}
這里創(chuàng)建了CKEDITOR.dialog.definition.button對(duì)象,。

contents:對(duì)話框里面的內(nèi)容。是一個(gè)CKEDITOR.dialog.definition.content數(shù)組。每一個(gè)CKEDITOR.dialog.definition.content顯示為一個(gè)tab(選項(xiàng)卡),。這里有一個(gè)重要的屬性是elements,是一個(gè)CKEDITOR.dialog.definition.uiElement數(shù)組,,是每一個(gè)選項(xiàng)卡里面的內(nèi)容,。uiElement中有commit方法,這個(gè)方法由對(duì)話框CKEDITOR.dialog.definition.commitContent方法調(diào)用執(zhí)行,。
commit: function () {
    var text = ‘Hello ’+this.getValue();
    alert(text);
}

這里我們調(diào)用CKEDITOR.ui.dialog.uiElement的getValue方法來(lái)獲取到名字文本框的值,。這里只是alert,稍后在改進(jìn)怎么把值加入到設(shè)計(jì)器里面,。
還有一個(gè)是setup方法,,則由CKEDITOR.dialog.definition.setupContent方法調(diào)用執(zhí)行。
type:有以下幾個(gè)值,。text, password, textarea, checkbox, button, select, file, fileButton, html
labelLayout:'horizontal' 或則'vertical',。
on*: 定義事件方法。事件可以是Dom事件,,例如onChange,onClick,也可以是onShow,onHide,onLoad,。
validate:驗(yàn)證用戶的輸入。例如:驗(yàn)證值不能為空,。validate : CKEDITOR.dialog.validate.notEmpty(ErrorMessage),。當(dāng)單擊btnOk按鈕,如果值為空,,則會(huì)彈出ErrorMessage信息來(lái)提示,。你還可以用其他的驗(yàn)證方法來(lái)驗(yàn)證輸入:

  • regex(regex, msg)
  • notEmpty(msg)
  • integer(msg)  //regex: /^\d*$/
  • number(msg)  //regex: /^\d*(?:\.\d+)?$/
  • equals(value, msg)
  • notEqual(value, msg)


  • onLoad,onShow,onHide,onOk,onCancel這幾個(gè)方法看字面意思就知道干嘛的了。就不多介紹了,。我們這里當(dāng)onOk,,就是確定按鈕單擊的時(shí)候,執(zhí)行了commitContent方法,,從而執(zhí)行了CKEDITOR.dialog.definition.uiElement.commit方法,。

    resizable:一個(gè)枚舉。用于修改窗體的大小,,是否可以修改高度,,寬度,還是兩者都可以,。有以下幾個(gè)定義,。默認(rèn)值是CKEDITOR.DIALOG_RESIZE_NONE。
    CKEDITOR.DIALOG_RESIZE_NONE
    CKEDITOR.DIALOG_RESIZE_WIDTH
    CKEDITOR.DIALOG_RESIZE_HEIGHT
    CKEDITOR.DIALOG_RESIZE_BOTH

    那現(xiàn)在在來(lái)運(yùn)行看看效果:
    dialog
    單擊確定按鈕則彈出Hello 某某某,。

    當(dāng)然我們不想這樣Alert,。我們希望能夠把Hello 某某某寫(xiě)到編輯器里面。
    這里我們用到了CKEDITOR.dom.element對(duì)象,。這對(duì)象里面包含了很多對(duì)編輯器DOM操作的方法,。如我們要?jiǎng)?chuàng)建一個(gè)span元素,。var element = new CKEDITOR.dom.element('span', editor.document);。我們需要設(shè)置值則調(diào)用setText方法等,。
    那我們修改剛剛做好的dialot,。

    (function () {
        function HelloWorldDialog(editor) {
     
            return {
                title: '對(duì)誰(shuí)說(shuō)Hello',
                minWidth: 300,
                minHeight: 80,
                buttons: [
                CKEDITOR.dialog.okButton,
                CKEDITOR.dialog.cancelButton],
                contents:
                [
                    {
                        id: 'info',
                        label: '名字',
                        title: '名字',
                        elements:
                        [
                            {
                                id: 'text',
                                type: 'text',
                                style: 'width: 50%;',
                                label: '名字',
                                'default': '',
                                required: true,
                                validate: CKEDITOR.dialog.validate.notEmpty('名字不能為空'),
                                commit: function (editor) {
                                    var text = 'Hello '+this.getValue();
                                    var element = new CKEDITOR.dom.element('span', editor.document);
                                    element.setText(text);
                                    editor.insertElement(element);
                                }
                            }
                        ]
                    }
                ],
                onOk: function () {
                    this.commitContent(editor);
                },
                resizable: CKEDITOR.DIALOG_RESIZE_HEIGHT
            };
        }
     
        CKEDITOR.dialog.add('HelloWorld', function (editor) {
            return HelloWorldDialog(editor);
        });
    })();
    在單擊OK按鈕后,我們調(diào)用commit方法,。我們傳了一個(gè)當(dāng)前編輯器的實(shí)例過(guò)去,。
    首先我們實(shí)例化了一個(gè)CKEDITOR.dom.elemtn。設(shè)置了它的Text,,并通過(guò)insertElement方法把元素加入到編輯器,。就這樣。我們?cè)诳纯葱Ч?
    HelloWorld

    insertElement
    源碼:
    Source
    就到這里,。最近考慮實(shí)現(xiàn)編輯器,。希望大家能夠給點(diǎn)路子。不然我會(huì)誤入歧途的,。,。。,。謝謝了,。


    參考資料:
    http://docs./ckeditor_api/index.html
    http://www.cnblogs.com/moozi/archive/2010/01/06/1640034.html
    http://www.cnblogs.com/xiangyan168/archive/2011/05/19/2050991.html
    http://ajithmanmadhan./2009/12/16/customizing-ckeditor-and-adding-a-new-toolbar-button/

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多