• 范围


    一、DOM中的范围

       1.startContainer :包含范围起点的节点 即选区中第一个节点的父节点。startOffset:范围在startContainer中起点的偏移量。如果startContainer是文本节点、注释节点或者CDATA节点,那么startOffset就是范围起点之前跳过的字符数量。否则startOffset就是范围中第一个子节点的索引。endContainer:包含范围终点的节点,即选区中最后一个节点的父节点。endOffset范围在endContainer中终点的偏移量。 还有一个commonAncestorContainer:startContainer和endContainer共同的祖先节点在文档树种位置最深的哪个。

       2.使用document.createRange();创建一个范围 

       3.setStartBefore(refNode):将范围的起点设置在refNode之前,因此,refNode就是范围选区中的第一个子节点。同时会将startContainer属性设置为refNode.parentNode,将startOffset属性设置为refNode在其父节点的childNodes集合中的索引。setStartAfter(refNode):将范围的起点设置在refNode之后,因此,refNode就不在范围之内。其下一个同辈检点此案时范围选区中的第一个子节点。同时会将 startContainer属性设置为refNode.parentNode,将startOffset属性设置为refNode在其父节点的 childNodes集合中的索引+1。    setEndBefore(refNode):将范围的终点设置在refNode之前,因此refNode也就不在范围之内了,其上一个同辈节点才是范围选区中的最后一个子节点。同时会将endContainer属性设置为refNode.parentNode,将endOffset属性设置为refNode在其父节点的childNodes集合中的索引。setEndAfter(refNode):将范围的终点设置在refNode之后,因此refNode也就是范围选区中的最后一个子节点,同时会将endContainer属性设置为refNode.parentNode,将endOffset属性设置为 refNode在其父节点的childNodes集合中的索引+1。

    二.用DOM范围实现复杂选择 用到两个方法 一个是setStart()设置起始位置和setEnd()设置范围的末位置。

       <body>
    <p id="p1"><b>hello</b>world!</p>
    <script>
       var p1 = document.getElementById("p1");
       helloNode = p1.firstChild.firstChild;
       worldNode = p1.lastChild;
       var range = document.createRange();
       range.setStart(helloNode, 2);
       range.setEnd(worldNode, 3);  
    </script>
    </body>

    可以使用range.deleteContents() 来删除范围  extractContents()方法也可以删除范围选区,但它与前者的差别在于会将范围的文档片段返回。用于别的地方 如下:

    <p id="p1"><b>hello</b>world!</p>
    <script>
       var p1 = document.getElementById("p1");
       helloNode = p1.firstChild.firstChild;
       worldNode = p1.lastChild;
       var range = document.createRange();
       
       range.setStart(helloNode, 2);
       range.setEnd(worldNode, 3);  
       
       var fragment = range.extractContents();
       p1.parentNode.appendChild(fragment);
    </script>

    可以使用cloneContents()创建范围对象的一个副本 ,饭后再插入该副本 用法与extractContents()差不多

    可以使用insertNode()方法可以向范围选区的开始处(之前)插入一个节点如下

    <body>
    <p id="p1"><b>hello</b>world!</p>
    <script>
       var p1 = document.getElementById("p1");
       helloNode = p1.firstChild.firstChild;
       worldNode = p1.lastChild;
       var range = document.createRange();
       
       range.setStart(helloNode, 2);
       range.setEnd(worldNode, 3);  
       
       var span = document.createElement("span");
       span.style.color = "red";
       span.appendChild(document.createTextNode("Inserted text"));
       range.insertNode(span);
    </script> //可以使用这种技术插入一些帮助提示信息,例如在打开新窗口的链接旁边插入一幅图像。

    可以使用surroundContents()环绕范围内容的节点。在环绕范围插入内容时,后台会执行下列步骤:一是提取出范围中的内容(类似执行extractContent());二是将给定节点插入到文档中原来范围所在的位置上;三是将文档片段的内容添加到给点节点中
    //可以使用这种技术来凸显显示网页中的某些词句 如下的代码会给范围选区加上一个黄色的背景

    <body>
    <p id="p1"><b>hello</b>world!</p>
    <script>
       var p1 = document.getElementById("p1");
       helloNode = p1.firstChild.firstChild;
       worldNode = p1.lastChild;
       range = document.createRange();
       
       range.selectNode(helloNode);
       
       var span = document.createElement("span");
       span.style.backgroundColor = "yellow";
       range.surroundContents(span);
    </script>
    </body>

    三.折叠DOM范围 :指范围中未选中文档的任何部分,可以用文本框来描述折叠范围的过程。

        使用collapse()方法来折叠范围这个方法接收一个参数,true折叠刀范围的起点。参数是false折叠刀范围的终点 。确定折叠完毕可用collapsed来确定 如下代码   range.collapse(true); alert(range.collapsed);

    可以使用compareBoundaryPoints()方法来确定这些范围是否有公共边界(起点或者终点)。这个方法接受两个参数:表示比较方式的常量值和要比较的范围。比较方式的常量值如下:Range.START_TO_START(0):比较第一个范围和第二个范围的起点;Range.START_TO_END(1):比较第一个范围的起点和第二个范围的终点。Range.START_TO_END(2)比较第一个范围和第二个范围的终点;Range.START_TO_START(3)比较第二个范围的终点和第一个范围的起点。

    返回值如下。如果第一个范围中的点位于第二个范围中的点之前,返回1;如果两个点相等返回0;如果第一个范围中的点位于第二个范围中的点之后,返回1;

  • 相关阅读:
    文件管理后章
    文件管理前章
    文本处理三剑客
    匿名函数以及应用、三元表达式
    认识docker以及常用操作
    字符编码
    赋值与深浅拷贝
    Python基本运算符
    LVM配置
    Linux磁盘管理
  • 原文地址:https://www.cnblogs.com/luhangnote/p/2640486.html
Copyright © 2020-2023  润新知