javascript - number - ExecCommand funciona incorrectamente en Chrome 60 después de eliminar el nodo del rango de selección
js content editable (1)
Hemos descubierto 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 rango de selección conduce 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 botón. Puede ver aquí que en el texto de Firefox y Chrome 58 aparecerán marcados mientras que en Chrome 60 permanecerá intacto.
En la acción de formato, por ejemplo, en negrita , el editor rodea el rango de selección con dos elementos "marcadores" diferentes.
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);
Luego, el editor realiza algunas manipulaciones con la selección, y después de eso 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 deberían conservar 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
para tachar.
Chrome 60 solo agregará la etiqueta strike
al marcador izquierdo, mientras que otros navegadores mencionados ajustarán el strike
alrededor de 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 del cambio de comportamiento en el nuevo Chrome?
Es probable que esto solo sea un error en Chrome, pero tenga en cuenta 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 que no sea compatible de la misma manera en todos los navegadores. Sin una especificación sólida a seguir, es probable que la implementación varíe, incluso a través de las versiones del navegador y especialmente de un navegador a otro.
A largo plazo, es probable que tenga más éxito usando implementaciones que hagan uso de estándares mejor definidos (¡un desafío, por supuesto!) ¡Ya que son un objetivo menos móvil!