Хобрук: Ваш путь к мастерству в программировании

Как я могу изменить панель инструментов CKEditor после создания экземпляра?

Я пытаюсь добавить кнопки в CKEditor, используя расширение Chrome. В частности, я пытаюсь изменить CKEditor в редакторе шаблонов MailChimp.com. И чтобы было ясно, моя проблема не столько в том, как это сделать через расширение Chrome, сколько в том, как это сделать после того, как CKEditor уже был создан.

Когда я нахожусь на странице редактора MailChimp и набираю editor в консоли, я вижу, что он использовался для создания CKeditor на странице. К сожалению, у меня возникли проблемы с использованием кода в документации CKEditor для добавления кнопок постфактум. Некоторые вещи вроде editor.destroy() работают, но мне это не особо помогает. Я не заинтересован в уничтожении панели инструментов MailChimp и создании ее с нуля, я просто хочу добавить к ней что-то новое.

Мой код запускается в контексте страницы, а не как сценарий содержимого. Вот код из моего скрипта контента, который я использовал для включения этого:

injectScript( chrome.extension.getURL('/js/mailchimp_injected_template-editor.js'), 'body');

Он вставляет файл сценария в body страницы, чтобы я мог получить доступ к переменным, установленным кодом MailChimp. Вот код из внедренного скрипта. Я попытался использовать этот код ниже, который я получил из этого ответа: https://stackoverflow.com/a/37432348/556079

CKEDITOR.on('instanceCreated', function(event) {
    var editor = event.editor;
    editor.config.toolbar = [
        { name: 'basicstyles', groups: [ 'basicstyles'], items: [ 'Bold', 'Italic','Subscript', 'Superscript' ] },
    ]; // could be from synchronous!!! XHR as well 
});

CKEDITOR.on('instanceReady', function(event) {
    var editor = event.editor;
    editor.config.toolbar = [
        { name: 'basicstyles', groups: [ 'basicstyles'], items: [ 'Bold', 'Italic','Subscript', 'Superscript' ] },
    ];
});

Обе эти функции срабатывают именно тогда, когда я их ожидаю. К сожалению, код внутри них не влияет на страницу. Я заменил его на код, который нашел на странице документации CKeditors, а также на другие ответы на вопрос, на который я ссылался выше. Все это либо выдает ошибку, либо вообще ничего не делает.

Вот пример другого кода, который я пробовал, который более актуален, чем вышеприведенный. На самом деле это должно делать то, что я хочу. Создайте команду, а затем добавьте на панель инструментов кнопку, запускающую эту команду.

editor.addCommand("mySimpleCommand", {
    exec: function(edt) {
        alert(edt.getData());
    }
});
editor.ui.addButton('SuperButton', {
    label: "Click me",
    command: 'mySimpleCommand',
    toolbar: 'insert',
    icon: 'https://avatars1.githubusercontent.com/u/5500999?v=2&s=16'
});

Любые советы будут очень признательны!


  • К сожалению, API панели инструментов был разработан, чтобы быть статическим, и я думаю, что вы не сможете сделать слишком много без экстремального взлома JS. 23.03.2017
  • Пожалуйста, отредактируйте вопрос, чтобы он соответствовал теме: включите минимальный воспроизводимый пример, который дублирует проблему. Для расширений Chrome или Firefox WebExtensions это почти всегда означает включение вашего manifest.json и некоторого фона, содержимого и/или сценариев всплывающих окон/HTML. Вопросы по отладке (почему этот код работает не так, как я хочу?) должны включать: (1) желаемое поведение, (2) конкретную проблему или ошибку и (3) кратчайший код, необходимый для ее воспроизведения в самом вопросе. См. также: О каких темах я могу здесь спросить? и Как спросить. 23.03.2017
  • Вы запускаете этот код в контексте страницы? Вполне вероятно, что структуры данных, которые CKeditor использует для хранения отображаемых кнопок, находятся в переменной/объекте JavaScript, а не в DOM. Если это так, код, который вы используете для его изменения, должен запускаться в контексте страницы, а не в контексте сценария содержимого. 23.03.2017
  • @Makyen Да, я запускаю свой код в контексте страницы. Обновил мой вопрос, чтобы отразить это. 24.03.2017

Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..