ExecCommand funciona incorrectamente en Chrome 60 después de eliminar el nodo del range de selección

Descubrimos un caso bastante complicado al depurar una versión muy antigua del editor Redactor. En dos palabras, la eliminación de un nodo span del range de selección lleva a un comportamiento incorrecto de execCommand en Chrome v60, aunque en Firefox y Chrome v58 funcionaba correctamente.

Aquí está el violín que reproduce el problema: https://jsfiddle.net/47wqpv1f/4/ .

Seleccione una sola palabra y presione el button. Puede ver aquí que en Firefox y Chrome 58 el text se verá afectado mientras que en Chrome 60 permanecerá intacto.

En la acción de formateo, p. Ej. Negrita , el editor rodea el range de selección con dos elementos diferentes de "marcador".

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

A continuación, el editor realiza algunas manipulaciones con la selección y, a continuación, restablece la selección para que coincida con los límites del marcador.

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

Después de ese editor, se eliminan los nodos marcadores, que por idea deben preservar la selección original.

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

A continuación, el editor agrega marcadores nuevamente para el siguiente paso del procedimiento de formateo, y luego execCommand .

Chrome 60 solo agregará la label de respuesta al marcador de la izquierda, mientras que otros browseres mencionados ajustarán la respuesta a toda la selección (que es un comportamiento esperado para mí en este caso).

Puedo pensar en diferentes soluciones aquí, pero ¿cuál es la razón real de cambiar el comportamiento en el nuevo Chrome?

Es probable que solo sea un error en Chrome, pero tenga en count que según la especificación ( https://w3c.github.io/editing/execCommand.html ), execCommand está en borrador y se espera que permanezca allí. Es compatible, pero puede no ser compatible exactamente de la misma manera en todos los browseres. Sin una especificación sólida a seguir, es probable que la implementación varíe, incluso entre versiones de browser y especialmente de un browser a otro.

A largo ploop, es probable que tenga más éxito utilizando implementaciones que utilicen estándares mejor definidos (¡un desafío, sin dudas!) ¡Ya que no son un objective mobile!