Подтвердить что ты не робот

ExecCommand неправильно работает в Chrome 60 после удаления node из диапазона выбора

Мы обнаружили довольно сложный случай при отладке очень старой версии редактора Redactor. В двух словах удаление диапазона span node из диапазона выбора приводит к неправильному поведению execCommand в Chrome v60, хотя в Firefox и Chrome v58 он работает правильно.

Вот скрипка, воспроизводящая проблему: https://jsfiddle.net/47wqpv1f/4/.

Выберите одно слово и нажмите кнопку. Вы можете увидеть здесь, что в Firefox и Chrome 58 текст будет зашифрован, а в Chrome 60 он останется нетронутым.

О действии форматирования, например. Полужирный, редактор окружает диапазон выбора с помощью двух разных элементов маркера.

  var range2 = range.cloneRange();
  var marker = document.createElement('span');
  marker.id="selection-marker-1";
  marker.className="redactor-selection-marker";
  marker.innerHTML = markerHTML;  

  range2.collapse(true);
  range2.insertNode(marker);

Затем редактор делает некоторые манипуляции с выбором, и после этого сбрасывает выбор в соответствии с границами маркера.

  range.setStart(document.getElementById('selection-marker-1'), 0);
  range.setEnd(document.getElementById('selection-marker-2'), 0);

После этого редактор удаляет маркерные узлы, которые по идее должны сохранять исходный выбор.

  marker.parentNode.removeChild(marker);
  marker2.parentNode.removeChild(marker2);

Затем редактор добавляет маркеры снова для следующего шага процедуры форматирования, а затем выполняет execCommand для пробития.

Chrome 60 добавит тег strike к левому маркеру, тогда как другие упомянутые браузеры обернут strike вокруг всего выделения (что в этом случае является ожидаемым поведением).

Я могу подумать о разных обходных решениях здесь, но какова фактическая причина изменения поведения в новом Chrome?

4b9b3361

Ответ 1

Вероятно, это просто ошибка в Chrome, но обратите внимание, что в спецификации (https://w3c.github.io/editing/execCommand.html) execCommand находится в проекте и ожидается оставайся там. Он поддерживается, но не поддерживается одинаково в каждом браузере. Без сплошной спецификации, реализация может варьироваться, даже в версиях браузеров и особенно от одного браузера к другому.

В долгосрочной перспективе у вас, скорее всего, будет больше успеха с использованием реализаций, которые используют более четко определенные стандарты (задача, если быть уверен!), поскольку они менее движущиеся цели!