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