具有自动完成功能的Ckeditor?

时间:2012-07-08 18:46:35

标签: jquery ckeditor jquery-autocomplete

是否有可能以某种方式将jquery自动完成实现到ckeditor?创建一个按钮并不是那么难,但有可能将其自动完成硬连线,所以在再次按下按钮之前输入的下一个单词是什么......?

任何远程做过这类事的人都请告诉我。或者,如果这不可能,则自动完成搜索的弹出窗口,然后单击/选择它将所选项添加到ckeditor textarea /当前光标位置(可能作为链接...)?

当然尽量不要超越:)

2 个答案:

答案 0 :(得分:4)

为了制作一个建议框,您必须使用上下文菜单作为建议框,请查看链接,了解从此处制作ckeditor插件的基本知识a link

将此添加到config.js,其中autocomplete是插件的名称

config.extraPlugins = 'autocomplete';

然后在ckeditor文件夹中创建以下目录结构/文件

ckeditor->plugins->autocomplete->plugin.js

将以下内容放入plugin.js文件

CKEDITOR.plugins.add('autocomplete',
            {
                init : function(editor) {

                     var autocompleteCommand = editor.addCommand('autocomplete', {
                        exec : function(editor) {

我们需要在文档中创建一个虚拟范围来计算要显示的菜单的当前位置

                            var dummyElement = editor.document
                                    .createElement('span');
                            editor.insertElement(dummyElement);

                            var x = 0;
                            var y = 0;

                            var obj = dummyElement.$;

                            while (obj.offsetParent) {
                                x += obj.offsetLeft;
                                y += obj.offsetTop;
                                obj = obj.offsetParent;
                            }
                            x += obj.offsetLeft;
                            y += obj.offsetTop;

                            dummyElement.remove();

计算完位置后,我们删除元素并调用方法显示建议(放在上下文菜单中,在下一个函数中配置)

                            editor.contextMenu.show(editor.document
                                    .getBody(), null, x, y);
                        }
                    });
                },

以下是编辑器上的侦听器绑定,用于检查当前键是否为#, CKEDITOR.SHIFT + 51是#的键组合

                afterInit : function(editor) {
                    editor.on('key', function(evt) {
                        if (evt.data.keyCode == CKEDITOR.SHIFT + 51) {
                            editor.execCommand('autocomplete');
                        }
                    });
在ckeditor准备就绪后,将从外部jquery调用

reloadSuggetionBox 命令生成菜单

                    var firstExecution = true;
                    var dataElement = {};

                     editor.addCommand('reloadSuggetionBox', {
                            exec : function(editor) {
                                if (editor.contextMenu) {
                                    dataElement = {};
                                    editor.addMenuGroup('suggestionBoxGroup');

                            $.each(Suggestions,function(i, suggestion)
                            {
                                    var suggestionBoxItem = "suggestionBoxItem"+ i; 
                                    dataElement[suggestionBoxItem] = CKEDITOR.TRISTATE_OFF;
                                    editor.addMenuItem(suggestionBoxItem,
                                                                        {
                                        id : suggestion.id,
                                        label : suggestion.label,
                                        group : 'suggestionBoxGroup',
                                        icon  : null,
                                        onClick : function() {
                                            var data = editor.getData();
                                            var selection = editor.getSelection();
                                            var element = selection.getStartElement();
                                            var ranges = selection.getRanges();
                                            ranges[0].setStart(element.getFirst(), 0);
                                            ranges[0].setEnd(element.getFirst(),0);
                                            editor.insertHtml(this.id + ' ');
                                            },
                                            });
                                    });

                                    if(firstExecution == true)
                                        {
                                            editor.contextMenu.addListener(function(element) {
                                                return dataElement;
                                            });
                                        firstExecution = false;
                                        }
                                }
                            }
                     });

                    delete editor._.menuItems.paste;
                },
            });

此处“建议”是页面上某处的变量,其中包含一个对象列表,其中包含“id”和“label”,以便在建议中显示。

现在为了配置这些建议,请执行以下jquery代码,在此之后,每当按下“#”时,将显示建议

$('textarea').ckeditor();
CKEDITOR.on( 'instanceReady', function( evt ) {
        CKEDITOR.instances.contractData.execCommand('reloadSuggetionBox');
    });

这将加载ckeditor(contractData是我的ckeditor实例的名称)并配置插件以显示当前存在于“Suggestions”变量中的建议,只要你需要刷新/更改你需要调用此函数后需要的建议重新加载“建议”变量

 CKEDITOR.instances.contractData.execCommand('reloadSuggetionBox');

enter image description here enter image description here

如果您对此工作有任何疑问,请告诉我。

在我的仓库找到可下载的插件

http://navalgandhi1989.github.io/ckeditor-autocomplete-suggestions-plugin/

答案 1 :(得分:2)

我远程执行了类似的操作,而不是使用CKEdit但使用markItUp

自动完成工作由a plugin基于jQuery UI完成。

我无法在CKEdit textarea中集成自动完成功能。然后我反映了更好的和改变的要求。我更喜欢标记编辑器而不是WYSIWYG编辑器(像文字处理器一样)。也许这不适用于您,但也考虑评估这一观点。

如果您可以将您的所见即所得文本框转换为标记编辑器,那么令人惊喜的是markItUp和自动完成插件可以很好地协同工作。只需为markItUp设置textarea,然后启用自动完成功能。 markItUp docs很好,插件也不一样。为此,有一个演示项目。