API через postMessage
Включите API в настройках выше и укажите origin страницы, в которую вставляете редактор. В src появятся api=1 и parentOrigin. Без этих параметров обмен отключён. Редактор принимает запросы только от непосредственной родительской страницы с указанным origin.
| Сообщение | Назначение |
textria:embed:ready | Редактор загрузил черновик и готов принимать запросы. Содержимое не передаётся. |
|---|
textria:embed:ping | Проверка готовности: редактор отвечает ready. Полезно, если обработчик подключён после загрузки iframe. |
|---|
textria:embed:get | Получить актуальное содержимое. Ответ content содержит text и html. |
|---|
textria:embed:set | Заменить содержимое: передайте content и format: text или html. Пустая строка очищает редактор. В ответе content возвращается результат после обработки. |
|---|
textria:embed:error | Ошибка запроса: unsupported-version, invalid-format, invalid-content, content-too-long или editor-error. |
У каждого запроса обязательны version: 1 и уникальный requestId (до 120 латинских букв, цифр и символов _ . : -). Ответ содержит тот же requestId. Лимит записи — 1 000 000 символов. text сохраняет пробелы и переносы строк без интерпретации Markdown; html сохраняет поддерживаемое оформление, удаляя изображения, скрипты и небезопасные ссылки. Запись участвует в автосохранении, её можно отменить в редакторе. Ответ подтверждает применение текста, а не запись в хранилище. Автоматических событий изменения нет: запросите текст через get, когда он нужен вашему сайту.
Пример интеграции на JavaScript
Разместите этот JavaScript после iframe. В коде iframe при включённом API автоматически появится id; пример ниже учитывает идентификатор из настроек. Проверяйте event.source и event.origin, а в postMessage передавайте точный origin редактора.
const iframe = document.getElementById("textria-editor");
const editorOrigin = new URL(iframe.src).origin;
let nextRequestId = 0;
function send(type, payload = {}) {
const requestId = "embed-" + ++nextRequestId;
iframe.contentWindow.postMessage({
...payload, type, version: 1, requestId,
}, editorOrigin);
return requestId;
}
window.addEventListener("message", (event) => {
if (event.source !== iframe.contentWindow || event.origin !== editorOrigin) return;
const data = event.data;
if (!data || data.version !== 1) return;
if (data.type === "textria:embed:ready") send("textria:embed:get");
if (data.type === "textria:embed:content") console.log(data.requestId, data.text, data.html);
if (data.type === "textria:embed:error") console.error(data.requestId, data.code);
});
send("textria:embed:ping");
function setText(content) {
return send("textria:embed:set", { format: "text", content });
}
// setText("Hello, Textria!");