在onchange事件期间,Ckeditor发出调用setData的命令

在onchange事件期间,Ckeditor发出调用setData的命令,ckeditor,ckeditor4.x,Ckeditor,Ckeditor4.x,我正在尝试创建一个插件,其工作原理类似于堆栈溢出上的标记功能。该插件向编辑器添加一个onchange事件,然后检查数据以查看用户是否输入了标记,并用div替换找到的任何标记 CKEDITOR.plugins.add('tagit', { icons: '', init: function (editor) { var tags = ['MyTag'], tokens = []; editor.on('change', fu

我正在尝试创建一个插件,其工作原理类似于堆栈溢出上的标记功能。该插件向编辑器添加一个onchange事件,然后检查数据以查看用户是否输入了标记,并用div替换找到的任何标记

CKEDITOR.plugins.add('tagit', {
    icons: '',
    init: function (editor) {
        var tags = ['MyTag'],
            tokens = [];

        editor.on('change', function (event) {
            var tokenUpdated = false;
            tokens = tokenize(event.editor.getData());
            for (var tokenIndex = 0; tokenIndex < tokens.length; tokenIndex++) {
                var token = String(tokens[tokenIndex]);
                if (!token.match(/tagit/gmi) && tags.some(function (tag) { return token.indexOf(tag) >= 0; })) {
                    tokens[tokenIndex] = '<div class="tagit">' + tokens[tokenIndex] + '</div>';
                    tokenUpdated = true;
                }
            }
            if (tokenUpdated) {
                event.editor.setData(tokens.join(''));
            }
        });

        var tokenize = function (data) {
            var match = '(<div class="tagit">.*?<\/div>)';
            for (var i = 0; i < tags.length; i++) {
                match += '|(' + tags[i] + ')';
            }
            var re = new RegExp(match, "gmi");
            return data.split(re);
        }
    }
});
CKEDITOR.plugins.add('tagit'{
图标:“”,
init:函数(编辑器){
var tags=['MyTag'],
代币=[];
编辑器.on('change',函数(事件){
var=false;
tokens=tokenize(event.editor.getData());
for(var-tokenIndex=0;tokenIndex=0;})){
令牌[tokenIndex]=''+令牌[tokenIndex]+'';
tokenUpdated=true;
}
}
如果(更新){
event.editor.setData(tokens.join(“”));
}
});
var tokenize=函数(数据){
变量匹配='(*?)';
对于(var i=0;i

问题是,当我调用setData时,会再次触发更改事件,event.editor.getData()会在调用setData之前返回html。是否在实际设置数据之前触发更改事件?有一个内部选项,我尝试将其设置为true,但数据似乎没有更新。

您正在更改编辑器内容,因此使用
editor.setData
函数调用
change
事件是很自然的。TBO我认为您的实现有一个比循环调用更重要的问题——您正在通过正则表达式比较HTML内容。这是一种不好的做法,在实现过程中会遇到更多的问题

此功能不明显,需要处理文档选择,而不仅仅是查询其内容(也是出于性能原因)

但我有一个好消息。使用CKEditor
4.10
我们提供了新的插件,可轻松用于创建您所谈论的功能,尤其是
textmatch
textwatcher
。提到的插件将与
autocomplete
提到的插件一起提供。您可以阅读更多关于GH进展的信息:

提到:

自动完成:

4.10
版本设置为6月26日,但可能会更改,请查看更新

发布后,我可以为您的功能提供一些示例实现——但我相信,有了新插件,这将非常简单