DOM

DOM

node类型(基本类型,以下其他类型的鼻祖)

  1、nodeType

      parentNode:父节点

      childNodes:子节点(理解成一个数组)

       someNode.firstChild == someNode.childNodes[0];

       someNode.lastChild == someNode.childNodes[someNode.childNodes.length-1];

       previouSiblings和nextSibling:兄弟节点

       hasChildNodes()判断是否有子节点

       元素文本都算是节点

  2、操作节点

      插入

        appendChild();向末尾插入,(标签的里面)

        insertBefore();将节点插入到某个特定位置,第一个参数插入的节点,第二个参数参照节点

      替换

        replaceChild():第一个参数:新节点,第二个参数是要替换的

      移除

        removeChild(node);节点参数

        

      复制

        cloneNode();布尔参数,true是深复制

Document类型(对象)(获得,写入文档节点,location用法)

  document对象是window对象的属性。

  1、文档信息

      documentElement属性(指向html元素)

      body属性(body元素)

      document.doctype;//取得<!DOCTYPE>的引用

        document.title:获取或设置title的值

      取:var title = document.title

      改:document.title = “xxx”

  2、网页信息

      

        document.location.href === document.URL

      (在console打印时少用等号)

        例:document.domain = "www.baidu.html",domain是可以设置的

      获取前一个页面的url:document.referrer       

      location对象的用法,以下新增

      

    3、获取元素

      getElementById();取得id

      getElementsByTagName();取得标签名

      getElementByName();根据name属性名返回元素,常用在单选按钮中

  4、写入元素

      write():字符串参数,直接原样输出到文档流中,在页面加载完成后执行会复写整个页面

      writeIn();同上,但是在末尾会添加换行符  

      open(),close()打开或关闭网页的输出流

Element类型(创建标签名和属性特性的操作)

  提供了对元素标签的名,子节点及特性的访问

  1、访问标签名

      元素.tagName;//"DIV"

      元素.nodeName;//"DIV"

  2、html

      属性:id,className,title,lang,dir,这些属性都可以用来获取或修改属性值

        var ele = document.getElementById("id");

      获取:

        alert(ele.id);

      修改:

        ele.id = "someOtherId";

  3、取得元素特性

      getAttribute(属性名);//ele.getAeeribute("id");//id//getAttribute("class")

        特点:style特性,用getAttribute();访问获取到的是css文本,通过属性访问则会返回一个对象。

  4、设置元素特性

      setAttribute("设置的特姓名",值);

        ele.setAttribute("class","newClass");

        另一种写法:ele.class = "newClass";//注意自定义的属性这样修改会报错

  5、删除元素的特性

      removeAttribute();会彻底删除元素特性

  6、attributes属性

      只有Element类型使用,动态的特性类型集合,包含NameNodeMap对象,有以下方法(不常用)

         (nodeName:特性名称,nodeValue:特性的值)

        getNamedItem(name);返回nodeName属性等于name的节点;

        removeNamedItem(name);移除nodeName属性等于name的节点;返回的是被删除的节点

        setNamedltem(node);向列表中添加节点

        item(pos);返回位于数字pos处的节点

        例:var id  = ele.attributes.getNamedItem("id").nodeValue;//获取元素的id特性

          var id = ele.attributes["id"].nodeValute;//这里把attributes理解为对象

          设置新值:

          ele.attributes[”id“].nodeValue = "newid";

      用这个属性来迭代属性的值,attributes.length,用for遍历(把元素属性封装到数组里

  7、创建新元素

      document.createElement(标签名);

      例:var div = document.createElement("div");

        div.id = "newId"

      只是创建了个新元素,但未把它添加到文档树里

  8、将新元素添加到文档树里

      document.body.appendchild(div);

text类型

  纯文本内容,不能包含元素标签,没有子节点

  访问

      nodeValue属性和data属性

   创建

      document.createTextNode();

  

  添加

      appendData(text);将内容添加到节点末尾(标签里面)

    插入

      insertData(offset,text);在offset位置插入count

  删除

      deleteData(offset,count);从offert位置开始删除count个字符

  替换

      replaceData(offset,count,text);用text替换offset到count的文本

  分割

      splitText(offset);从offset开始将文本分为两个文本节点

      返回从数字开始之后的文本,包含数字下的那个字符。原文本留下数字之前的文本。

  获取

      substringData(offset,count);提取从offset开始到count结尾的文本

  length属性

      nodeValue.length = data.length

  合并文本节点,假设一个元素下有两个文本节点,用这个方法合并后只有一个

      normalize();

Comment类型

  注释相关,和text类型继承同一个基类

  创建注释

      document.createComment();

CDATASection类型

  用在XML文档下,表示CDATA区域

DocumentType类型

  包含文档有关doctype的有关信息

DocumentFragment类型

  创建了文本片段,不会显示在文档流中,当作一个备用仓库使用

  创建

      document.createDocumentFragment(); 

Attr类型

  表示元素特性,特性也就是存在于attributes属性中的节点

    属性:name,value,specified:布尔值,区别指定的还是默认的

  创建

      document.createAttribute();

  赋值

      var attr = document.createAttribute("align");

      attr.value = "left";

  获取

      ele.attributes["align"].value

      ele.getAttributeNode("align").value;

      ele.getAttribute("value");

  添加

      ele.setAttributeNode("align");

DOM操作技术

动态脚本

    创建随时调用的脚本

    

       用script元素的text属性来添加脚本内容

      或者用appendChild()来添加(ie下会出错),执行起来有点像eval()方法

动态样式

  创建外部样式

  

  创建内部样式(会实时执行)

  

  以上添加样式代码在ie下会出错,另一个方法:

    style.styleSheet.cssText = "body{100px;}",

    styleSheet是style元素的属性

操作表格

  各种table属性。。。

使用NodeList

  有点像NamedNodeMap和HTMLCollection

  动态的dom流,可以用for,length属性迭代,每次访问都会查询一次文档,所以要减少直接对dom的操作。

总结:

      1、node是最基本的节点类型,其他类型都继承自它。

      2、document类型表示整个文档,跟节点,document是document类型的实例。

      3、element节点表示文档的html和xml元素。

      4、操作文本节点。

DOM拓展

选择符API

  document类型新增

  1、querySelector();接收一个css选择符

      

  2、querySelectorAll();接收一个css选择符

      取得该选择符下的所有元素,返回一个NodeList

      例:var p = document.querySelectorAll("p strong");//取得p元素下的所有strong元素

  element类型新增

  3、matchesSelector();接收一个css选择符参数,判断元素是否是个css选择符的引用,返回true或者false。不常用

元素遍历(查找)

  节点类型

      childElementCount:返回子元素的个数,不包括文本节点和注释

      filstElementChild:返回第一个子元素,firstChild的元素版

      lastElementChild:返回最后一个子元素

      previousElementChild:返回前一个同胞元素,previousSibling的元素版

      nextElementChild:返回后一个同胞元素,nextSibling的元素版

HTML5

  类相关

      1、getElementsByClassName();

          例:取得id为text下的所有类名为info的元素

          document.getElementById("text").getElementsByClassName("info");

      2、元素的classList属性,表示元素的类列表,同样这个属性是新集合DOMTokenList的实例,它有以下方法(兼容性较差)

          添加类

            add(value);

            例:ele.classList.add("newClass")

          判断是否存在类

            contains(value);返回布尔值

          删除

            remove(value);

          删除或给定,有则删除,无则添加

            toggle(value);

  焦点管理

      1、document.activeElement:获得当前获得焦点的元素,文档加载完表示的是body,加载中是null

      2、document.hasFocus():检查文档是否获得焦点,用这个方法判断用户是否正在与页面交互 

  HTMLDocument的变化

      1、readyState属性

          两个值:

            loading正在加载的文档

            complete已经加载完成的文档

          if(document.readyState == complete){}等于onload事件

      2、compatMode属性,区分页面渲染模式

          两个值:

            CSS1Compat:标准模式

            BackCompat:混杂模式

       3、document.head属性,兼容性差

  字符集属性(编码相关)

      1、document.charset = "UTF-8";修改charset的值

      2、defaultCharset:表示浏览器默认的字符集是什么,兼容性差

  自定义数据属性

      为元素添加属性,但要data-为开头,

          例:<div id="add" data-num = "123"></div>

      dataset属性来获取或设置自定义属性

          例:ele.dataset.num = "1234";//这个ele最好是id获取的元素,唯一的

  插入标记

      1、innerHTML属性:返回或调用元素的所有子节点(包括注释和文本)类似于jq的html()方法。

        

          不能单纯的直接插入script和style标签

      2、outerHTML属性

          可读:获取调用元素的所有子节点的html标签

          修改:替换包括调用元素在内的所有内容

      3、insertAdjacentHTML()方法

          

      4、scrollIntoView()方法:对所有html元素可用,滚动页面,让元素出现在视口中,兼容差

专有拓展

  1、文档模式

  2、children属性

      表示元素子节点,等同于childNodes

  3、contains()方法

      检查某个元素是不是被调用元素(使用这个方法的祖先元素)的子元素。是,则返回对,接收一个元素参数。

  4、插入文本

       innerText属性:会返回调用元素下的所有节点数里的文本内容(会拼接起来),修改的话也会全部复写可以添加html代码。如果要过滤掉html代码,在使用一遍innerText即可。在ie的兼容上可以使用textContent 

      outerText属性:调用和innerText一样,但是修改会完全覆盖元素,包括调用的元素,也就等同于删除了调用元素,不建议使用。 

  5、滚动

      scrollIntoViewIfNeeded(alignCenter);

      scrollByLines(lineCount);

      scrollByPages(pageCount);

  

DOM2和DOM3

  这部分内容就是升级了dom的用法,增加了许多属性方法,加强了交互功能。

  DOM变化

      1、DocumentType类型,新增3个属性:

          publicId,systemId,internalSubset,这三个都是有关文档类型声明的属性

      2、视图模块新增defaultView属性,指向给定的窗口,是视图部分唯一新增的属性,ie不支持,但在ie下有个等价的属性parentWindow

         3、创建新html文档document.implementation.createHTMLDocument("new doc");兼容很差

      4、一些node类型的变化

          比较节点的引用对象和类型返回布尔值:isSameNode()和isEqualNode(),参数是比较节点,可以使被调用的节点也可以是其他节点

          setUserData(),将属性,值,函数绑定给某个节点,三个参数,属性,value,数据处理函数

              例:document.body.serUserData("name","newBody",function(){})

          getUserData(),获得设置的属性值

              例:var data = document.body.getUserData("name")

      5、框架的变化

  样式 

     (style属性)针对行内

        访问:

          ele.style.backgroundImage//ele.style.color//ele.style.cssFloat!!

        获取:alert(ele.style.color)

        重写:cssText

          ele.style.cssText = "color:red;font-size:10px";

        遍历:length,item()

        getPropertyValue(属性名)方法;返回属性值的字符串表示

          ele.style.getPropertyValue("color")

        删除

          ele.style.removeProperty("border");

      计算的样式(不管是行内还是外链等等)都是只读的用法

          1、document.dafultView.getComputedStyle("要计算样式的元素",“伪元素的字符串,例:after,没有就填null”)

          

            ie不支持,但是有个相同的属性:ele.currentStyle

       操作样式表(链入样式表和<style>插入的样式表)

            1、文档中样式表的集合:document.styleSheets,有个length属性

              getStyleSheet():返回某个样式表对象

            2、css规则

        元素大小(元素的属性,只读的)

            offsetHeight,offsetWidth:元素的宽高,包括边框,水平滚动条

            offsetLeft,offsetTop:元素的外边框到包含元素的内边框间的距离

          

            如果容器是body,那么getElementLeft()和offsetLeft是一样的

       客户区大小(只读的)

            clientWidth属性:内容区宽度加内边距宽度

            clientHeight属性:同上

          

          浏览器的视口大小:document.body.clientWidth。。。

      滚动

          scrollHeight:没有滚动条的情况下,元素内容的总高度,可以获取元素的实际高度

          scrollWidth:同上

          scrollLeft:被隐藏在内容区域左侧的像素数,设置这个属性可以改变元素的滚动位置

          scrollTop:同上,scrollTop = 0;让元素滚回到顶部

        

       确定元素的大小

        getBoundingClientRect(),返回元素的一个矩形模型,有left,right,top,bottom四个属性,表示相对于视口的位置

  遍历

    dom2定义了两个用于顺序遍历dom结构的类型:NodeIterator和TreeWalker,IE不支持遍历dom

        1、NodeIterator

          创建该类型的实例:document.createNodeIterator() 四个参数

          主要方法:nextNode()向前遍历,previousNode()向后遍历

        2、TreeWalker

          升级版遍历,多方向遍历,除了上述两个方法,还有:

            parentNode();父节点,

            firstChild();第一个子节点

            lastChild();当前节点最后一个子节点;

            nextSibling();当前节点的下一个同辈节点;

            previousSibling();遍历到当前节点的上一个同辈节点

          创建一个遍历实例:document.createTreeWalker();同样有四个参数

  范围

    选择文档中的一个区域

     创建dom范围:var range = document.createRange();

       每个范围是range类型的实例,有以下属性或方法    

          添加内容:

            selectNode(),接收一个dom节点,用该节点内容来填充范围,会选择整个节点,包括子节点。

            selectNodeContents(),只选择节点的子节点

          实现复杂选择:

            setStart()和setEnd()

      操作dom范围里的内容

        删除:1、deleteContents()

           2、extractContents();也是删除,但是它会返回范围的文档片段,可以用这个返回的添加到其他元素里

        克隆:cloneContents,复制文档片段的一个副本

        插入:insertNode();向范围选取的开始出插入一个节点

           surroundContents:环绕范围添加内容

        折叠:collapse();一个参数,true折叠到开始位置,false折叠到结束位置

        比较:compareBoundaryPoints();来确定某些范围是否有公共边界

        复制:cloneRange();复制范围的一个副本

        清理使用后的范围:detach();一旦清除就不能在使用了      

          

          

      

    

      

       

                

      

          

      

          

      

  

  

    

    

  

    

 

     

        

      

          

      

      

      

  

原文地址:https://www.cnblogs.com/Grace-zyy/p/8362416.html