Как заменить содержимое редактора tinyMCE в текстовом и визуальном режиме с помощью jQuery?

3 нояб. 2017 г., 07:05:07
Просмотры: 21.5K
Голосов: 6

Я добавил кнопку рядом с кнопкой "Добавить медиафайл" в редакторе записей WordPress. Она называется "Вставить контент".

Когда эта кнопка нажата, она должна отправлять контент (обычный текст или HTML) в редактор, заменяя весь имеющийся там текст.

Код должен работать как в текстовом, так и в визуальном режиме. Как это можно реализовать с помощью jQuery?

Вот изображение для лучшего понимания вопроса:

кнопка Вставить контент рядом с кнопкой Добавить медиафайл в редакторе WordPress

Примечание: Существуют различные ответы, но они описывают только замену текста в визуальном режиме.

0
Все ответы на вопрос 1
1
17

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

var activeEditor = tinyMCE.get('content');

Затем мы используем метод setContent tinyMCE:

var activeEditor = tinyMCE.get('content');
var content = 'HTML или обычный текст здесь...';
activeEditor.setContent(content);

Однако, если редактор изначально находится в текстовом режиме после загрузки страницы, activeEditor будет равен null. Поэтому нам нужно это учитывать:

var activeEditor = tinyMCE.get('content');
var content = 'HTML или обычный текст здесь...';
if(activeEditor!==null){
    activeEditor.setContent(content);
}

Поскольку setContent работает только для tinyMCE, это не сработает, если редактор находится в текстовом режиме. Поэтому нам нужно обратиться к textarea напрямую и обновить его значение:

var activeEditor = tinyMCE.get('content');
var content = 'HTML или обычный текст здесь...';
if(activeEditor!==null){
    activeEditor.setContent(content);
} else {
    $('#content').val(content);
}

Однако, есть ещё один нюанс: если вы переключились в визуальный режим, а затем вернулись в текстовый, activeEditor больше не будет null, поэтому setContent будет вызываться всегда вместо обновления textarea. Поэтому нам нужно проверять состояние редактора. Чтобы определить текущий режим, мы отслеживаем класс div#wp-content-wrap. Объединяя всё вместе:

var content = 'HTML или обычный текст здесь...';
if($('#wp-content-wrap').hasClass('html-active')){ // Мы в текстовом режиме
    $('#content').val(content); // Обновляем содержимое textarea
} else { // Мы в режиме tinyMCE
    var activeEditor = tinyMCE.get('content');
    if(activeEditor!==null){ // Убеждаемся, что не вызываем setContent для null
        activeEditor.setContent(content); // Обновляем содержимое tinyMCE
    }
}
3 нояб. 2017 г. 07:05:07
Комментарии

Работает, как ожидалось, следует принять

Roland Soós Roland Soós
23 мая 2018 г. 11:39:10