为什么在选择开始时使用removeAllRAnges()?

时间:2013-06-05 06:48:26

标签: 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_position);
   sel.removeAllRanges();
   sel.addRange(range);//setting the caret position
} 

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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