Javascript 为什么在选择的开头使用removeAllRAnges()?

Javascript 为什么在选择的开头使用removeAllRAnges()?,javascript,dom,range,selection,contenteditable,Javascript,Dom,Range,Selection,Contenteditable,我有这个代码,我只是想了解为什么我需要在开始时使用removeAllRanges。sel是否在初始化时自动具有范围 function setCaret(boolean_position) { var range = document.createRange(); var sel = window.getSelection(); range.selectNodeContents($('#board_code')[0]); range.collapse(boolean_pos

我有这个代码,我只是想了解为什么我需要在开始时使用
removeAllRanges
sel是否在初始化时自动具有范围

function setCaret(boolean_position) {
   var range = document.createRange();
   var sel = window.getSelection();
   range.selectNodeContents($('#board_code')[0]);
   range.collapse(boolean_position);
   sel.removeAllRanges();
   sel.addRange(range);//setting the caret position
} 

是的,从
window.getSelection()
检索到的选择与
document.createRange()
创建的范围不同,不是空实例。请注意这些方法名称的区别——一个创建新实例,另一个获取实例

原因很简单-可以有多个范围实例,每个实例包含不同的位置。但每个文档只有一个选项

因此,在添加范围之前,通常必须删除当前选定的旧范围。当然,除非您希望扩展当前选择

更新:正如蒂姆正确指出的,只有Firefox支持多个选择范围。这意味着,只有在Firefox上,您才能一次选择多个DOM—例如,您可以选择表的列或使用CTRL键添加更多选择


因此,只有Firefox要求您在添加下一个范围之前执行
removeAllRanges()
。其他浏览器会自动删除旧的范围。

我相信您知道,可以有多个选择范围,但只能在Mozilla中,在其他浏览器中,调用
addRange(range)
将取消选择以前选择的范围并选择
range
,这意味着
removeAllRanges()
在那些浏览器中通常是多余的。嗯。。。我把重点放在了一般方面,但忘了提到:)谢谢。事实上,我错了:当调用
addRange()
并且已经选择了一个范围时,Chrome的最新版本似乎什么都做不了,这是对旧版本的更改,所以
removeAllRanges()
是必需的。@TimDown感谢您的专业知识是此范围和选择支持我在以前的问题中阅读了很多您的答案和提示