前言:
这节课主要学习HTML5中关于Range对象的常用API。
1.Range对象初识
作用:一个Range对象代表页面上的一段连续区域。通过Range对象,可以获取或修改网页上的任何区域。
Rnage对象示例:
<body>
Range对象初识</br>
<input id="btn" type="button" value="提交">
<div id="showRange"></div>
<script>
function $(ele) {
return document.getElementById(ele)
}
var btn = $('btn')
var showRange = $('showRange')
var html;
btn.onclick = function (){
// 通过getSelection()方法,获取selection对象
var selection = document.getSelection()
// 通过rangeCount属性,获取选中内容的个数
var count = selection.rangeCount
html = '你选中了' + count + '段内容.'
if (count > 0) {
for (var i = 0; i < count; i++){
// 通过getRangeAt()方法,获取具体range对象
var range = selection.getRangeAt(i)
html += '第' + (i+1) + '段内容为:' + range + '</br>'
}
}
showRange.innerHTML = html
}
</script>
</body>
2.Range对象的selectNode/selectNodeContents/deleteContents方法
方法:
selectNode(node) -- 获取指定节点
selectNodeContents(node) -- 获取指定节点内容
deleteContents --- 删除range选中的节点(或内容)
Rnage方法示例:
<body>
<div id="testRange" class="range" style="background-color:pink; width: 50%; height: 40px">
测试Range对象的selectNode、selectNodeContents、deleteContents方法
</div>
<button id="btn1" onclick="deleteContents(false)">删除内容</button>
<button id="btn2" onclick="deleteContents(true)">删除元素</button>
<script>
function deleteContents (flag) {
var testRange = document.getElementById('testRange')
// 创建range对象
var range = document.createRange()
if (flag){
// 获取当前的元素节点
range.selectNode(testRange)
//删除range选中的内容
range.deleteContents()
} else {
// 获取当前节点的内容
range.selectNodeContents(testRange)
//删除range选中的内容
range.deleteContents()
}
}
</script>
</body>
3.Range对象的set相关方法
方法:
setStart(node, index) -- 设置Range对象的起点位置
setEnd(node, index) -- 设置Range对象的结束位置
理解:start/end分别表示Range的起点和终点
Before/After分别表示节点的起点和终点
setStartBefore -- 将节点的起点位置设置为Range对象的起点位置
setStartAfter -- 将节点的终点位置设置为Range对象的起点位置
setEndBefore -- 将节点的起点位置设置为Range对象的终点位置
setEndAfter -- 将节点的终点位置设置为Range对象的终点位置
Rnage方法setStart和setEnd示例:
<body>
<div id="testRange" class="range" style="background-color:pink; width: 50%; height: 40px">
测试Range对象的set相关方法
</div>
<button id="btn1" onclick="deleteChar()">删除</button>
<script>
function deleteChar () {
var testRange = document.getElementById('testRange')
var textContent = testRange.firstChild
// 创建range对象
var range = document.createRange()
//设置Range对象的起始位置
range.setStart(textContent, 1)
//设置Range对象的结束位置
range.setEnd(textContent, 4)
//删除Range对象选中的内容
range.deleteContents()
}
</script>
</body>
Rnage对象的方法setStartBefore/After和setEndBefore/After示例:
<body>
<table id="myTable" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>内容1</td>
<td>内容2</td>
</tr>
<tr>
<td>内容3</td>
<td>内容4</td>
</tr>
</table>
<button onclick="deleteRow()">删除第一行</button>
<script>
function deleteRow() {
var table = document.getElementById('myTable')
if (table.rows.length > 0){
//获取table中的第一行
var row = table.rows[0]
//创建range对象
var range = document.createRange()
//设置range的起点
range.setStartBefore(row)
//设置range的终点
range.setEndAfter(row)
range.deleteContents()
}
}
</script>
</body>
4.Range对象cloneRange/cloneContents/extractContents的方法
方法:
cloneRange() -- 克隆Range对象
cloneContents -- 克隆Range对象选中的内容(contents)
extractContents --- 剪切Range对象选中的内容。
Rnage方法示例:
<body>
<div id="test" style="background-color:pink; width: 50%; height: 28px;">测试Range对象的cloneRange/cloneContents/extractContents方法</div>
<div id="test1" style="background-color:yellow; width: 50%; height: 28px;"></div>
<button onclick="cloneRange()">cloneRange</button>
<button onclick="cloneContents()">cloneContents</button>
<button onclick="extractContents()">extractContents</button>
<script>
// cloneRange()方法的演示
function cloneRange() {
var div = document.getElementById('test')
// 创建range对象
var range = document.createRange()
// 获取指定节点的内容
range.selectNodeContents(div)
// 克隆对应的Range对象
var cloneRange = range.cloneRange()
console.log(cloneRange.toString())
}
// cloneContents()方法的演示
function cloneContents() {
var div = document.getElementById('test')
// 创建range对象
var range = document.createRange()
// 获取指定节点的内容
range.selectNodeContents(div)
// 克隆Range对象中选中节点的内容(此处的内容就是div元素)
var cloneContents = range.cloneContents()
div.appendChild(cloneContents)
}
// extractContents()方法的演示
function extractContents() {
var div = document.getElementById('test')
var div1 = document.getElementById('test1')
// 创建range对象
var range = document.createRange()
// 获取指定节点的内容
range.selectNodeContents(div)
// 克隆对应的节点
var extractContents = range.extractContents()
div1.appendChild(extractContents)
}
</script>
</body>
5.Range对象collapse/detach的方法
方法:
collapse -- 设置range对象对元素的选择状态
detach --- 释放range对象(不再需要的时候)
Rnage方法示例:
<body>
<div id="div" style="background-color: pink; width: 300px; height: 50px">测试Range的选中取消功能</div>
<button onclick="select()">选择元素</button>
<button onclick="unselect()">取消选择</button>
<button onclick="showContents()">显示选中内容</button>
<script>
var range = document.createRange()
function select () {
var div = document.getElementById('div')
range.selectNode(div)
// 释放掉创建的range对象(不再需要的时候)
// range.detach()
}
function unselect () {
var div = document.getElementById('div')
// 取消range选中的内容
range.collapse(false)
}
function showContents () {
console.log(range.toString())
}
</script>
</body>
6.Range对象insertNode/compareBoundaryPoints的方法
方法:
insertNode(node) -- 将参数中的节点移动到range对象的起始位置处
compareBoundaryPoints --- 比较两个Range对象的相对位置
Rnage方法示例:
<body>
<div id="div" style="background-color: pink; width: 300px; height: 50px">测试Range的<b id="boldText">选中</b>取消功能</div>
<button onclick="insert()" id="btn">insert</button>
<button onclick="compareBoundary()" id="btn">compare</button>
<script>
// 移动元素位置方法
function insert() {
var btn = document.getElementById('btn')
var selection = document.getSelection()
var range = selection.getRangeAt(0)
// 将btn按钮重新移动到鼠标选中的地方
range.insertNode(btn)
}
// 判断range起/终点位置方法
function compareBoundary() {
var boldText = document.getElementById('boldText')
var range = document.createRange()
range.selectNodeContents(boldText.firstChild)
var selection = document.getSelection()
var range1 = selection.getRangeAt(0)
if (range1.compareBoundaryPoints(Range.START_TO_END, range) <= 0) {
console.log("选取的文字在粗体前面")
} else if (range1.compareBoundaryPoints(Range.END_TO_START, range) >= 0){
console.log("选取的文字在粗体后面")
}
}
</script>
</body>