`
yiminghe
  • 浏览: 1460390 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

range 标准化之获取

IE 
阅读更多

range 是用户选择区域的唯一表示方法,存在 w3c 的标准化 range ,以及 ie 特有的 textrange controlrange ,相对于 ie ,w3c 的概念更易于理解,首先简要介绍一下 w3c range.


w3c range


range 用来表示用户的选择区域,这块选择区域由两个边界位置界定,而位置则由其容器以及偏移量构成,称作 container 与 offset .如下是一个简单的位置示例:

 

<p><span>文字</span>^<span>文字</span></p>
 

其中 ^ 表示一个位置,则 container 为父节点 p,offset即为相对于父节点的偏移量为1。需要注意的是当container为元素节点时,其偏移量单元为节点,即从容器的第一个子节点到当前位置处所经历的子节点数。


相应的,container也可以是文字节点,这时container 为 textnode ,而offset则为从该textnode到当前位置所经历的 utf-16 字符个数(意味着,中文和英文计数一样,不是字节计数)。如

 

<p><span>文字</span><span>01234^567</span></p>

 

上例中 container 为 "01234567" 这个文字节点,而offset 则是从该文字节点第一个字符到当前位置所经历的字符个数即5.


ie range


简要介绍一下,具体请查阅 msdn


ie range 没有清晰的容器与偏移量的概念,但是基本思想和 w3c range 一样,具备同等的表达能力,分为 textrange 与 controlrange,包含一系列的方法。


textrange 不是从字面意义上的单纯文本,而是表示用户的选择区域内容(可用其htmlText获取完整内容),其操作方式大多是以文字为单元而不是 dom 树节点。


controlrange 字面意思表示获取选择 控件 ,实际是有些元素(div,img,object...)处于可编辑状态时,经单击可将整个元素选中。



ie 标准化之获取


从上面介绍可见,w3c 的range更规范,更清晰,其 container 与 offset 的概念更直观,当我们需要对range关联dom节点进行操作时,无疑 container ,offset是必不可少的,而 ie range 则没有显示的提供获取这两个关键变量的方法, 前面说过 ie range 其实具备 w3c range 等价的功能,那么就可以结合其提供的一系列方法推导出这两个变量。


范围对象获取:

 

范围对象有两种获取方式:


1.从当前选择区域获得 range ,可调用

 

document.selection.createRange()


方法根据目前选择,返回 TextRange 或 ControlRange 实例。


2.从元素创建 range ,可调用

 

oControlRange = object.createControlRange()
 
oTextRange = object.createTextRange()

 

前一种 之能在 body,element上调用,而后一种 可在大多数元素上调用。调用后则该范围完全覆盖调用元素。相当于 moveToElementText 。

 


textrange 标准化:


首先介绍下用到的几个方法:


collapse :根据参数将结束位置重合到开始位置(true)或开始位置重合到结束位置(false)。


parentElement :获取包围选择区域的元素节点,如下例调用后得到span节点。

 

<span>文^字</span>
 


moveToElementText (Node a) :将选择区域变更为 a ,起始位置为 a 的前后,如作用到如下 span 节点后:

 

^<span>文字</span>^

 

range1.compareEndPoints('XxToYy',range2) :xx,yy 可以为 Start 或 End,取 range1 的 xx 位置和 range2 的 yy 位置比较,根据前后顺序返回-1,1,0表示重合。


range1.setEndPoint("XxToYy",range2) :xx,yy 可以为 Start 或 End,将range1的xx位置设为range2的yy位置。


转化:


有了上面的5个方法就可以开始我们的标准化第一步:获取位置,首先给出操作例子:

 


(绿块表示文字节点,注意:正常手工编写页面情况下不会出现两个相邻的文字节点,这里使用 splitText 强制分离 )


当我们将选择区域collapse后,可能有上述四个位置:1,2,3,4,其中 1,4 相邻元素节点最简单:


1,4位置 标准化:


1.根据 parentElement 得到包含位置的节点 p ,即为该位置的container

2.对container的所有元素子节点,一一验证是否和已知位置相邻,验证方法即为:通过 moveToElementText 新建range包围子节点,再通过 compareEndPoints 比较是否新建 range 的前后位置是否和当前位置重合:

 

range = range.duplicate();
range.collapse(start);
var parent = range.parentElement(),
    siblings = parent.childNodes;
for (var i = 0; i < siblings.length; i++) {
    var child = siblings[i];
    if (child.nodeType == 1) {
        var tr = range.duplicate();
        tr.moveToElementText(child);
        //子元素节点开始位置比较 
        var comparisonStart = tr.compareEndPoints('StartToStart', range),
        //子元素节点结束位置比较 
        comparisonEnd = tr.compareEndPoints('EndToStart', range);
        //开头已经在当前位置后面,没必要继续比了
        if (comparisonStart > 0) break;
        else if (!comparisonStart || comparisonEnd == 1 && comparisonStart == -1) return {
            container: parent,
            offset: i
        };
        else if (!comparisonEnd) return {
            container: parent,
            offset: i + 1
        };
    }
}
 

 

 

2,3位置 标准化:


2 表示位置在两个文字节点之间,container为 p ,由于moveToElementText 无法作用文字节点,则只能另想他法。

3 表示位置处于文本节点中间,此时 container 为文本节点,而 offset 则要数字符数了。



1.当到达 1 位置时,停止。

2.新建range ra,开始位置为 1,结束位置为2或3,取得 ra的所有字符数 ra_textlength,对从位置1开始往右的每个文字节点,从 ra_textlength 中减去其长度(data.length),当 ra_textlength 为0时,代表当前位置为2,而当前经过的文字节点数目即为offset。

当 ra_textlength 为负数时,表示当前位置为3, 当前的文字节点即为位置3 的container,ra_textlength 的上一个值则是offset。



示例:

 

<p id="test"><strong>粗体</strong>普通|文字<i>斜体</i></p>
<script>
document.getElementById("test").childNodes[1].splitText(2);
</script>
 


标准化 demo

 

 

controlrange 标准化

 

controlrange 就很简单了,由 item(index) 方法得到选择元素,结合其parentNode 就可以得到标准化表示了。

 


PS : 关于输入框的范围读取


由于规范规定输入框的选择区域和页面选择区域是分离的,输入框的选择区域有不同的获取方式 (IE 基本相同)。

 

 

  • 大小: 21.7 KB
分享到:
评论
1 楼 ke495184001 2011-08-23  
学习了

相关推荐

    时间插件pickerDateRange

    总之,"pickerDateRange"是一个自定义修改过的日期范围选择插件,它简化了用户在网页上选取日期范围的过程,通过定制可以满足项目的个性化需求。了解和使用这个插件,不仅可以提升前端开发效率,还能为用户提供更...

    Range Coding 的 D 实现

    1. **初始化**:Range Coding 实现通常需要一个起始的全范围(通常是 0 到 2^32 - 1)和一个累积概率分布表。在 D 语言中,这可以通过结构体或类来实现,其中包含相应的变量和初始化方法。 2. **编码过程**:编码时...

    Jquery多种方式贴近用户体验的日期选择时间插件pickerDateRange.zip

    6. **多语言支持**:为了适应全球化,"pickerDateRange"应该提供多语言包,方便开发者根据网站的用户群体切换不同的语言环境。 7. **响应式设计**:考虑到现代网站需要在各种设备上运行,插件应该具有良好的响应性...

    Advanced_High_Dynamic_Range_Imaging_Second_Edition.pdf

    2. **曝光融合算法**:介绍多种用于将不同曝光的照片合并为单一HDR图像的方法,如基于直方图均衡化的算法、基于像素权重的算法等。 3. **tone mapping**:这是将HDR图像转换为可显示的LDR图像的过程,书中详述了...

    scsi.rar_range

    SCSI(Small Computer System Interface,小型计算机系统接口)是一种广泛应用于计算机硬件系统的接口标准,用于连接硬盘、光驱、磁带驱动器等存储设备。在"scsi.rar_range"这个主题中,我们主要关注的是SCSI接口在...

    智能网联汽车标准化简讯.zip

    标准化的V2X协议如DSRC( Dedicated Short Range Communications)和C-V2X(Cellular Vehicle-to-Everything)确保了不同制造商设备间的兼容性和互操作性。 其次,数据安全与隐私保护也是标准化的重要内容。智能...

    Range_v2.2 - MetaTrader 4脚本.zip

    在`Range_v2.2`中,"Range"通常指的是高低点之间的差值,也就是一段时间内的最高价与最低价之差。此脚本可能包括以下功能: 1. **计算价格区间**:脚本可能会计算每个时段(如日、小时或分钟)的价格区间,并在图表...

    python获取图片颜色信息的方法

    因此,在进行精确的颜色处理和分析时,需要考虑这种设备依赖性,并采取适当的方法来校准和标准化颜色数据。 总结来说,使用Python和Pillow库获取图片颜色信息是一个简单的过程,只要正确安装并导入了Pillow库,就...

    获取硬盘ID信息及网卡MAC地址的代码 .rar_MAC 硬盘_MAC地址_硬盘id_获取mac地址_获取网卡MAC

    这段代码通过`uuid.getnode()`获取一个基于MAC地址的数字,然后转换为标准的冒号分隔的十六进制格式。 当然,上述方法适用于Windows环境。在Linux或Unix系统中,获取硬盘ID和MAC地址的方法略有不同。例如,可以使用...

    XMA_Range_Bands_HTF - MetaTrader 5脚本.zip

    XMA_Range_Bands_HTF的创新之处在于其"HTF",这代表"Higher Time Frame"(高时间帧)。这意味着指标可以从更高时间帧(如4小时、日线或周线)获取数据,即使当前图表显示的是低时间帧(如分钟图)。这样,交易者可以...

    react-range-slider:React范围滑块

    使用这个库时,开发者可以轻松地通过props传递配置项,定制滑块的颜色、样式、步长、最小值、最大值、默认值以及回调函数等,以满足项目的个性化需求。 例如,你可以设置`min`和`max`属性来定义滑块的可选范围,`...

    ISO 15739 动态范围测试标准

    ISO 15739标准是由国际标准化组织(ISO)制定的一项关于数字静态相机动态范围测试的标准。动态范围是指相机在单次曝光中能够捕获的最大亮度与最小亮度之间的比率。在摄影技术的视角下,我们通常希望在同一场景中同时...

    unicode-range-interchange:对Web字体的Unicode范围进行数学运算

    在JavaScript中处理`unicode-range`,首先需要理解Unicode编码的基本概念,Unicode是国际化的字符编码标准,每个字符都有一个唯一的16位或32位数字标识。在JavaScript中,可以使用`String.fromCharCode()`和`...

    daterangepicker:JavaScript日期范围,日期和时间选择器组件

    日期范围选择器 该日期范围选择器组件创建一个下拉菜单,用户可以从中选择日期范围。 我是在构建UI时创建的,它需要一种方法来选择报告的日期范围。... 无论是由于软件,使用或其他方式产生的,与之有关或与之有

    JESD402-1A 2022 TEMPERATURE RANGE AND MEASUREMENTS FOR COMPONENT

    JEDEC(Joint Electron Device Engineering Council)是全球电子组件和系统工程的领先标准化组织。它的标准和出版物旨在消除制造商和购买者之间的误解,促进产品的互换性和改进,并帮助购买者能够迅速准确地选择合适...

    (整理)通信在智能交通中的应用及标准化.ppt

    【通信在智能交通中的应用及标准化】 智能交通系统(Intelligent Transportation System,简称ITS)是现代信息技术在交通运输领域的集成应用,旨在提升交通管理效率、优化交通流、保障交通安全。通信技术是ITS的...

    Excel-VBA实用技巧范例-获取Excel系统信息.zip

    2. **对象模型**:Excel VBA使用一个层次结构的对象模型,其中包含了Workbook、Worksheet、Range、Chart等对象,它们代表了Excel的各种元素。通过这些对象,你可以访问和修改Excel的数据和属性。 3. **获取系统信息...

    Python3获取电脑IP、主机名、Mac地址的方法示例

    5. **获取MAC地址**:利用UUID模块中的`uuid.getnode()`函数来获取MAC地址的整数值表示,再进行格式化处理得到标准的MAC地址表示形式。 #### 详细实现 首先,我们需要导入必要的模块: ```python import socket ...

Global site tag (gtag.js) - Google Analytics