关于DOM的一些笔记(一)

时间:2023-02-14 21:43:51

  这篇文章整理的是关于DOM的一些学习笔记,这样以后查找起来也方便许多。(以前js看的是入门经典和DOM编程艺术,现在在看高级程序设计,本文就以高级程序为主整理)

  1、Node

    (1):类型

    node.nodeType:返回节点类型(一共有12种)。若返回值为1,则表明是个element节点,若2,属性节点,若3,文本节点。

    node.nodeName:返回节点的名称(如input返回"input")。

    node.nodeValue:返回节点的value,没有则返回null。

    (2):关系

    node.childNodes:返回保存一个NodeList(类似数组,并且有length属性,并非Array的实例)的对象,它是基于DOM结构动态执行查询的结果,因此DOM结构的变化会自动反映在NodeList对象中。

      node.childNodes[0]:访问第一个节点,推荐。

      node.childNodes.item(0):访问第一个节点。

      Array.prototype.slice.call(Node.childNodes, 0):将NodeList对象转换为数组(不支持IE8-。

      关于DOM的一些笔记(一)

      上图中的f是随意取的一个form表单,很明显f.childNodes是一个对象,而a则是一个数组。

    node.parentNode:返回父节点。

    node.previousSibling && Node.nextSilbing:返回节点的前一个和后一个兄弟节点。第一个节点的previousSibling返回null,最后一个节点的nextSibling返回null。

    node.firstChild && Node.lastChild:返回节点的第一个和最后一个子节点。如果只有一个子节点,则firstChild和lastChild指向同一个节点。如果没有子节点,则均为null。

    node.hasChildNodes():如果节点包含一个或多个子节点的情况下返回true。

    node.ownerDocument:指向表示整个文档的文档节点(实测就相当于返回整个页面的源码)。

    (3):操作

    node.appendChild():向childNodes列表的末尾添加一个节点。如果传入到appendChild()中的节点已经是文档的一部分,那就将该节点从原始位置转移到新位置(例如在调用appendChild()时,传入父节点的第一个子节点,那么该节点就会成为父节点的最后一个子节点)。

    node.insertBefore():把传入的节点放在childNodes列表的指定位置。该方法接受2个参数:要插入的节点和作为参照的节点。插入节点后,被插入的节点会变成参照节点的前一个同胞节点,并返回该节点。如果参照节点是null,则insertBefore()和appendChild()执行相同的操作。

      关于DOM的一些笔记(一)

    node.replaceChild():该方法接受2个参数:要插入的节点和要替换的节点。要替换的节点将由这个方法返回并从文档树中被移除,同时由要插入的节点占据其位置。

      关于DOM的一些笔记(一)

      关于DOM的一些笔记(一)

    node.removeChild():该方法接受1个参数:要移除的节点。将移除并返回这个节点。

    (其他):

    node.cloneNode():用于创建调用该方法的节点的一个完全相同的副本。接受1个布尔值参数,表示是否执行深复制。在参数为true的情况下,复制节点及其整个子节点树。在参数为false(默认值)的情况下,仅复制节点本身。复制后返回的节点副本属于文档所有,但没有指定父节点。(介绍说cloneNode()不会复制添加到DOM节点中的JavaScript属性,例如事件处理程序等,该方法只复制特性)、(指定为true的情况下)子节点,其他一切都不会复制)。

    node.normalize():处理文档树中的文本节点。(暂时没明白,留待更新)

  2、Document

    (1):特性

    nodeType的值为9。

    nodeName的值为"#document"。

    nodeValue的值为null。

    parentNode的值为null。

    ownerDocument的值为null。

    (2):文档的子节点

    document.documentElement:该属性始终指向HTML页面的<html>元素。与document.childNodes[0]和document.firstChild的值相同。

    document.body:该属性指向<body>元素。

    document.doctype:访问<!dotype>标签。(结果与浏览器有关)

      关于DOM的一些笔记(一)

    (3):文档的信息

    document.titile:获取<title>中的文本,也可以修改title属性的值。

      关于DOM的一些笔记(一)

     document.URL:包含页面完整的URL(即地址栏中的信息)。

     document.domain:包含页面的域名。

     document.referrer:包含链接到当前页面的那个页面的URL。

      关于DOM的一些笔记(一)

    (4):查找元素

     document.getElementById()。

     document.getElementsByClassName():

     document.getElementsByTagName():该方法接受一个参数,即要取得元素的标签名,返回包含0个或多个元素的NodeList。在HTML文档中,该方法会返回一个HTMLCollection对象,该对象与NodeList非常相似,同样可以用方括号或item()方法来访问HTMLCollection对象中的项。HTMLCollection对象有一个方法叫做namedItem(),使用该方法可以通过元素的name特性取得集合中的项,例如:

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

        document.getElementsByTagName('*'):获取页面中的所有元素。(IE将注释实现为元素,因此在IE中调用该方法会返回所有注释节点)

    (5):特殊集合

      document.getElementsByName():返回带有给定name特性的所有元素。

      document.anchors:包含文档中所有带name特性的<a>元素。

      document.forms:等同于document.getElementsByTagName('form')。

      document.imags:等同于document.getElementsByTagName('img')。

      document.links:包含文中所有带有href特性的<a>元素。

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

    (6):文档写入

      write()、writeIn():这2个方法都接受一个或多个字符串参数,即要写入到输出流中的文本。write()会原样写入,而writeIn()则会在每个字符串的末尾添加一个换行符(\n)。(在chrome上实测writeIn()并没有在末尾加上换行符,而是多了一个空格分割;搜索了一下:如果使用了 <PRE> 和 <XMP> 标识,这个换行符会被解释,且在浏览器中显示)。

      open()、close():打开和关闭网页的输出流。

  3、Element

    (1):特征

      nodeType的值为1。

      nodeName的值为元素的标签名。

      nodeValue的值为null。

      parentNode可能是Document或Element。

      其子节点可能是Element、Text、Comment、ProcessingInstruction、CDATASection或EntityReference。

      要访问元素的标签名,可以使用nodeName属性,也可以使用tagName属性(这2个属性会返回相同的值)。

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

      在HTML中,标签名始终都会以全部大写表示。因此如果要比较,需要将标签名转换为相同的大小写形式,例如;

        if (element.tagName.toLowerCase() == 'a') {}

    (2)、HTML元素

      所有的HTML元素都由HTMLElement类型表示。HTMLElement类型直接继承自Element并添加了一些属性。添加的这些属性分别对应于每个HTML元素中都存在的下列标准特征。

      id。

      title:有关元素的附加说明信息。

      lang:元素内容的语言代码。

      dir:语言的方向,值为“ltr”或“rtl”。

      className。

      可以用 node.dir = 'rtl' 这样来为每个属性赋予新的值。

      对id或lang的修改对用户而言是透明不可见的(假设没有基于它们的值设置的CSS样式),而对title的修改则只会在鼠标移动到这个元素之上才会显示出来。对dir的修改会在属性被重写的那一刻,立即影响页面中文本的左、右对齐方式。修改className时,如果新类关联了与此前不同的CSS样式,那么就会立即应用新的样式。

    (3)、取得元素

      getAttribute():取得特性名,包括自定义的特性,并且特性的名称不区分大小写。不过,只有非自定义的特性才会以属性的形式添加到DOM对象中。(根据HTML5规范,自定义特征应该加上 data- 前缀以便验证)

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

        有两类特殊的特性。

          style:通过getAttribute()访问时,返回的style特性值中包含的是CSS文本,而通过属性来访问则返回一个对象。(实际是因为style属性没有映射到style特性)

          时间处理程序(类似onclick):通过getAttribute()访问,会返回相应代码的字符串,而在访问onclick属性时,则会返回一个JavaScript函数。(因为事件处理程序本身就应该被赋予函数值)

    (4)、设置特性

      setAttribute():通过该方法设置的特性名会被统一转换为小写形式。

      removeAttribute():该方法用于彻底删除元素的特性。调用该方法不仅会清除特性的值,而且也会从元素中完全删除特性。

    (5)、attributes属性

      attributes属性包含一个NamedNodeMap,与NodeList相似。元素的每一个特性都由一个Attr节点表示,每个节点都保存在NamedNodeMap对象中。

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

      removeNamedItem(name):从列表中移除nodeName属性等于name的节点,与removeAttribute()唯一的区别就是removeNamedItem()返回表示被删除特性的Attr节点。

      setNamedItem(node):向列表中添加节点,以节点的nodeName属性为索引。

      item(pos):返回位于数字pos位置处的节点。

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

    (6)、创建元素

      document.createElement()。

        // var div = document.createElement("<div id=\"my_div\" class=\"div-class\"></div>");

    (7)、元素的子节点

  4、Text类型

    文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容。Text节点具有一下特征:

      (1)、nodeType的值为3。

      (2)、nodeName的值为"#text"。

      (3)、nodeValue的值为节点所包含的文本。

      (4)、parentNode是一个Element。

      (5)、不支持(没有)子节点。

    可以通过nodeValue属性或data属性访问Text节点中包含的文本。使用以下方法可以操作节点的文本:

      (1)、appendData(text):将text添加到节点的末尾。

      (2)、deleteDate(offset, count):从offset指定的位置开始删除count个字符。

      (3)、insertData(offset, text):在offset指定的位置插入text。

      (4)、replaceData(offset, count, text):用text替换从offset指定的位置开始到offset+count为止的为本。

      (5)、splitText(offset):从offset指定的位置将当前文本节点分成2个文本节点。

      (6)、substringData(offset, count):提取从offset指定的为止开始到offset+count为止的字符串。

    同时文本节点的length属性保存着节点中字符的数目,并且在nodeValue.length和data.length中保存着同样的值。

    单一个空格也算一个文本节点。(<div> </div> 有一个文本节点)

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)(chrome输出结果)

        关于DOM的一些笔记(一)(在innerHTML里输出转义了)

    (1)、创建文本节点

      document.createTextNode():创建文本节点。

    (2)、规范化文本节点

      element.normalize():如果在一个包含2个或多个文本节点的父元素上调用normalize()方法,则会将所有文本节点合并成一个节点,最终的节点的nodeValue等于将合并前每个文本节点的nodeValue值拼接起来的值。

    (3)、分割文本节点

      element.splitText(offset):该方法会将一个文本节点分成2个文本节点,即按照指定的位置分割nodeValue值。原来的文本节点将包含从开始到指定位置之前的内容,新文本节点将包含剩下的文本。该方法会返回一个新文本节点,该节点与原节点的parentNode相同。

  

  5、Comment类型

    注释在DOM中是通过Comment类型来表示的。

    (1)、特征

      nodeType的值为8。

      nodeName的值为"#comment"。

      nodeValue的值是注释的内容。

      parentNode可能是Document或Element。

      不支持(没有)子节点。

    (2)、使用

      Comment类型与Text类型继承自相同的基类,因此它拥有除splitText()之外的所有字符串操作方法。与Text类型相似,也可以通过nodeValue或data属性来取得注释的内容。

      注释节点可以通过其父节点来访问。

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

      另外,使用document.createComment()并为其传递注释文本也可以创建注释节点。

  6、DocumentFragment类型

    在所有节点类型中,只有DocumentFragment在文档中没有对应的标记。DOM规定文档片段(document fragment)是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源。

    (1)、特征

      nodeType的值为11.

      nodeName的值为"#document-fragment"。

      nodeValue的值为null。

      parentNode的值为null。

      子节点可以是Element、ProcessingInstruction、Comment、Text、CDATASection或EntityReference。

    (2)、使用

      虽然不能把文档片段直接添加到文档中,但可以将它作为一个“仓库”来使用,即可以在里面保存将来可能会添加到文档中的节点。

      document.createDocumentFragment():创建文档片段。

      文档片段继承了Node的所有方法,通常用于执行那些针对文档的DOM操作。如果将文档中的节点添加到文档片段中,就会从文档树中移除该节点,也不会从浏览器中再看到该节点。添加到文档片段中的新节点同样也不属于文档树。通过appendChild()或insertBefore()将文档片段的所有子节点(文档片段本身永远不会成为文档树的一部分)添加到相应位置。

        关于DOM的一些笔记(一)

        关于DOM的一些笔记(一)

  7、Attr类型

    元素的特性在DOM中以Attr类型来表示。

    (1)、特征

      nodeType的值为2.

      nodeName的值是特性的名称。

      nodeValue的值是特性的值。

      parentNode的值为null。

      在HTML中不支持(没有)子节点。

      在XML中子节点可以是Text或EntityReference。

    (2)、属性

      name:特性名称(与nodeName的值相同)。

      value:特性的值(与nodeValue的值相同)。

      specified:布尔值,用以区别特性是在代码中运行的,还是默认的。

      document.createAttribute(name):创建新的特性节点。

      不推荐直接访问特性节点,用getAttribute()、setAttribute()和removeAttribute()。

      

    

  最后更新于2016年10月10日