HTML5 编辑 API 之 Range 对象

HTML5 编辑 API 之 Range 对象

Range对象基本概念

Range对象基本概率

一个Range对象代表页面上一段连续区域。
通过Range对象,可以获取或修改网页上的任何区域。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>range对象</title>
    </head>
    <body>
        <script>
            function rangeTest(){
                var html;
                showRangeDiv = document.getElementById("showRange");
                Selection = document.getSelection();
                if(Selection.rangeCount>0){
                    html = "你选取了" +selection.rangeCount+"内容<br/>";
                    for(var i=0;i<selection.rangeCount;i++){
                        var range = selection.getRangeAt(i);
                        html+="第"+(i+1)+"段内容为:"+range+"<br/>";
                    }
                    showRangeDiv.innerHTML = html;
                }
            }
        </script>
        selection 对象与range对象的使用
        <input type="button" value="点击我" onclick="rangeTest()" />
        <div id="showRange"></div>

    </body>
</html>

Range方法之SelectNode方法

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>range selectNode方法</title>
    </head>
    <body>
        <script>
            function deleteRangeContent(onlyContent){
                var div = document.getElementById("div");
                var rangeObj = document.createRange();
                if(onlyContent){
                    rangeObj.selectNodeContents(div);
                    rangeObj.deleteContents();
                }else{
                    rangeObj.selectNode(div);
                    rangeObj.deleteContents();
                }
            }
        </script>
        <div id="div" style="background-color: #e0a0b0;width: 300px;height: 50px;">
            元素中的内容
        </div>
        <button onclick="deleteRangeContent(true)">删除内容</button>
        <button onclick="deleteRangeContent(false)">删除元素</button>
    </body>
</html>

这里写图片描述
选择删除内容这会删除掉“元素中的内容”这几个字
选择删除元素就会删除掉整个红色的地板和文字。

setStart、setEnd方法

通过setStart和setEnd来确定Range对象的内容。再将其进行删除等操作。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>range setStart、setEnd</title>
    </head>
    <body>
        <script>
            function deleteChar(){
                var div = document.getElementById("myDiv");
                var textNode = div.firstChild;
                var rangeObj = document.createRange();
                rangeObj.setStart(textNode,1);
                rangeObj.setEnd(textNode,4);
                rangeObj.deleteContents();
            }
        </script>
        <div id="myDiv" style="color: red;">
            这段字是用来删除的
        </div>
        <button onclick="deleteChar()">删除文字</button>
    </body>
</html>

这里写图片描述
点击“删除文字”之后,“这段字”就会被删除掉。

setStartBefore、setEndAfter等方法

setStartBefore(row)Range对象在row之前开始,
setEndAfter(row)Range对象在row之后结束。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>setStartBefore\setEndAfter</title>
    </head>
    <body>
        <script>
            function deleteRow(){
                var table = document.getElementById("mytable");
                if(table.rows.length>0){
                    var row = table.rows[0];
                    var rangeObj = document.createRange();
                    rangeObj.setStartBefore(row);
                    rangeObj.setEndAfter(row);
                    rangeObj.deleteContents();
                }
            }
        </script>
        <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>
    </body>
</html>

这里写图片描述
点击“删除第一行”之后,第一行的内容1和内容2 被删除掉。

cloneRange、cloneContents、extractContents方法

cloneRange方法

通过cloneRange()方法,把原有的p标签中的内容Range对象克隆过来,并通过alert()把克隆对象显示出来。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>cloneRange</title>
    </head>
    <body>
        <script>
            function cloneRange(){
                var rangeObj = document.createRange();
                rangeObj.selectNodeContents(document.getElementById("p"));
                var rangeClone = rangeObj.cloneRange();
                alert(rangeClone.toString());
            }
        </script>
        <p id="p">这是测试内容</p>
        <button onclick="cloneRange()">克隆</button>
    </body>
</html>

这里写图片描述

cloneContents方法介绍

var docFrangMent = rangeObj.cloneContents()将原Range对象的所有内容拷贝出来,再通过div.appendChild(docFrangMent);将拷贝的内容添加到div模块中。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>cloneContents</title>
    </head>
    <body>
        <script>
            function cloneContent(){
                var div = document.getElementById("div");
                var rangeObj = document.createRange();
                rangeObj.selectNodeContents(div);
                var docFrangMent = rangeObj.cloneContents();
                div.appendChild(docFrangMent);
            }
        </script>
        <div id="div">
            你好么?
            <br />
            <button onclick="cloneContent()">克隆</button>
            <br />
        </div>
    </body>
</html>

这里写图片描述

点击“克隆”之后,会将div中的内容复制一份。并且div中的内容得到了改变。

extractContents方法

通过var docFragment = rangeObj.extractContents() 实现内容的剪切。通过distDiv.appendChild(docFragment)实现内容的粘贴。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>extractContents方法</title>
    </head>
    <body>
        <script>
            function moveContent(){
                var srcDiv = document.getElementById("srcDiv");
                var distDiv = document.getElementById("distDiv");
                var rangeObj = document.createRange();
                rangeObj.selectNodeContents(srcDiv); //range代表srcDiv的内容
                var docFragment = rangeObj.extractContents();  //range像是指针对象,会修改原变量
                distDiv.appendChild(docFragment);
            }
        </script>
        <div id="srcDiv" style="background-color: aqua;width: 300px;height: 50px;">测试内容</div>
        <div id="distDiv" style="background-color:bbisque;width: 300px;height: 50px;"></div>
        <button onclick="moveContent()">移动元素</button>
    </body>
</html>

这里写图片描述
点击“移动元素”之后,“测试内容”四个字从蓝底模块移动到了白底模块。

insertNode方法、compareBoundaryPoints方法

insertNode方法

通过点击,随意移动按钮
var range = selection.getRangeAt(0)找到位置?
range.insertNode(btn)插入按键

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>insertNode</title>
    </head>
    <body>
        <script>
            function moveButton(){
                var btn = document.getElementById("button");
                var selection = document.getSelection(); 
//              get到的这个selection指的是什么,鼠标选择到的内容?
                if(selection.rangeCount>0){
//                  选择内容不为空
                    var range = selection.getRangeAt(0); //传0 是什么意思?
                    range.insertNode(btn); //指定插入内容为btn
                }
            }
        </script>
        <div onmouseup="moveButton()" style="width: 400px;background-color: bisque;">
            这是测试的内容,只是测试而已。
        </div> 
        <!--onmouseup 事件会在鼠标松开时发生-->
        <button id="button">按钮</button>
    </body>
</html>

这里写图片描述
点哪儿,按键就会移动到哪儿。

compareBoundaryPoints方法

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>compareBoundaryPoints</title>
    </head>
    <body>
        <script>
            function testPlace(){
                var boldText = document.getElementById("boldText");
                var boldRange = document.createRange();
                boldRange.selectNodeContents(boldText.firstChild);
//              这个range对象代表的是boldText.的firstChild
                var selection = document.getSelection();
                if(selection.getRangeCount>0){ 
                    var selRange = selection.getRangeAt(0);  //第一个选择对象
                    if(selRange.compareBoundaryPoints(Range.START_TO_END,boldRange)<=0){
                        alert("选取的文字在粗体前面");
                    }else if(selRang.compareBoundaryPoints(Range.END_TO_START,boldRange)>=0){
                        alert("选取的文字在粗体后面");
                    }
                }
            }
        </script>
        这是一段文字,一段用来<b id="boldText">测试</b>的文字。
        <br />
        <button onclick="testPlace() ">位置比较 </button>
    </body>
</html>

这里写图片描述

collapse、detach方法

rangeObj.collapse(false)显示取消选中的内容

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>collapse</title>
    </head>
    <body>
        <script>
            var rangeObj = document.createRange();
            function selectRangContents(){
                var div = document.getElementById("div");
                rangeObj.selectNode(div);
            }
            function nuselect(){
                rangeObj.collapse(false);
            }
            function showRange(){
                alert(rangeObj.toString());
            }
        </script>
        <div id="div" style="background-color:bisque;width: 300px;height: 50px;">元素的内容</div>
        <button onclick="selectRangContents()">选择元素</button>
        <button onclick="nuselect()">取消元素</button>
        <button onclick="showRange()">显示range内容</button>
    </body>
</html>

这里写图片描述
点击“选择元素”-“显示range内容”则显示如上。
点击“选择元素”-“取消选择”-“显示range内容”则显示如下。
这里写图片描述

本博客内容到此结束,欢迎交流讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Summer tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值