Проблема Ckeditor, вызывающая setData во время события onchange - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать плагин, который работает аналогично функции тегирования здесь, в переполнении стека.Плагин добавляет событие 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);
        }
    }
});

Проблема заключается в том, когда я вызываю setData событие changeснова запускается и event.editor.getData () возвращает HTML, прежде чем я вызвал setData.Событие изменения запускается до того, как данные действительно были установлены?Есть внутренняя опция, которую я попытался установить в значение true, но данные не обновляются.

1 Ответ

0 голосов
/ 05 июня 2018

Вы изменяете содержимое редактора, поэтому естественно, что событие change будет вызываться с функцией editor.setData.TBO Я думаю, что ваша реализация имеет гораздо более важную проблему, чем циклический вызов - вы сравниваете контент HTML с помощью регулярных выражений.Это плохая практика, и вы столкнетесь с большим количеством проблем во время этой реализации.

Эта функция неочевидна и требует работы с выбором документа, а не просто с запросом его содержимого (также по соображениям производительности).

НоУ меня есть хорошая информация.С CKEditor 4.10 мы поставляем новые плагины, которые можно легко использовать для создания функций, о которых вы говорите, особенно textmatch и textwatcher.Упомянутые плагины будут поставляться вместе с плагинами autocomplete и mentions.Вы можете узнать больше о нашем прогрессе в GH:

Упоминания: https://github.com/ckeditor/ckeditor-dev/issues/1703

Автозаполнение: https://github.com/ckeditor/ckeditor-dev/issues/1751

4.10 релиз назначен на 26 июняно это может измениться, проверьте GH вехи на наличие обновлений.

После выпуска я могу предоставить пример реализации вашей функции - но я уверен, что с новыми плагинами это будет легкопирог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...