Notes: DOM Range

通过DOM范围可以选择文档中的某个区域,而不需考虑节点的界限,例如文本高亮的处理就可以使用范围来实现。

1、Range的创建

使用document的createRange来创建一个范围,该方法返回一个Range实例,该实例有很多属性和方法,如下所示:

startContainer:包含范围起点的节点

startOffset:范围起点在startContainer中的偏移量,既节点索引

endContainer:包含范围终点的节点

endOffset:范围终点在endContainer的偏移量,节点索引+1

检测浏览器是否支持范围

document.implementation.hasFeature(‘Range‘,‘2.0‘)  OR
typeof document.createRange === ‘function‘

创建范围

var range = document.createRange();//由于IE8及以下浏览器不支持DOM Range,但是支持文本范围(document.body.createTextRange)var range = document.body.createTextRange();

2、Range的实例方法

假设有一个HTML文档如下所示

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="outer" id="outer">
    <div class="inner" id="inner1">hello world!</div>
    <div class="inner" id="inner2"><span>你好吗</span></div>
  </div>
</body>
</html>

选择文档的一部分,可以使用selectNode或者selectNodeContents方法,如下所示

var range = document.createRange();
range.selectNode(inner1);
console.log(range.startOffset);//1  因为空格被当作一个文本节点
---------------------------------------------------
var range = document.createRange();
range.selectNodeContents(outer);
console.log(range.endOffset);//5 
//IE8以下
var range = document.body.createTextRange();
range.findText("hello");
console.log(range.text);//hello

range.moveToElementText(inner1);
console.log(range.htmlText);

也可以使用setStartBefore、setStartAfter、setEndBefore、setEndAfter等方法来选择文档范围

var range = document.createRange();
range.setStartBefore(inner1);
range.setEndBefore(inner2);
console.log(range.endOffset);//3

还可以使用setStart和setEnd来选择,这两个函数均需要两个参数,一个参照节点,一个偏移量,对于setStart来说,参照节点便是startContainer,而setEnd的参照节点是endContainer

var range = document.createRange();
range.setStart(inner1,0);
range.setEnd(inner1,inner1.childNodes.length);
console.log(range.endOffset);//1
//IE8以下
range.moveStart("word", 2); //起点移动2 个单词
range.moveEnd("character", 1); //终点移动1 个字符
-----------------------------------------
"character":逐个字符地移动。
"word":逐个单词(一系列非空格字符)地移动。
"sentence":逐个句子(一系列以句号、问号或叹号结尾的字符)地移动。
"textedit":移动到当前范围选区的开始或结束位置。

操作选区中内容

1、从文档中删除选区的内容deleteContents和extractContents,他们的区别就是后者会返回删除的文档片段,如下所示

var range = document.createRange();
range.setStart(inner1.firstChild,0);
range.setEnd(inner1.firstChild,5);
//range.deleteContents();
var fragment = range.extractContents();
box.appendChild(fragment);

2、复制选区内容cloneContents,复制出来的只是范围中节点的副本,不是真实的节点

var range = document.createRange();
range.setStart(outer,0);
range.setEnd(outer,outer.childNodes.length);
var fragment = range.cloneContents();
box.appendChild(fragment);

3、向范围中插入内容insertNode或者surroundContents

var range = document.createRange();
range.selectNodeContents(outer);
var span = document.createElement(‘span‘);
span.innerText = "我知道了";
range.insertNode(span);//会在范围的开始处插入指定节点
------------------------------------------------------------------
var range = document.createRange();
range.setStart(inner1.firstChild,0);
range.setEnd(inner1.firstChild,5);
var span = document.createElement(‘span‘);
span.className = "red";
range.surroundContents(span);
//ie8以下
var range = document.body.createTextRange();
range.findText("Hello");
range.text = "Howdy";
-------------------------------------
range.pasteHTML("<em>Howdy</em>");//类似与range.surroundContents

4、复制Range和清理Range

复制range,使用cloneRange方法,该方法复制出来的是指定范围的副本;使用detach方法把范围从文档中分离,然后解除范围的引用

var range = document.createRange();
range.setStart(inner1.firstChild,0);
range.setEnd(inner1.firstChild,5);
var rangeBak = range.cloneRange();
var fragment = rangeBak.extractContents();
box.appendChild(fragment);
range.detach();
range = null;
时间: 2025-02-01 12:01:20

Notes: DOM Range的相关文章

JS 之DOM range对象

DOM范围 DOM中的range对象是DOM2中新定义的接口.通过这个对象可以选择文档中的某个区域,而不必考虑节点的界限. 创建范围 document.createRange()创建一个范围,这个范围是range类型的实例.包含下面这些属性和方法. startContainer:包含范围起点的节点(选区中第一个节点的父节点). startOffset:范围在startContainer中起点的偏移量. endContainer:包含范围终点的节点(选区中最后一个节点的父节点). endOffse

Document Object Model (DOM) Level 3 Events Specification

Document Object Model (DOM) Level 3 Events Specification W3C Working Draft 25 September 2014 This version: http://www.w3.org/TR/2014/WD-DOM-Level-3-Events-20140925/ Latest published version: http://www.w3.org/TR/DOM-Level-3-Events/ Latest editor's dr

Ckeditor 的加载顺序

我们的只用在文件里面引用一个CKEditor的js文件--CKEditor目录下的ckeditor.js文件, 该文件会完成后续的所有的CKEidtor依赖的js文件的加载. 所依赖的js文件加载顺序如下 <script src="/Scripts/CKEditor/CKEditor.js"></script> <script src="http://localhost:9673/Scripts/CKEditor/core/loader.js&q

百度UEditor基本使用

1 首先奉上链接其http://ueditor.baidu.com/website/index.html 更多更详细内容在其官方api上,本文只是一个归类总结性文章. 2 下载链接http://ueditor.baidu.com/website/download.html  本人是.net开发人员就直接下载了最新的.net版本,可以直接把下载好的代码直接放到项目中(需要注意的是,它里面有后代ashx代码,需要添加其中bin目录下的Json.net). 3 看demo.html 首先导入导入三个配

基于DevTools协议+Chromium headless的客户端爬虫框架

之前的做法是使用PhantomJS以及一个html+嵌套iframe包含目标网站URL+跨域dom操作的简单性能优化. PhantomJS实现下面的核心需求: (1)无头模式,然而PhantomJS内核基于老版本的QtWebKit,与最新版本的Chromium代码相比,版本太老了,很多特性用不了(虽然目前国内网站应该也还没开始用上这些?比如ServiceWorker.CSS Custom Properties.Web Components等等) (2)可以等待PhantomJS将页面load完成

笨方法学Python,Lesson 32 - Lesson 34

Exercise 32 代码 the_count = [1, 2, 3, 4, 5] fruits = ['apples', 'oranges', 'pears', 'apricots'] change = [1, 'pennies', 2, 'dimes', 3, 'quarters'] # this first kind of for-loop goes through a list for number in the_count:     print "This is count %d&q

兼容浏览器的insertAdjacentHTML

添加HTML内容与文本内容以前用的是innerHTML与innerText方法, 最近发现还有insertAdjacentHTML和 insertAdjacentText方法, 这两个方法更灵活,可以在指定的地方插入html内容和文本内容. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 参数资料: msdn.microsoft.com/en-us/library/ms536452(

jQuery源码学习笔记五 六 七 八 转

jQuery源码学习笔记五 六 七 八 转 Js代码   <p>在正式深入jQuery的核心功能选择器之前,还有一些方法,基本都是数组方法,用于遴选更具体的需求,如获得某个元素的所有祖选元素啦,等等.接着是其缓存机制data.</p> <pre class="brush:javascript;gutter:false;toolbar:false"> //@author  司徒正美|なさみ|cheng http://www.cnblogs.com/ru

input 文本框禁止输入表情

js在用户输入表情时自动过滤掉 <input type="text" id="input" maxlength="10"/> var noEmoji = function(dom) { var html = $(dom).val(), oldHtml = ""; oldHtml = html; var reg = /[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\u