Javascript 从选择范围中删除节点后,ExecCommand在Chrome 60中无法正常工作

Javascript 从选择范围中删除节点后,ExecCommand在Chrome 60中无法正常工作,javascript,html,google-chrome,contenteditable,Javascript,Html,Google Chrome,Contenteditable,在调试非常旧版本的Redactor编辑器时,我们发现了一个相当棘手的情况。简而言之,从选择范围中删除span节点会导致Chrome v60中execCommand的错误行为,尽管在Firefox和Chrome v58中它工作正常 这是复制问题的小提琴: 选择一个单词并按下按钮。你可以在这里看到,在Firefox和Chrome58中,文本将被删除,而在Chrome60中,文本保持不变 在格式化操作(例如,粗体)中,编辑器使用两个不同的“标记”元素围绕选择范围 var range2 = rang

在调试非常旧版本的Redactor编辑器时,我们发现了一个相当棘手的情况。简而言之,从选择范围中删除
span
节点会导致Chrome v60中
execCommand
的错误行为,尽管在Firefox和Chrome v58中它工作正常

这是复制问题的小提琴:

选择一个单词并按下按钮。你可以在这里看到,在Firefox和Chrome58中,文本将被删除,而在Chrome60中,文本保持不变

在格式化操作(例如,粗体)中,编辑器使用两个不同的“标记”元素围绕选择范围

  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中改变行为的实际原因是什么?

这可能只是Chrome中的一个bug,但请注意,根据spec(),execCommand已在草稿中,预计将保留在草稿中。它是受支持的,但并非每个浏览器都以完全相同的方式支持它。如果没有可靠的规范,实现可能会有所不同,甚至在不同的浏览器版本之间,尤其是在不同的浏览器之间

从长远来看,使用使用定义更好的标准的实现可能会取得更大的成功(当然,这是一个挑战!),因为它们不是一个移动的目标

它通常被称为。很多软件都有它,为了解决这些问题,一些公司使用跟踪工具,让他们的用户了解它,并最终尝试摆脱它们。您在中找到此样本的软件的开发团队已向您开放。