js中的Range

删除文本

<div id="div">这里是第一段文字</div>
<button onclick="del()">删除</button>
<script>
    function del() {
        var div = document.getElementById("div");
        var content = div.firstChild;
        if (content.nodeType == 3) {//node节点类型必须是text
            var range = document.createRange();
            range.setStart(content, 1);
            range.setEnd(content, 7);
            range.deleteContents();
        }
    }
</script>

                        

选择文本

<div id="div">这里是第一段文字</div>
<button onclick="sel()">选择</button>
<script>
    function sel() {
        var div = document.getElementById("div");
        var content = div.firstChild;
        if (content.nodeType == 3) {//node节点类型必须是text
            var range = document.createRange();
            range.setStart(content, 1);
            range.setEnd(content, 7);
            //range.deleteContents();//删除
            var sel = window.getSelection();
            sel.addRange(range);
        }
    }
</script>

                 

设置光标位置(IE浏览器)

节点类型为 input 或者 textarea

<input type="text" id="text1" value="1234567890">
<select onchange="setPos(this.selectedIndex)">
    <option value="0">0</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
</select>
<script language="javascript">
    function setPos(num) {
        var range = document.getElementById("text1").createTextRange();//CreateTextRange是 Microsoft IE特定功能
        range.moveStart('character', num);
        range.collapse(true);
        range.select();
    }
</script>

设置光标位置、选择指定文本

节点类型为 input 或者 textarea

<input type="text" id="test" value="1234567890">
<button onclick="caret(3,5)">光标</button>
<br>
<br>
<script>
    function caret(begin, end) {
        var node = document.getElementById("test");
        if (!node) return;
        if (node.setSelectionRange) { //现代浏览器
            node.focus();
            node.setSelectionRange(begin, end);
        } else if (node.createTextRange) { //IE678
            var range = node.createTextRange();
            range.collapse(true);
            range.moveEnd('character', end);
            range.moveStart('character', begin);
            range.select();
        }
    }
</script>

 Range是一个抽象的接口,具有起始位置和结束位置。如果起始位置等于结束位置,则形成光标
其中Range.collapse(bool)就是让起始位置和结束位置重合,bool=true(默认值),在起始位置重合;bool=false,在结束位置重合。
Range.select()就是选择文本。

              

js获取光标位置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="https://cdn.staticfile.org/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
<div id="div">你好啊123456789</div>
<script>
    var range = document.createRange();
    //监听鼠标移动
    //整个页面使用document
    //'.btn-wrap,.mod-titlt,.top-wrap'
    $('#div').mousemove(function (event) {
        //2.计算坐标
        var event = event || window.event;
        var x = event.clientX;
        var y = event.clientY;
        var oPoint = document.elementFromPoint(x, y);

        let textContent = oPoint.textContent;
        var content = $('#div')[0].firstChild;
        //var range = document.createRange();
        var sel = window.getSelection();
        for (let i = 0; i < textContent.length; i++) {
            range.setStart(content, i);
            range.setEnd(content, i);
            sel.addRange(range);
            console.log(event.clientX)
            let selectionCoords = getSelectionCoords();
            if (selectionCoords >= x) {
                range.setStart(content, i);
                range.setEnd(content, i + 1);
                sel.addRange(range);
                console.log(i)
                break;
            }
        }

    });

    function getSelectionCoords(win) {
        win = win || window;
        var doc = win.document;
        var sel = doc.selection, range, rects, rect;
        var x = 0, y = 0;
        if (sel) {
            if (sel.type != "Control") {
                range = sel.createRange();
                range.collapse(true);
                x = range.boundingLeft;
                y = range.boundingTop;
            }
        } else if (win.getSelection) {
            sel = win.getSelection();
            if (sel.rangeCount) {
                range = sel.getRangeAt(0).cloneRange();
                if (range.getClientRects) {
                    range.collapse(true);
                    rects = range.getClientRects();
                    if (rects.length > 0) {
                        rect = rects[0];
                    }
                    // 光标在行首时,rect为undefined
                    if(rect){
                        x = rect.left;
                        y = rect.top;
                    }
                }
                // Fall back to inserting a temporary element
                if ((x == 0 && y == 0) || rect === undefined) {
                    var span = doc.createElement("span");
                    if (span.getClientRects) {
                        // Ensure span has dimensions and position by
                        // adding a zero-width space character
                        span.appendChild( doc.createTextNode("\u200b") );
                        range.insertNode(span);
                        rect = span.getClientRects()[0];
                        x = rect.left;
                        y = rect.top;
                        var spanParent = span.parentNode;
                        spanParent.removeChild(span);

                        // Glue any broken text nodes back together
                        spanParent.normalize();
                    }
                }
            }
        }
        // return { x: x, y: y };
        return x;
    }
</script>
</body>
</html>

 

 

Range.setStart() - Web API 接口参考 | MDN

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值