简介

selection是对当前激活选中区(即高亮文本)进行操作。

在非IE浏览器(Firefox、Safari、Chrome、Opera)下可以使用window.getSelection()获得selection对象,本文讲述的是标准的selection操作方法。文中绝大部分内容来自 https://developer.mozilla.org/en/DOM/Selection

术语

以下几个名词是英文文档中的几个名词。

anchor
选中区域的“起点”。
focus
选中区域的“结束点”。
range
是一种fragment(HTML片断),它包含了节点或文本节点的一部分。一般情况下,同一时刻页面中只可能有一个range,也有可能是多个range(使用Ctrl健进行多选,不过有的浏览器不允许,例如Chrome)。可以从selection中获得range对象,也可以使用document.createRange()方法获得。

属性

anchorNode
返回包含“起点”的节点。
anchorOffset
“起点”在anchorNode中的偏移量。
focusNode
返回包含“结束点”的节点。
focusOffset
“结束点”在focusNode中的偏移量。
isCollapsed
“起点”和“结束点”是否重合。
rangeCount
返回selection中包含的range对象的数目,一般存在一个range,Ctrl健配合使用可以有多个。

方法

getRangeAt(index)
从当前selection对象中获得一个range对象。
index:参考rangeCount属性。
返回:根据下标index返回相应的range对象。
collapse(parentNode, offset)
将开始点和结束点合并到指定节点(parentNode)的相应(offset)位置。
parentNode:焦点(插入符)将会在此节点内。
offset: 取值范围应当是[0, 1, 2, 3, parentNode.childNodes.length]。

  • 0:定位到第一个子节点前。
  • 1:第二个子节点前。
  • ……
  • childNodes.length-1:最后一个子节点前。
  • childNodes.length:最后一个子节点后。

Mozilla官方文档 中讲到取值为0和1,经测试不准确。文档中还有一句不是十分清楚“The document is not modified. If the content is focused and editable, the caret will blink there.”

extend(parentNode, offset)
将“结束点”移动到指定节点(parentNode)的指定位置(offset)。
“起点”不会移动,新的selection是从“起点”到“结束点”的区域,与方向无关(新的“结束点”可以在原“起点”的前面)。
parentNode:焦点将会在此节点内。
Offset:1,parentNode的最后;0,parentNode的最前。
modify(alter, direction, granularity)
改变焦点的位置,或扩展|缩小selection的大小
alter:改变的方式。”move”,用于移动焦点;”extend”,用于改变selection。
direction:移动的方向。可选值forward | backword或left | right
granularity:移动的单位或尺寸。可选值,character", "word", "sentence", "line", "paragraph", "lineboundary", "sentenceboundary", "paragraphboundary", or "documentboundary"。
Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1才会支持此函数, 官方文档:https://developer.mozilla.org/en/DOM/Selection/modify
collapseToStart()
将“结束点”移动到,selction的“起点”,多个range时也是如此。
collapseToEnd()
将“起点”移动到,selction的“结束点”,多个range时也是如此。
selectAllChildren(parentNode)
将parentNode的所有后代节点(parentNode除外)变为selection,页面中原来的selection将被抛弃。
addRange(range)
将range添加到selection当中,所以一个selection中可以有多个range。
注意Chrome不允许同时存在多个range,它的处理方式和Firefox有些不同。
removeRange(range)
从当前selection移除range对象,返回值undefined。
Chrome目前没有改函数,即便是在Firefox中如果用自己创建(document.createRange())的range作为参数也会报错。
如果用oSelction.getRangeAt()取到的,则不会报错。
removeAllRanges()
移除selection中所有的range对象,执行后anchorNode、focusNode被设置为null,不存在任何被选中的内容。
toString()
返回selection的纯文本,不包含标签。
containsNode(aNode, aPartlyContained)
判断一个节点是否是selction的一部分。
aNode:要验证的节点。
aPartlyContained:true,只要aNode有一部分属于selection就返回true;false,aNode必须全部属于selection时才返回true。

document.activeElement

该属性属于HTML5中的一部分,它返回当前获得焦点的元素,如果不存在则返回“body”。一般情况下返回的是“文本域”或“文本框”。也有可能返回“下拉列表”、“按钮”、“单选”或“多选按钮”等等,Mac OS系统中可能不会返回非输入性元素(textbox,例如文本框、文本域)。

相关属性和方法:

selectionStart
输入性元素selection起点的位置,可读写。
selectionEnd
输入性元素selection结束点的位置,可读写。
setSelectionRange(start, end)
设置输入性元素selectionStart和selectionEnd值
  • 如果textbox没有selection时,selectionStart和selectionEnd相等,都是焦点的位置。
  • 在使用setSelectionRange()时
    如果end小于start,会讲selectionStart和selectionEnd都设置为end;
    如果start和end参数大于textbox内容的长度(textbox.value.length),start和end都会设置为value属性的长度。
  • 值得一提的是selectionStart和selectionEnd会记录元素最后一次selection的相关属性,意思就是当元素失去焦点后,使用selectionStart和selectionEnd仍能够获取到元素失去焦点时的值。这个特性可能会对制作“插入表情”时十分有用(将表情插入到元素最后一次焦点的位置)。
<textarea id="textbox">abc中国efg</textarea>
<script type="text/javascript">
window.onload = function(){
var textbox = document.getElementById('textbox');
textbox.setSelectionRange(5, 2);
console.log(textbox.selectionStart); // 2
console.log(textbox.selectionEnd); // 2
};
</script>
<textarea id="textbox">abc中国efg</textarea>
<script type="text/javascript">
window.onload = function(){
var textbox = document.getElementById('textbox');
textbox.setSelectionRange(9, 9);
console.log(textbox.selectionStart); // 8
console.log(textbox.selectionEnd); // 8
};
</script>

支护性:ie6\7\8不支持;Chrome、Firefox、Opera、Safari都支持。

参考文档:https://developer.mozilla.org/en/DOM/document.activeElement

document.designMode = 'on';

当document.designMode = 'on'时selection的方法、selectionStart、selectionEnd在Firefox和Opera中不可以使用,但Chrome和Safari可以。

w3c标准的selection对象介绍的更多相关文章

  1. w3c标准 dom对象 事件冒泡和事件捕获

    http://www.cnblogs.com/chengxs/p/6388779.html http://www.jb51.net/article/42492.htm W3C标准是什么? 1.表现(c ...

  2. 浏览器内核与BOM对象介绍

    BOM(Browser Object Model)对象介绍 我们都知道js有三部分组成,ECMAScript.DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其它浏览器也是风 ...

  3. W3C标准

    W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...

  4. 处理Selection对象和Range对象——Word VBA中重要的两个对象

    处理Selection对象和Range对象——Word VBA中重要的两个对象 Word 开发人员参考Selection 对象代表窗口或窗格中的当前所选内容.所选内容代表文档中选定(或突出显示)的区域 ...

  5. 前端基本知识(一):W3C标准&&冒泡事件,捕获事件,W3C DOM对象模型,对比分析

    W3C标准是万维网联盟, 其他的可以参考万维网版本的更新内容 一.W3C标准 二.W3C DOM事件 三.冒泡事件 四.捕获事件 一.W3C标准 其实网页是由三分部组成:1.结构(structure) ...

  6. 到底啥事w3c标准

    W3C标准                                                                                               ...

  7. 编辑器开发之 Selection 对象的学习

    上一篇,介绍了 range 对象的一些属性和方法,了解了一些基本操作,现在来介绍另外一个重要的对象:selection 对象: MDN 的解释是:Selection 对象表示用户选择的文本范围或插入符 ...

  8. js selection对象使用方法

    IE:document.selection FireFox:window.getSelection() document.selection只有IE支持,window.getSelection()也只 ...

  9. HTML5 Selection对象

    一.实例1,设置网页选中内容并且复制到黏贴板 <p id='txtone'>发的FDSAFSDFDS!其实不管哪个行业, <img src='http://beijing.gongj ...

随机推荐

  1. 拦截API 注入进程

    本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...

  2. LaTeX空格

    由于LaTeX 采用的是源文件编译方式,  默认LaTeX会忽略多余的空格, 如果需要产生一个空格,可以使用 命令 \, 注意代表的是空间键. 例如: Jones, et al.\  (1993), ...

  3. 《Pointers On C》读书笔记(第三章 数据)

    1.在C语言中,仅有4种基本数据类型:整型.浮点型.指针和聚合类型(如数组和结构等). 整型家族包括字符.短整型.整型和长整型,它们都分为有符号和无符号两种. 标准规定整型值相互之间大小的规则:长整型 ...

  4. Android Memory/Resource Leak总结

    Android的内存/资源泄露,不容易发现,又会引发app甚至是system的一系列问题. 在这里我根据以往碰到的相关问题,总结出了一些检测和修改方法. *有可能造成memory leak的代码是Fr ...

  5. oracle plsql 64位 32位连接未打开 无法解析各种错终极解决方案

    首先取消登陆,进入pl/sql界面-工具-首选项 其次就需要你设置环境变量(加一个ORACLE_HOME和修改原先path里的路径这个不修改也行,主要是让大家知道为什么设置环境变量) 这些设置好,你在 ...

  6. QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)

    如何使QTreeView快速显示1000万条数据,并且内存占用量少呢?这个问题困扰我很久,在网上找了好多相关资料,都没有找到合理的解决方案,今天在这里把我的解决方案提供给朋友们,供大家相互学习. 我开 ...

  7. DAL – RDBMS 的分区

    编辑人员注释:本文章由AzureCAT 云与企业工程组的高级项目经理Shaun Tinline-Jones 和Chris Clayton 共同撰写. "云服务基础"应用程序也称作& ...

  8. 51nod 1244 莫比乌斯函数之和(杜教筛)

    [题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...

  9. linux c in common use function reference manual

    End User License Agreement guarantees or warranties,大战前得磨刀!!!!! Tips:C Funcs Chk header Modules!

  10. Java图形化界面设计——中间容器(Jpanel)

    1.  将组件添加到JFrame中 方式之一: frame.getContentPane().add(childComponent) 用getContentPane()方法获得JFrame的内容面板, ...