Мы обнаружили довольно сложный случай при отладке очень старой версии редактора 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?