Как выполнить программный ввод текста, который поддерживает как отмену, так и повтор?

Мое текущее расширение Chrome должно программно вставлять текст при вводе пользователем. Это прекрасно работает, однако искажает поведение отмены/возврата всех текстовых редакторов, в которых я пробовал это до сих пор. Итак, следующая рутина:

  1. введите какой-нибудь текст
  2. вставить текст программно
  3. введите больше текста
  4. нажмите ctrl-z трижды

не всегда возвращается в пустое состояние. Очень часто он застревает где-то посередине. Его поведение в основном непоследовательно.

Вот MCVE сценария контента:

function init() {
  var $input = document.getElementsByTagName("textarea")[0];
  if (!$input) {
    console.info("No input element found.");
    return true;
  }
  var $btn = document.createElement("button");
  $btn.innerHTML = "Click";
  $btn.addEventListener("click", function() {
    var caretPos = $input.selectionStart;
    $input.value = $input.value.substring(0, caretPos) + " test string " + $input.value.substring(caretPos);
  });

  $input.parentElement.insertBefore($btn, $input);

  return true;
}
window.addEventListener("load", init);
<div><textarea></textarea></div>

(Я также включил его как Расширение Chrome на случай, если вам это понравится.)

Я хочу, чтобы отмена/повтор отлично функционировали как в текстовой области, так и в узлах, доступных для редактирования. Я также безуспешно пробовал document.execCommand в режимах insertText и insertHTML. Я просмотрел два других связанных вопроса, но они не отвечают на мой запрос. (q1, д2)

Какое еще может быть возможное решение этой проблемы?

Установка свойства value напрямую не будет отменена с помощью сочетания клавиш Ctrl-Z. Однако использование команды insertText было отменено с помощью ctrl-z, по крайней мере, в моем браузере Chrome как для textarea, так и для contenteditables в обязательном порядке. Обратите внимание, если под текстовыми редакторами вы подразумеваете редакторы фреймворков, такие как tinymce или им подобные, их код может мешать вашему или изменять работу ctrl-z/insertText в своих элементах.

Patrick Evans 08.06.2019 08:14

Если вы программно вставляете и удаляете текст, вам нужно будет программно отслеживать историю отмен и самостоятельно обрабатывать ctrl-z.

skyline3000 08.06.2019 08:15

execCommand — правильное решение, отвечающее всем вашим потребностям. Тот факт, что это не сработало для вас, может означать, что вы использовали его неправильно в конкретной ситуации. Возможно, вы не сфокусировали элемент. Или что-то еще мешало.

wOxxOm 08.06.2019 08:58

@PatrickEvans Привет, ты прав. Раньше я использовал другой редактор. execCommand работает!

Gaurang Tandon 08.06.2019 10:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря полезным комментариям выше, моя проблема заключалась в том, чтобы делать execCommand в предварительно запрограммированных странных редакторах, таких как ящик для обмена сообщениями Facebook, tinymce и т. д. У них могут быть свои собственные настройки, мешающие.

В обычных текстовых редакторах document.execCommand должен работать нормально и поддерживать отмену/возврат. Используйте это так:

document.execCommand('insertText', false, "text");
document.execCommand('insertHTML', false, "html");

Другие вопросы по теме