如何在CKeditor中使用jQuery的自定义键盘快捷键?

时间:2010-07-14 11:57:35

标签: jquery keyboard-shortcuts ckeditor

我已将用户用来编辑内容的textarea替换为CKeditor。在此更改之前,用户通过按 Ctrl + S 来保存文本。这是通过jQuery Hotkeys Plugin完成的。

由于CKeditor将其文本编辑器放在iframe中,因此在编辑文本时快捷方式不起作用。

我希望有人可以帮我找到解决方案。

2 个答案:

答案 0 :(得分:12)

经过一个早晨的挣扎,我终于找到了做到这一点的方法!

CKeditor已经提供了热键功能(参见CKeditor documentation)。使用此功能,我们可以将键击绑定到CKeditor操作。要保存,应添加以下行:

[ CKEDITOR.CTRL + 83 /*S*/, 'save' ],

但是,这将触发默认的CKeditor save命令。在我的情况下,我需要执行一个JS函数,通过AJAX将CKeditor数据和其他东西一起发送到服务器,并以相同的形式离开用户(不退出)。

在查看CKeditor support forums之后,经过一些编码,我得到了以下解决方案(我使用jQuery):

var isCtrl = false;

$('#your_textarea_id').ckeditor(function ()
{

    editor.on( 'contentDom', function( evt )
    {
        editor.document.on( 'keyup', function(event)
        {
            if(event.data.$.keyCode == 17) isCtrl=false;
        });

        editor.document.on( 'keydown', function(event)
        {
            if(event.data.$.keyCode == 17) isCtrl=true;
            if(event.data.$.keyCode == 83 && isCtrl == true)
            {
                //The preventDefault() call prevents the browser's save popup to appear.
                //The try statement fixes a weird IE error.
                try {
                    event.data.$.preventDefault();
                } catch(err) {}

                //Call to your save function

                return false;
            }
        });

    }, editor.element.$);
});

在Firefox,Chrome和IE8中测试过。

答案 1 :(得分:10)

可以向编辑器添加自定义命令,并将这些命令绑定到击键。 这是一个例子(使用jQuery适配器)

$(function() {
    // Create editor
    $('#textbox').ckeditor(function() {
            // Once the editor is loaded, we can add custom commands

            /** Alt + A will alert a greeting message **/
            // First, we define our custom command
            this.addCommand('myGreetingCommand', {
                exec : function(editor, data) {
                    alert("Hello world!");
                }
            });

            // Then, we set up the key combination
            this.keystrokeHandler.keystrokes[CKEDITOR.ALT + 65 /* A */] = 'myGreetingCommand';

            /** Ctrl + B will alert a good bye message **/
            this.addCommand('myGoodByeCommand', {
                exec : function(editor, data) {
                    alert("Goodbye!");
                }
            });

            this.keystrokeHandler.keystrokes[CKEDITOR.CTRL + 66 /* B */] = 'myGoodByeCommand';
        });

});