我有这个代码工作,我只想了解为什么我需要在开始时使用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
}
答案 0 :(得分:4)
是的,从window.getSelection()
检索到的选择不是像document.createRange()
创建的范围那样的空实例。注意这些方法名称的区别 - 一个创建新实例,另一个获取实例。
原因很简单 - 您可以拥有多个范围实例,每个实例包含不同的位置。但每个文档只有一个选择。
因此,在添加范围之前,通常必须删除当前选定的旧范围。当然,除非您想扩展当前选择。
更新:正如Tim正确指出的那样,只有Firefox支持多种选择范围。这意味着只有在Firefox上,您才能一次选择多个DOM - 例如您可以使用 CTRL 键选择表格列或添加更多选项。
因此,只有Firefox要求您在添加下一个之前执行removeAllRanges()
。其他浏览器会自动删除旧范围。