web-selection
js操作光标
textarea 或者 input的情况
function getCursorPosition (ctrl) {//获取光标位置函数
var pos = 0; // IE Support
if (document.selection) {
ctrl.focus ();
var Sel = document.selection.createRange ();
Sel.moveStart ('character', -ctrl.value.length);
pos = Sel.text.length;
}
// Firefox support
else if (selectionStart in ctrl)
pos = ctrl.selectionStart;
return (pos);
}
function setCursorPosition(ctrl, pos){//设置光标位置函数
if (ctrl.setSelectionRange) {
ctrl.focus();
ctrl.setSelectionRange(pos,pos);
}
else if (ctrl.createTextRange) {
var range = ctrl.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
div+contenteditable 的情况(其实就是和不能输入的普通节点的情况是一样的)
var sel = window.getSelection()
// 获取全部range
var ranges = []
for(var i = 0; i < sel.rangeCount; i++) {
ranges[i] = sel.getRangeAt(i);
}
// 获取第一个range,一般也只有一个
var range = sel.getRangeAt(0)
range的属性:
startContainer: Node # 开始位置所在节点
startOffset: number # 开始位置在所在节点的偏移
endContainer: Node # 结束位置在所在节点的偏移
endOffset: number # 结束位置在所在节点的偏移
需要注意的是这里的节点是Node而不是Element, 区别请看:
http://www.cnblogs.com/jscode/archive/2012/09/04/2670819.html
https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType?redirectlocale=en-US&redirectslug=nodeType
简单讲Element就是我们平时所看到的标签节点,它是Node的子集,Node还包括
Constant | Value | Description |
---|---|---|
Node.ELEMENT_NODE | 1 | 一个dom节点如 c or <div>. |
Node.TEXT_NODE | 3 | 文本节点 |
Node.PROCESSING_INSTRUCTION_NODE | 7 | Axml文档解析指示节点 如 <?xml-stylesheet … ?> . |
Node.COMMENT_NODE | 8 | 注释节点,如<!– 我是注释~~ –>. |
Node.DOCUMENT_NODE | 9 | document节点, <html>. |
Node.DOCUMENT_TYPE_NODE | 10 | DocumentType 节点,如 HTML5 文档的 <!DOCTYPE html>. |
Node.DOCUMENT_FRAGMENT_NODE | 11 | DocumentFragment 节点. |
Author: Zack
Link: https://zaaack.github.io/2016/08/20/js/web-selection/
License: 知识共享署名-非商业性使用 4.0 国际许可协议