Range Select & Copy

Range可以用 Document 对象的 createRange方法创建,也可以用Selection对象的getRangeAt方法取得。另外,可以通过构造函数 Range() 来获得一个 Range。
setStart() 和 setEnd() 的参数如果是text节点、comment节点或者CDATASection,偏移就是指字符数,其他节点是指偏移节点个数。
selectNode(referenceNode);
鼠标拖选文本(坐标点->坐标点拖动选择之间的文本)没有包含在其中,这是浏览器的实现,只能通过鼠标事件模拟。

Selection对象一般由window.getSelection()或其他方法产生。
getRangeAt() 返回选区开始的节点
anchorNode 开始节点
focusNode 结束节点
addRange() 添加 Range 对象到选区
removeAllRange() 选区清零
selection.modify('extend', 'forward', 'lineboundary'); 添加一行
deleteFromDocument() 从页面中删除选区内容
containsNode() 判断当前选区是否包含节点

只有 Firefox 支持不连续选择,所以其他浏览器添加第一个选区(默认有个为0的选区)之前要清除选区。
移动端产生 Selection 对象,但是不会出现复制等选项(需要主动选择才会出现)。copy event后设置。contextmenu event之后设置IOS safari可以用正常空input覆盖到Selection上面,用户长按就会触发复制的选项,而且还能正确选择文本(空input不会选择),此方法不能用在其他平台。

有了Selection对象(一些浏览器不需要)之后只有用户主动(event有是否机器产生的属性)产生了点击事件,就可以使用document.execCommand('copy')复制了,并会产生copy事件。Firefox android长按复制不会触发copy事件!!!