2017-08-17 83 views
20

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

这里是重现问题的小提琴:https://jsfiddle.net/47wqpv1f/4/

选择一个单词并按下按钮。您可能会在这里看到,在Firefox 60和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中改变行为的实际原因是什么?

+2

它通常被称为[错误](https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Leptoglossus_occidentalis_g3.jpg/800px-Leptoglossus_occidentalis_g3.jpg)。许多软件都有它,为了解决这些问题,一些公司使用跟踪工具,让用户了解它,并最终尝试摆脱这些。您找到此标本的软件的开发人员团队拥有[此工具](http://chromiumbugs.appspot.com/),均对您开放。 – Kaiido

回答

3

这可能只是Chrome中的一个错误,但请注意,根据规范(https://w3c.github.io/editing/execCommand.html),execCommand处于草稿状态,并且预计会留在那里。它受到支持,但在每个浏览器中都可能不完全支持。如果没有可靠的规范,实施可能会有所不同,甚至在浏览器版本之间,尤其是从一个浏览器到另一个浏览器。

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