快速了解JavaScript的DOM模型

概述 DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和内容。
W3C DOM由以下三部分组成:

  • 核心DOM - 针对任何结构化文档的标准模型。
  • XML DOM - 针对XML文档的标准模型。
  • HTML DOM - 针对HTML文档的标准模型。
分类 DOM目前有三种级别:
  • DOM Level 1:1998年10月成为W3C的推荐标准,主要定义HTML和XML文档的底层结构。
  • DOM Level 2: 在DOM1基础上扩充了方法和属性,引入了与文档更多的交互能力。主要包括DOM视图、DOM样式、DOM事件、DOM遍历和范围等。
  • DOM Level 3:引入了将XML文档加载和序列化的方法。提供了验证文档有效性的能力。
节点树 以下面的HTML为例:
节点树 测试块 链接

浏览器会将HTML文档解析成节点并组成节点树。
快速了解JavaScript的DOM模型
文章图片

HTML DOM中通过不同类型节点来表示, Document是每个文档的根节点。这里的document只有一个子节点,称之为文档元素(Element)。Element表示元素类型的节点,Text表示文本类型的节点。
节点类型 DOM 的最小组成单位叫做节点(node)。上面的节点树中,每一段都由不同类型的节点组成。节点的类型有如下几种:
  • Node:浏览器提供的原生节点,下面的节点都继承它。
  • Document:整个文档树的顶层节点
  • DocumentTypedoctype标签(比如)。
  • Element:网页的各种HTML标签(比如等)。
  • Attr:网页元素的属性(比如class="right")。
  • Text:标签之间或标签包含的文本。
  • Comment:注释。
  • CDATASectionCDATA区域,与Comment类型类似。
  • DocumentFragment:文档的片段。
Node DOM1中定义了一个Node接口,JavaScript中所有节点类型都继承自Node类型,因此属性和方法都相同。
Node类型中定义了nodeType属性来表明节点的类型,由12个常量表示。任何节点必居其一:
  • Node.ELEMENT_NODE:数值1,对应元素节点Element
  • Node.ATTRIBUTE_NODE:数值2,对应属性节点Attr
  • Node.TEXT_NODE:数值3,对应文本节点Text
  • Node.CDATA_SECTION_NODE:数值4,对应文档中CDATA部(不会由解析器解析的文本)。
  • Node.ENTITY_REFERENCE_NODE:数值5,对应实体引用。
  • Node.ENTITY_NODE:数值6,对应实体类型Entity
  • Node.PROCESSING_INSTRUCTION_NODE:数值7,对应处理指令。
  • Node.COMMENT_NODE:数值8,对应注释节点Comment
  • Node.DOCUMENT_NODE:数值9,对应文档节点Document
  • Node.DOCUMENT_TYPE_NODE:数值10,对应文档类型节点DocumentType
  • Node.DOCUMENT_FRAGMENT_NODE:数值11,对应文档片段节点DocumentFragment
  • Node.NOTATION_NODE:数值12,对应DTD中声明的符号。
使用nodeType可以很容易确定节点类型,IE中没有公开Node类型的构造函数,使用Node.ELEMENT_NODE比较会导致错误。为了兼容IE,可以使用数值进行比较:
if (onenode.nodeType == Node.ELEMENT_NODE) {// 在IE中无效 console.log("The Node is an Element."); } // 或者 if (oneNode.nodeType == 1) {// 适用所有浏览器 console.log("The Node is an Element."); }

nodeName返回节点的标签名
var div = document.getElementByTagName('div')[0]; console.log(onenode.nodeName); // DIV

nodeValue返回字符串,表示节点的文本值,可读写。
var div = document.getElementByTagName('div')[0]; console.log(onenode.nodeValue); // null

节点关系
文档中节点都存在着一定的关系,节点之间的关系可以使用类似人类家族关系的形式描述。如,在HTML文档中,可以把看作是的父元素;相对的,也就是的子元素;而作为同级的两者之间的关系为兄弟(姐妹)关系。
Node中提供了几种节点遍历的属性:parentNodechildNodesfirstNode/lastNodepreviousSibling/nextSiblingownerDocument
Document JavaScript通过Document类型表示文档。浏览器中的document对象是HTMLDocument的一个实例,表示整个HTML页面。Document节点具有以下特征:
  • nodeTypeNode.DOCUMENT_NODE,值为9。
  • nodeName的值为#document
  • nodeValue的值为null
  • parentNode的值为null
  • ownerDocument的值为null
  • 其子结点可能是一个DocumentTypeElementProcessingInstructionComment
document对象还有一些属性来表示网页的一些信息:
  • title:取得当前页面的标题,也可以修改当前页面的标题并反映在浏览器的标题栏中。但不会改变</code>元素。</li> <li><code>URL</code>:包含页面完整的<code>URL</code>。</li> <li><code>domain</code>:只包含页面的域名。</li> <li><code>referrer</code>:保存着链接到当前页面的那个页面的<code>URL</code>。没有来源页面的情况下,可能包含空字符串。</li> </ul> <code>URL</code>与<code>domain</code>属性是相互关联的。<br /> Element Element类型用于表现XML或HTML元素,提供对元素标签名、子节点及特性的访问。例如<code><body></code>和<code></code>等。<code>Element</code>节点具有以下特征:<br /> <ul> <li><code>nodeType</code>为<code>Node.ELEMENT_NODE</code>,值为1。</li> <li><code>nodeName</code>的值为元素的标签名。</li> <li><code>nodeValue</code>的值为<code>null</code>。</li> <li><code>parentNode</code>可能是<code>Document</code>或<code>Element</code>。</li> <li>其子节点可能是<code>Element</code>、<code>Text</code>、<code>Comment</code>、<code>ProcessingInstruction</code>、<code>CDATASection</code>或<code>EntityReference</code>。</li> </ul> 要访问元素的标签名,可以使用<code>nodeName</code>属性,也可以使用<code>tagName</code>属性;这两个属性会返回相同值。<br /> 获取<code></code>的标签名:<br /> <blockquote><code>var div = document.getElementById("divId"); console.log(div.tagName); // DIV console.log(div.tagName == div.nodeName); // true</code></blockquote><br /> 特性和属性<br /> 所有HTML元素都由<code>HTMLElement</code>类型表示,不能直接通过这个类型,也是通过它的子类型来表示。<code>HTMLElement</code>类型直接继承自<code>Element</code>并添加了一些属性。每个HTML元素中的特性(例如<code></code>中的<code>id</code>、<code>class</code>等)会自动变成DOM对象的属性(<code>class</code>特性与<code>className</code>属性对应)。这些都可以通过<code>div.id</code>等获取并赋值。<br /> 一个元素中的<code>id</code>等是标准的特性,但也有非标准的特性不能使用<code>div.id</code>方式获取。那么要用什么方法来访问非特性。<br /> <code>DOM</code>主要提供了几个方法用于对任何特性进行操作,分别是:<br /> <ul> <li><code>hasAttribute(qualifiedName: string)</code>,检查<code>qualifiedName</code>这个特性是否存在。</li> <li><code>getAttribute(qualifiedName: string)</code>,获取<code>qualifiedName</code>这个特性值,如果不存在,则返回<code>null</code>。</li> <li><code>setAttribute(qualifiedName: string, value: string)</code>,设置<code>qualifiedName</code>这个特性的值为<code>value</code>。设置的特性名会被同意转换为小写形式。</li> <li><code>removeAttribute(qualifiedName: string)</code>,移除<code>qualifiedName</code>这个特性。</li> </ul> <blockquote><code></code></blockquote><br /> 以上面的HTML为例,使用这几种方法。<br /> <blockquote><code>var div = document.getElementById('d1'); div.getAttribute('title'); // 附加信息 div.hasAttribute('plug-add'); // true div.setAttribute('title', '修改附加信息'); div.removeAttribute('plug-add'); </code></blockquote><br /> 有两类特殊的特性,虽有对应的属性名,但属性的值与<code>getAttribute()</code>返回的值并不相同。<br /> 第一类特性就是<code>style</code>,用于通过CSS为元素指定样式。通过<code>getAttribute()</code>返回的<code>style</code>中包含的是CSS文本,而通过属性返回的是一个对象。<br /> 第二类特性是<code>onclick</code>这样的事件处理。如果通过<code>getAttribute()</code>返回的是相应代码的字符串。而访问<code>onclick</code>属性返回的是JavaScript函数(如果未指定相应特性,返回的是<code>null</code>)。<br /> attributes属性<br /> <code>Element</code>类型的<code>attributes</code>属性返回该元素所有属性节点的一个集合,该集合是一个"动态"的<code>NamedNodeMap</code>对象。<code>NamedNodeMap</code>对象拥有下列方法。<br /> <ul> <li><code>getNamedItem(name)</code>:返回<code>nodeName</code>属性等于<code>name</code>的节点。</li> <li><code>removeNamedItem(name)</code>:从列表中移除<code>nodeName</code>属性等于<code>name</code>的节点。</li> <li><code>setNamedItem(node)</code>:向列表中添加节点,以节点的<code>nodeName</code>属性为索引。</li> <li><code>item(pos)</code>:返回位于数字<code>pos</code>位置处的节点。</li> </ul> <code>attributes</code>属性包含一系列节点,在节点中<code>节点名称-nodeName 节点值-nodeValue</code>。<br /> <blockquote><code>var id = element.attributes.getNamedItem('id').nodeValue; // 方括号语法 var id = element.attributes['id'].nodeValue; // 属性名引用 var id = element.attributes.id; // 如果知道特性名所在的下标,也可以使用下标引用,假设id特性名所在下标为0. var id = element.attributes[0]; </code></blockquote><br /> 而<code>removeNamedItem()</code>方法与<code>removeAttribute()</code>方法都是将给定名称的特性删除,唯一区别就是<code>removeAttribute()</code>没有返回值,<code>removeNamedItem()</code>返回被删除特性的<code>Attr</code>节点。<br /> <blockquote><code>var oldAttr = element.attributes.removeNamedItem('id'); </code></blockquote><br /> <code>setNamedItem()</code>方法为<code>Element</code>添加一个新特性:<br /> <blockquote><code>element.attributes.setNamedItem(newAttr); </code></blockquote><br /> 一般情况下<code>getAttribute()</code>、<code>removeAttribute()</code>和<code>setAttribute()</code>方法就够使用了,但想要遍历元素的特性,<code>attributes</code>属性倒是比较方便。下面展示如果迭代元素中每一个特性并将它们以<code>name="value" name="value"</code>这样的字符串格式。<br /> <blockquote><code>function listAttributes(element) { var pairs = new Array(), attrName, attrValue, i, len; if (element.hasAttributes()) { var attrs = element.attributes; for (i = 0, len = element.attributes.length; i < len; i++) { attrName = attrs[i].nodeName; attrValue = https://www.it610.com/article/attrs[i].nodeValue; pairs.push(attrName +"=\"" + attrValue + "\""); } } return pairs.join(" "); }</code></blockquote><br /> classList<br /> <code>className</code>属性用于操作类名,但<code>className</code>是一个字符串,修改后要设置整个字符串的值。<br /> HTML5扩展了<code>classList</code>属性实现类名的操作。该属性返回<code>DOMTokenList</code>集合。定义了几个方法:<br /> <ul> <li><code>add(value)</code>:添加字符串到列表中。如果存在就不添加。</li> <li><code>contains(value)</code>:指定值是否存在于列表中,存在则为<code>true</code>,否则为<code>false</code>。</li> <li><code>remove(value)</code>:从列表中删除指定值。</li> <li><code>toggle(value)</code>:列表中存在指定值,删除它;没有给定值,添加它。</li> </ul> Attr <code>Attr</code>类型在<code>DOM</code>表示元素特性。特性是位于元素<code>attributes</code>属性中的节点。具有下列特征:<br /> <ul> <li><code>nodeType</code>为<code>Node.TEXT_NODE</code>,值为3。</li> <li><code>nodeName</code>的值是特性的名称。</li> <li><code>nodeValue</code>的值是特性的名称。</li> <li><code>parentNode</code>的值为<code>null</code>。</li> <li>在HTML中不支持子节点(没有子节点)。</li> <li>在XML中子节点可以是<code>Text</code>或<code>EntityReference</code>。</li> </ul> 特性节点不被认为是<code>DOM</code>文档树的一部分。最常使用<code>getAttrubute()</code>、<code>setAttribute()</code>和<code>removeAttribute()</code>方法,很少直接引用特性节点。<br /> <code>Attr</code>对象有3个属性:<br /> <ul> <li><code>name</code>,特性名称,与<code>nodeName</code>的值相同。</li> <li><code>value</code>,特性值,与<code>nodeValue</code>的值相同。</li> <li><code>specified</code>,布尔值,用于区分特性在代码中是指定的还是默认的。</li> </ul> 如果要为元素添加特性,可以使用<code>document.createAttribute(localName)</code>方法,创建名为<code>localName</code>的特性节点。例如,要为元素添加<code>align</code>特性,可以使用下列代码:<br /> <blockquote><code>var attr = document.createAttribute("align"); attr.value = "https://www.it610.com/article/left"; element.setAttributeNode(attr); alert(element.attributes["align"].value); //"left" alert(element.getAttributeNode("align").value); //"left" alert(element.getAttribute("align")); //"left"</code></blockquote><br /> Text 文本节点由<code>Text</code>类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。<code>Text</code>节点具有以下特征:<br /> <ul> <li><code>nodeType</code>为<code>Node.TEXT_NODE</code>,值为3。</li> <li><code>nodeName</code>的值为<code>#text</code>。</li> <li><code>nodeValue</code>的值为节点所包含的文本。</li> <li><code>parentNode</code>是一个<code>Element</code>。</li> <li>不支持子节点(没有子节点)。</li> </ul> 可以通过<code>nodeValue</code>属性或<code>data</code>属性访问<code>Text</code>节点中包含的文本,这两个属性中包含的值相同。对<code>nodeValue</code>的修改也会通过<code>data</code>反映出来,反之亦然。使用下列方法可以操作节点中的文本。<br /> <ul> <li><code>appendData(text)</code>:将<code>text</code>添加到节点的末尾。</li> <li><code>deleteData(offset, count)</code>:从<code>offset</code>指定位置开始删除<code>count</code>个字符。</li> <li><code>insertData(offset, text)</code>:在<code>offset</code>指定位置插入<code>text</code>。</li> <li><code>replaceData(offset, count, text)</code>:用<code>text</code>替换从<code>offset</code>指定的位置开始到<code>offset</code>+<code>count</code>位置处的文本。</li> <li><code>splitText(offset)</code>:从<code>offset</code>指定的位置将当前文本节点分成两个文本节点。</li> <li><code>substringData(offset, count)</code>:提取从<code>offset</code>指定的位置开始到<code>offset</code>+<code>count</code>为止处的字符串。</li> </ul> 除了这些方法外,文本节点还有一个<code>length</code>属性,保存着节点中字符的数目。而且,<code>nodeValue.length</code>和<code>data.length</code>中也保存着同样的值。<br /> 修改文本节点的结果会立即得到反映。因此字符串会经过HTML(或XML,取决于文档类型)编码。<br /> 使用<code>document.createTextNode()</code>可以创建文本节点,在<code>DOM创建</code>中会讲述它。<br /> Comment 注释在DOM中是通过<code>Comment</code>类型来表示的。<code>Comment</code>节点具有下列特征:<br /> <ul> <li><code>nodeType</code>为Node.COMMENT_NODE,数值为8。</li> <li><code>nodeName</code>的值为<code>#comment</code>。</li> <li><code>nodeValue</code>的值是注释的内容。</li> <li><code>parentNode</code>可能是<code>Document</code>或<code>Element</code>。</li> <li>不支持子节点(没有子节点)。</li> </ul> <code>Comment</code>类型与<code>Text</code>类型继承自相同的基类,因此它拥有除<code>splitText()</code>之外的所有字符串操作方法。与<code>Text</code>类型相似,也可以通过<code>nodeValue</code>或<code>data</code>属性取得注释的内容。<br /> 获取<code></code>代码中的注释:<br /> <blockquote><code>var div = document.getElementById("divId"); var comment = div.firstChild; console.log(comment.data); // A comment</code></blockquote><br /> 如果想创建注释节点,可以使用<code>document.createComment(data)</code>方法创建。<br /> <blockquote><code>var comment = document.createComment("Create a comment node"); </code></blockquote><br /> 浏览器不会识别位于<code></code>标签后面的注释。一定保证访问的注释节点位于<code></code>之间。<br /> CDATASection <code>CDATASection</code>类型只针对基于XML文档,表示的是<code>CDATA</code>区域。与<code>Comment</code>类似,<code>CDATASection</code>类型继承自<code>Text</code>类型,因此拥有除<code>splitText()</code>之外的所有字符串操作方法。<code>CDATASection</code>节点具有以下特征:<br /> <ul> <li><code>nodeType</code>为<code>CDATA_SECTION_NODE</code>,值为4。</li> <li><code>nodeName</code>的值为<code>#cdata-section</code>。</li> <li><code>nodeValue</code>的值是<code>CDATA</code>区域中的内容。</li> <li><code>parentNode</code>可能是<code>Document</code>或<code>Element</code>。</li> <li>不支持子节点(没有子节点)。</li> </ul> <code>CDATA</code>区域只会出现在XML文档中,因此多数浏览器都会把<code>CDATA</code>区域错误地解析为<code>Comment</code>或<code>Element</code>。以下面的代码为例:<br /> <blockquote><code><![CDATA[This is content.]]></code></blockquote><br /> 这个例子中的<code></code>元素应该包含一个<code>CDATASection</code>节点。可是,四大主流浏览器无一能够这样解析它。即使对于有效的XHTML页面,浏览器也没有正确地支持嵌入的<code>CDATA</code>区域。<br /> 在真正的XML文档中,可以使用<code>document.createCDataSection()</code>来创建<code>CDATA</code>区域,只需为其传入节点的内容即可。<br /> DocumentType <code>DocumentType</code>类型在Web浏览器中并不常用。<code>DocumentType</code>包含着与文档有关的<code>doctype</code>有关的所有信息,它具有下列特征:<br /> <ul> <li><code>nodeType</code>为<code>Node.DOCUMENT_TYPE_NODE</code>,值为10。</li> <li><code>nodeName</code>的值为<code>doctype</code>的名称。</li> <li><code>nodeValue</code>的值为<code>null</code>。</li> <li><code>parentNode</code>是<code>Document</code>类型。</li> <li>没有子节点。</li> </ul> <code>DOM 1级</code>规定的<code>DocumentType</code>对象不能动态创建,只通过解析文档代码的方式来创建。支持<code>DocumentType</code>的浏览器会把它保存在<code>document.doctype</code>中。<br /> <code>DocumentType</code>对象在<code>DOM 1级</code>中有3个属性:<br /> <ul> <li><code>DocumentType.name</code>,文档类型的名称。</li> <li><code>DocumentType.entities</code>,文档类型描述的实体<code>NamedNodeMap</code>对象。</li> <li><code>DocumentType.notations</code>,文档类型描述的符号<code>NamedNodeMap</code>对象。</li> </ul> 浏览器中一般是<code>HTML</code>或<code>XHTML</code>类型的文档。所以<code>entities</code>和<code>notations</code>都是空列表。只有<code>name</code>属性有用。<br /> <blockquote><code><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"></code></blockquote><br /> 在这里,<code>DocumentType</code>中的<code>name</code>属性保存的就是<code>HTML</code>。<br /> <blockquote><code>console.log(document.doctype.name); // HTML</code></blockquote><br /> DocumentFragment <code>DocumentFragment</code>是文档片段,一种"轻量级"文档,可以包含和控制节点,但不像完整文档那样占用额外资源。可以将它作为"仓库"使用。具有下列特征:<br /> <ul> <li><code>nodeType</code>为<code>Node.DOCUMENT_FRAGMENT_NODE</code>,值为11。</li> <li><code>nodeName</code>的值为<code>#document-fragment</code>。</li> <li><code>nodeValue</code>的值为<code>null</code>。</li> <li><code>parentNode</code>的值为<code>null</code>。</li> <li>子节点可以是<code>Element</code>、<code>ProcessingInstruction</code>、<code>Comment</code>、<code>Text</code>、<code>CDATASection</code>或<code>EntityReference</code>。</li> </ul> 使用<code>document.createDocumentFragment()</code>方法创建文档片段,如下所示:<br /> <blockquote><code>var fragment = document.createDocumentFragment(); </code></blockquote><br /> 继承了<code>Node</code>的所有方法,用于执行针对文档的<code>DOM</code>操作。可以通过<code>appendChild()</code>或<code>insertBefore()</code>添加到文档中相应位置,但本身不会成为文档树的一部分。来看下面的HTML 示例代码:<br /> <blockquote><code><ul id="ulId"></ul></code></blockquote><br /> 我们给<code><ul id=ulId></ul></code>添加3个列表项。可以使用文档片段来保存创建的列表项,一次性将它们添加到文档中,避免浏览器反复渲染。<br /> <blockquote><code>var fragment = document.createDocumentFragment(); var ul = document.getElementById("myList"); var li = null; for (var i=0; i < 3; i++){ li = document.createElement("li"); li.appendChild(document.createTextNode("Item" + (i+1))); fragment.appendChild(li); } ul.appendChild(fragment); </code></blockquote><br /> DOM查找 现在有一段<code>html</code>页面模板<br /> <blockquote><code>....container { background-color: blue; width: 55%; height: 55%; }...Div Text OneP Text One<br /> A Text One Div Text Two <form id="primary-form" action="#" method="get">UserName: <input type="text" name="input-name"><br /> NickName: <input type="text" name="input-name"><br /> Email: <input type="text" name="input-email"><br /> <input type="submit" value="https://www.it610.com/article/Submit"> </form> ...</code></blockquote><br /> 在该模板中,我们想要获取这些标签元素,可以使用<code>document</code>对象获取的几种方法:<br /> id选择器<br /> <code>getElementById(elementId: string): HTMLElement | null; </code><br /> 该方法返回匹配指定<code>id</code>属性的元素节点,如果不存在,则返回<code>null</code>。<br /> 下面通过<code>id</code>选择器来获取<code>id</code>为<code>aId1</code>的元素:<br /> <blockquote><code>let div = document.getElementById("aId1"); console.log(div); // A Text One</code></blockquote><br /> 注意:严格匹配,包括大小写。如果写成<code>document.getElementById("aid1")</code>,输出为<code>null</code>。<br /> 标签选择器<br /> <code>getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>; </code><br /> 该方法返回匹配指定HTML标签名的元素列表。返回的是一个类似数组对象(<code>HTMLCollection</code>实例),可以实时反映HTML文档的变化,如果不存在,则返回<code>null</code>。<br /> <blockquote><code>let inputs = document.getElementsByTagName('input'); console.log(inputs); /* HTMLCollection(4) [input, input, input, input, input-name: input, email: input]*/</code></blockquote><br /> <img alt="快速了解JavaScript的DOM模型" onload="javascript:ImgReSize(this)" src="https://img.it610.com/image/info9/7233ad3f6b2e44dc819a81be3a91f625.jpg"/> <br /> 文章图片 <br /> <br /> 这个对象可以使用<code>length</code>属性获取元素数量,使用数组语法或<code>item()</code>方法来访问HTMLCollection对象中的项。<br /> <blockquote><code>inputs.length; // 输出p标签的数量 inputs[0].id; // 输出p标签集合中第一个元素的id特性的名称 inputs.item(0).className; // 输出p标签接种中第一个元素的class特性的名称</code></blockquote><br /> 还可以通过<code>namedItem()</code>方法根据元素的<code>name</code>特性获取集合中的项。<br /> <blockquote><code>var nameOfInput = inputs.namedItem("input-name"); </code></blockquote><br /> 也可以使用方括号语法来访问:<br /> <blockquote><code>var nameOfInput = inputs["input-name"]; </code></blockquote><br /> 要想取得文档中的所有元素,可以向getElementsByTagName()中传入<code>"*"</code>,表示"全部"。<br /> <blockquote><code>var allElements = document.getElementsByTagName("*"); </code></blockquote><br /> name选择器<br /> <code>getElementsByName(elementName: string): NodeListOf; </code><br /> 该方法返回匹配<code>name</code>属性的所有元素,返回值是<code>NodeList</code>,如果不存在,则返回<code>null</code>。<br /> <blockquote><code>var names = document.getElementsByName("input-name"); console.log(names); </code></blockquote><br /> <img alt="快速了解JavaScript的DOM模型" onload="javascript:ImgReSize(this)" src="https://img.it610.com/image/info9/e4701947209c4d8f808c7ff6b8b2af56.jpg"/> <br /> 文章图片 <br /> <br /> 注意,这个选择器在不同浏览器的效果是不同的,比如在IE和Opera浏览器下,这个方法也会返回<code>id</code>属性为这个值的元素。在使用的时候,应该小心使用,尽量保证<code>name</code>不和其它元素的<code>id</code>一致。<br /> 类选择器<br /> <code>getElementsByClassName(classNames: string): HTMLCollectionOf<Element>; </code>是HTML5中添加的方法。<br /> 该方法返回匹配<code>class</code>属性的所有元素,返回值是<code>HTMLCollection</code>,如果不存在,则返回<code>null</code>。<br /> <blockquote><code>// 获取所有class中同时包含'red'和'test'的元素 var classes = document.getElementsByClassName("container"); console.log(classes); </code></blockquote><br /> <img alt="快速了解JavaScript的DOM模型" onload="javascript:ImgReSize(this)" src="https://img.it610.com/image/info9/c61e7c2a5f57496cb2873a347d91b95f.jpg"/> <br /> 文章图片 <br /> <br /> 可以接收包含一个或多个类名的字符串,传入的多个类名的先后顺序不重要。<br /> Selectors API W3C发起指定的标准,可使浏览器支持CSS查询。Selectors API的核心是两个方法:<code>querySelector()</code>和<code>querySelectorAll()</code>。兼容的浏览器中通过<code>Document</code>及<code>Element</code>节点类型的实例进行调用。<br /> querySelector()方法<br /> <code>querySelector<E extends Element = Element>(selectors: string): E | null; </code><br /> 该方法返回匹配指定选择符的第一个<code>HTMLElement</code>元素,如果不存在,则返回<code>null</code>。传入的<code>selectors</code>必须是有效的CSS选择器;如果选择器不合法,会引发<code>SYNTAX_ERR</code>异常。<br /> <blockquote><code>document.querySelector("#aId1"); // 取得Id为"aId1"的元素 document.querySelector("p"); // 取得p元素 document.querySelector(".container"); // 取得类为"container"的第一个元素 document.querySelector("..selector"); // 引发'SYNTAX_ERR'异常(Uncaught DOMException:Failed to execute 'querySelector on 'Document': '..selector' is not a valid selector. 意思是'..selector'不是一个有效的选择。)</code></blockquote><br /> <code>Document</code>和<code>Element</code>都可以调用<code>querySelector()</code>方法,只是<code>Document</code>会在文档元素的范围内查找匹配的元素;<code>Element</code>只会在该元素后代元素的范围内查找匹配的元素。<br /> querySelectorAll()方法<br /> <code>querySelectorAll<E extends Element = Element>(selectors: string): NodeListOf<E>; </code><br /> 该方法返回匹配指定选择符的元素列表,返回的对象是<code>NodeList</code>,如果不存在,则返回空的<code>NodeList</code>。传入的<code>selectors</code>必须是有效的CSS选择器;如果选择器不合法,会引发<code>SYNTAX_ERR</code>异常。<br /> <blockquote><code>// 获取id为"primary-form"中所有元素 document.getElementById("primary-form").querySelectorAll("p"); // 获取类为"container"的所有元素 document.querySelectorAll(".container"); // 获取所有<form>元素中的所有元素 document.querySelectorAll("form p"); </code></blockquote><br /> <img alt="快速了解JavaScript的DOM模型" onload="javascript:ImgReSize(this)" src="https://img.it610.com/image/info9/15d88e192e8e492c9a944777e7c92022.jpg"/> <br /> 文章图片 <br /> <br /> matches()方法<br /> Selectors API Level 2规范为<code>Element</code>类型新增了一个方法:<br /> <code>matches(selectors: string): boolean; </code><br /> 该方法判断当前DOM节点是否能完全匹配指定选择符,如果匹配成功,返回<code>true</code>;匹配失败,返回<code>false</code>。<br /> <blockquote><code>var elems = document.getElementsByTagName('p'); for (var i = 0; i < elems.length; i++) { // 获取匹配'container'类选择符的dom节点 if (elems.item(i).matches('.container')) { console.log('The ' + elems.item(i).textContent + ' is container'); } } /*The P Text One is container The NickName:is container*/</code></blockquote><br /> 注意,有些供应商会有自己实验性方法在<code>matchesSelector()</code>方法之前加些前缀。如果想使用这种方法,可以编写一个包装函数。<br /> <blockquote><code>function matchesSelector(element, selector){ if (element.matches) { // 标准方法 return element.matches(selector); } else if (element.matchesSelector){ return element.matchesSelector(selector); } else if (element.msMatchesSelector){// IE 9+支持 return element.msMatchesSelector(selector); } else if (element.mozMatchesSelector){// Firefox 3.6+支持 return element.mozMatchesSelector(selector); } else if (element.webkitMatchesSelector){// Safari 5+和Chrome支持 return element.webkitMatchesSelector(selector); } else { throw new Error("Not supported."); } } if (matchesSelector(document.body, ".container")){ //执行操作 }</code></blockquote><br /> 当有的浏览器不支持<code>Element.matches()</code>或<code>Element.matchesSelector()</code>,但支持<code>document.querySelectorAll()</code>方法,可以有替代方案:<br /> <blockquote><code>if (!Element.prototype.matches) { Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function(s) { var matches = (this.document || this.ownerDocument).querySelectorAll(s), i = matches.length; while (--i >= 0 && matches.item(i) !== this) {} return i > -1; }; }</code></blockquote><br /> DOM遍历 <code>Node</code>节点提供了几种属性,用于访问DOM节点。<br /> parentNode<br /> <code>node.parentNode</code>属性用于返回指定节点的父节点。除<code>document</code>外,所有节点都有父节点,<code>document</code>对象的父节点为<code>null</code>。示例如下:<br /> <blockquote><code>document.getElementById('divId2').parentNode; </code></blockquote><br /> childNodes<br /> <code>node.childNodes</code>属性用于返回指定节点的子结点的<code>Node</code>对象集合。示例如下:<br /> <blockquote><code>document.getElementById('primary-form').childNodes; </code></blockquote><br /> firstChild/lastChild<br /> <code>node.firstChild</code>属性用于访问第一个子节点;<code>node.lastChild</code>属性用于访问最后一个子节点。如果要访问的节点不存在,则返回<code>null</code>。示例如下:<br /> <blockquote><code>document.getElementById('primary-form').firstChild document.getElementById('primary-form').lastChild; </code></blockquote><br /> previousSibling/nextSibling<br /> <code>node.previousSibling</code>属性用于访问之前的同级节点;<code>node.nextSibling</code>属性用于访问之后的同级节点。具有相同父节点为同级节点,之前或之后表示它们在文档中出现的顺序。实例如下:<br /> <blockquote><code>document.getElementById('divId2').previousSibling; document.getElementById('divId2').nextSibling; </code></blockquote><br /> ownerDocument<br /> <code>node.ownerDocument</code>属性用于返回元素的根节点,即:文档对象(<code>Document</code>)。通过这个属性,我们能够直接访问根节点而不必层层遍历。实例如下:<br /> <blockquote><code>document.getElementById('divId2').ownerDocument; </code></blockquote><br /> Element Traversal Element Traversal API 为DOM元素添加了以下5个属性。<br /> <ul> <li><code>childElementCount</code>:返回子元素(不包括文本节点和注释)的格式。</li> <li><code>firstElementChild</code>:指向第一个子元素;<code>firstChild</code>的元素版。</li> <li><code>lastElementChild</code>:指向最后一个子元素;<code>lastChild</code>的元素版。</li> <li><code>previousElementSibling</code>:指向前一个同辈元素;<code>previousSibling</code>的元素版。</li> <li><code>nextElementSibling</code>:指向后一个同辈元素;<code>nextSibling</code>的元素版。</li> </ul> 支持的浏览器为DOM元素添加了这些属性,利用这些元素不必担心空白文档节点,从而可以更方便地查找DOM元素。<br /> DOM操作 因为关系节点都是只读的,所以DOM提供了一些操作节点的方法。<br /> appendChild()<br /> <code>node.appendChild(newChild)</code>方法用于向<code>childNodes</code>列表的末尾添加一个节点并返回新增的节点。<br /> <blockquote><code>var returnedNode = div.appendChild(newNode); </code></blockquote><br /> insertBefore()<br /> <code>node.insertBefore(newChild, refChild)</code>方法会在指定的参照节点<code>refChild</code>之前插入新节点<code>newChild</code>。插入节点后,被插入的节点会变成参照节点的前一个同胞节点(<code>previousSibling</code>),同时被方法返回。如果<code>refChild</code>是<code>null</code>,则<code>insertBefore()</code>与<code>appendChild()</code>执行相同的操作。<br /> <blockquote><code>var returnedNode = div.insertBefore(newNode, div.lastChild); </code></blockquote><br /> replaceChild()<br /> <code>node.replaceChild(newChild, oldChild)</code>方法将要替换的节点<code>oldChild</code>移除,并将要插入的节点<code>newChild</code>插入并占据其位置。实例如下:<br /> <blockquote><code>document.getElementById('divId2').replaceChild(newnode, oldnode); </code></blockquote><br /> 在使用<code>replaceChild()</code>插入一个节点时,该节点的所有关系指针都会从被它替换的节点复制过来。被替换的节点仍然还在文档中,但它在文档中已经没有自己的位置了。<br /> removeChild()<br /> 而如果只想移除而非替换节点,可以使用<code>node.removeChild(oldChild)</code>方法,该方法将要移除的节点<code>oldChild</code>移除,并返回移除的节点。<br /> <blockquote><code>var removedNode = node.removeChild(node.firstChild); </code></blockquote><br /> 与使用<code>replaceChild()</code>方法一样,通过<code>removeChild()</code>移除的节点仍然为文档所有,只不过在文档中已经没有了自己的位置。<br /> 上面介绍的四种方法操作的都是某个节点的子节点,要使用这几个方法必须先取得父节点。另外,并不是所有类型的节点都有子节点,如果在不支持子节点的节点上调用这些方法,将会导致错误发生。<br /> DOM创建 DOM节点创建最常用的便是<code>document.createElement()</code>和<code>document.createTextNode()</code>方法。<br /> createElement()<br /> <code>document.createElement(tagName)</code>方法根据指定<code>tagName</code>标签名创建新元素节点,返回一个<code>HTMLElement</code>对象。标签名在HTML文档中不区分大小写,在XML(包括XHTML)文档中区分大小写。例如,创建一个<code></code>元素。<br /> <blockquote><code>var p = document.createElement('p'); </code></blockquote><br /> 在使用<code>createElement()</code>方法创建新元素的同时,也为新元素设置了<code>ownerDocument</code>属性。<br /> createTextNode()<br /> <code>document.createTextNode(data: string)</code>方法根据指定<code>data</code>文本创建新文本节点。作为参数的文本按照HTML或XML的格式进行编码。<br /> <blockquote><code>var textNode = document.createTextNode("Helloworld!"); </code></blockquote><br /> 在创建新文本节点的同时,也会为其设置<code>ownerDocument</code>属性。<br /> cloneNode()<br /> <code>node.cloneNode(deep)</code>方法用于对调用这个方法的节点创建一个完全相同的副本。<code>deep</code>是布尔值,设置是否执行深复制。默认为<code>false</code>,执行浅复制(只复制节点本身);当为<code>true</code>时,执行深复制(复制节点及其整个子节点树)。<br /> <blockquote><code>var node = document.getElementById('divId2').lastChild.cloneNode(true); </code></blockquote><br /> 这些用于创建节点和复制节点的方法,创建或复制的节点并不会出现在文档中,需要通过<code>appendChild()</code>、<code>insertBefore()</code>或<code>replaceChild()</code>将它添加到文档中。<br /> <blockquote><code>document.getElementById('divId2').appendChild(node); </code></blockquote><br /> 不管是<code>createElement()</code>、<code>createTextNode()</code>或者<code>cloneNode()</code>三种的哪种方法,创建新的节点都未被添加到文档树中。可以使用上面介绍的<code>appendChild()</code>、<code>insertBefore()</code>或<code>replaceChild()</code>方法将新节点添加到文档树中。<br /> 一旦将节点添加到文档树中,浏览器就会立即呈现。<br /> 一旦使用<code>appendChild()</code>等方法插入相邻的同胞文本节点时,会导致相邻文本节点混乱。<br /> 而在一个包含两个或多个文本节点的父元素上调用<code>normalize()</code>方法,就会将所有文本节点合并成一个节点。<br /> <blockquote><code>var element = document.createElement("div"); element.className = "message"; var textNode1 = document.createTextNode("Hello, "); element.appendChild(textNode1); var textNode2 = document.createTextNode("Pandora!"); element.appendChild(textNode2); document.body.appendChild(element); console.log(element.childNodes.length); // 2 element.normalize(); console.log(element.childNodes.length); // 1 console.log(element.firstChild.nodeValue); // "Hello, Pandora!"</code></blockquote><br /> 浏览器在解析文档时永远不会创建相邻的文本节点。这种情况只会作为执行DOM操作的结果出现。<br /> 还有一个与<code>normalize()</code>相反的方法<code> splitText(offset)</code>:将一个文本节点分成两个文本节点。<br /> <blockquote><code>var element = document.createElement("div"); element.className = "message"; var textNode = document.createTextNode("Hello, Pandora!"); element.appendChild(textNode); document.body.appendChild(element); var newNode = element.firstChild.splitText(6); console.log(element.firstChild.nodeValue); // "Hello," console.log(newNode.nodeValue); // " Pandora!" console.log(element.childNodes.length); // 2</code></blockquote><br /> 更多内容请关注公众号「海人为记」<br /> <strong>【快速了解JavaScript的DOM模型】</strong><img alt="快速了解JavaScript的DOM模型" onload="javascript:ImgReSize(this)" src="https://img.it610.com/image/info9/e03ce80427c7481da6a70ffa5aa3e0d9.jpg"/> <br /> 文章图片 <br /> <br /> </p> <div class="dede_pages"><ul></ul></div> <div class="pcd_ad"> <center><div class="_ahwullr0ac"></div> <script type="text/javascript"> (window.slotbydup = window.slotbydup || []).push({ id: "u6834461", container: "_ahwullr0ac", async: true }); </script> <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer" > </script></center> </div> <div class="mbd_ad"> <div style=margin-top:10px;margin-bottom:10px;> <div class="_i7aftr79jl"></div> <script type="text/javascript"> (window.slotbydup = window.slotbydup || []).push({ id: "u5950612", container: "_i7aftr79jl", async: true }); </script> <!-- ½űֻһ --> <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer" > </script> </div> </div> <h3>推荐阅读</h3> <ul class="post-loop post-loop-default cols-0"> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/11303444462021.html" title="Docker容器下快速搭建Hyperf框架在Windows系统的本地开发环境"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="Docker容器下快速搭建Hyperf框架在Windows系统的本地开发环境" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/11303444462021.html"> <b>Docker容器下快速搭建Hyperf框架在Windows系统的本地开发环境 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1354557.html" title="u盘启动快捷键u盘启动快捷键"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="u盘启动快捷键u盘启动快捷键" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1354557.html"> <b>u盘启动快捷键u盘启动快捷键 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1716815.html" title="吃了止痛药能打新冠疫苗吗"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="吃了止痛药能打新冠疫苗吗" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1716815.html"> <b>吃了止痛药能打新冠疫苗吗 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2125911.html" title="FGO魔伊复刻流程攻略 魔法少女纪行复刻活动流程推荐"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="FGO魔伊复刻流程攻略 魔法少女纪行复刻活动流程推荐" src="http://img.readke.com/230517/2224041147-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2125911.html"> <b>FGO魔伊复刻流程攻略 魔法少女纪行复刻活动流程推荐 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/09101T3G2021.html" title="随性写的"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="随性写的" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/09101T3G2021.html"> <b>随性写的 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2660729.html" title="高三学生经商有前途吗?"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="高三学生经商有前途吗?" src="http://img.readke.com/230708/1643492492-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2660729.html"> <b>高三学生经商有前途吗? </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3972037.html" title="让你的打印机重获新生 益普生打印机废墨清零软件下载"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="让你的打印机重获新生 益普生打印机废墨清零软件下载" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3972037.html"> <b>让你的打印机重获新生 益普生打印机废墨清零软件下载 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2229411.html" title="3000元价位手机怎么选好 3000元价位手机怎么选"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="3000元价位手机怎么选好 3000元价位手机怎么选" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2229411.html"> <b>3000元价位手机怎么选好 3000元价位手机怎么选 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3465038.html" title="安乐什么意思 安乐是什么意思"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="安乐什么意思 安乐是什么意思" src="http://img.readke.com/231115/1645402537-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3465038.html"> <b>安乐什么意思 安乐是什么意思 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2728277.html" title="王者荣耀狂铁所有皮肤 王者荣耀狂铁战令皮肤怎么样"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="王者荣耀狂铁所有皮肤 王者荣耀狂铁战令皮肤怎么样" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2728277.html"> <b>王者荣耀狂铁所有皮肤 王者荣耀狂铁战令皮肤怎么样 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3831808.html" title="代理服务器出了什么问题? 代理服务器不能怎么回事"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="代理服务器出了什么问题? 代理服务器不能怎么回事" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3831808.html"> <b>代理服务器出了什么问题? 代理服务器不能怎么回事 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2407236.html" title="纵向沟通与横向沟通有何不同 横向沟通与纵向沟通各有哪些优缺点"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="纵向沟通与横向沟通有何不同 横向沟通与纵向沟通各有哪些优缺点" src="http://img.readke.com/230603/1032343P8-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2407236.html"> <b>纵向沟通与横向沟通有何不同 横向沟通与纵向沟通各有哪些优缺点 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2258238.html" title="吃南瓜子能减肥吗"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="吃南瓜子能减肥吗" src="http://img.readke.com/230526/1H0396222-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2258238.html"> <b>吃南瓜子能减肥吗 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3031704.html" title="圆的面积和底面积一样吗? 圆的面积和底面积一样吗"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="圆的面积和底面积一样吗? 圆的面积和底面积一样吗" src="http://img.readke.com/230819/0F011A12-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3031704.html"> <b>圆的面积和底面积一样吗? 圆的面积和底面积一样吗 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2213307.html" title="手机cpu怎么设置最佳性能"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="手机cpu怎么设置最佳性能" src="http://img.readke.com/230524/1343353463-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2213307.html"> <b>手机cpu怎么设置最佳性能 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0P12523H021.html" title="宫腔镜|不知道宫腔镜有何优势?给你列出这3点,可别小瞧了"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="宫腔镜|不知道宫腔镜有何优势?给你列出这3点,可别小瞧了" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/0P12523H021.html"> <b>宫腔镜|不知道宫腔镜有何优势?给你列出这3点,可别小瞧了 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3325200.html" title="急脾气的妈妈怎么对待慢性子的孩子"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="急脾气的妈妈怎么对待慢性子的孩子" src="http://img.readke.com/231031/1Q9205010-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3325200.html"> <b>急脾气的妈妈怎么对待慢性子的孩子 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2510046.html" title="粉扑拿回来要洗吗 粉扑用完怎么放置"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="粉扑拿回来要洗吗 粉扑用完怎么放置" src="http://img.readke.com/230613/0JI424Q-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2510046.html"> <b>粉扑拿回来要洗吗 粉扑用完怎么放置 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/09111ZG02021.html" title="的哥马上要交班,却闯祸又丢工作"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="的哥马上要交班,却闯祸又丢工作" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/09111ZG02021.html"> <b>的哥马上要交班,却闯祸又丢工作 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/4133042.html" title="mysql查询前三名 mysql查询第三到第五"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="mysql查询前三名 mysql查询第三到第五" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/4133042.html"> <b>mysql查询前三名 mysql查询第三到第五 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> </ul> <p><br /><ul class="post-loop post-loop-list cols-4"><li><a href="/c/021T5JV2022.html" title="我们重新了解付费。" target="_blank">我们重新了解付费。 </a></li> <li><a href="/c/021T5J292022.html" title="拍照一年啦,如果你想了解我,那就请先看看这篇文章" target="_blank">拍照一年啦,如果你想了解我,那就请先看看这篇文章 </a></li> <li><a href="/c/021T5IG2022.html" title="事件代理" target="_blank">事件代理 </a></li> <li><a href="/c/021T5H622022.html" title="C语言中的时间函数clock()和time()你都了解吗" target="_blank">C语言中的时间函数clock()和time()你都了解吗 </a></li> <li><a href="/c/021T5F552022.html" title="数组常用方法一" target="_blank">数组常用方法一 </a></li> <li><a href="/c/021T5E562022.html" title="操作系统|[译]从内部了解现代浏览器(1)" target="_blank">操作系统|[译]从内部了解现代浏览器(1) </a></li> <li><a href="/c/021T5C002022.html" title="生发知识,带你深入了解" target="_blank">生发知识,带你深入了解 </a></li> <li><a href="/c/021T564512022.html" title="了解自然大气粒子对气候的影响" target="_blank">了解自然大气粒子对气候的影响 </a></li> <li><a href="/c/021J550042022.html" title="带你了解类型系统以及flow和typescript的基本使用" target="_blank">带你了解类型系统以及flow和typescript的基本使用 </a></li> <li><a href="/c/021J54P62022.html" title="neo4j|neo4j cql语句 快速查询手册" target="_blank">neo4j|neo4j cql语句 快速查询手册 </a></li> </ul></p> <div class=entry-copyright> <p></p> </div> </div> <div class="entry-footer"> <div class="prev-next sb br mb clearfix"> <p class="post-prev fl ellipsis">上一篇:<a href='/c/10102PWR021.html'>数组方法重构与迭代</a> </p> <p class="post-next fr ellipsis">下一篇:<a href='/c/10102PX12021.html'>C|【C语言进阶】字符串&内存函数</a> </p> </div> </div> </div> </article> </main> <aside class="sidebar"> <div class="widget widget_post_thumb"> <h3 class="widget-title"><span>更多...</span></h3> <ul> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0925244V32021.html" title="罗大伦《道德经》225"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="罗大伦《道德经》225" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0925244V32021.html" title="罗大伦《道德经》225">罗大伦《道德经》225</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/121SER92021.html" title="雷微静(回得了过去,回不了当初)"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="雷微静(回得了过去,回不了当初)" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/121SER92021.html" title="雷微静(回得了过去,回不了当初)">雷微静(回得了过去,回不了当初)</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/01013c3312022.html" title="读书沙龙好书推荐"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="读书沙龙好书推荐" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/01013c3312022.html" title="读书沙龙好书推荐">读书沙龙好书推荐</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0S1114M12021.html" title="自动化测试"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="自动化测试" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0S1114M12021.html" title="自动化测试">自动化测试</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0Z61613252021.html" title="海的约会第七天、第八天"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="海的约会第七天、第八天" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0Z61613252021.html" title="海的约会第七天、第八天">海的约会第七天、第八天</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/09222329E2021.html" title="记一次线上内存泄漏问题的排查过程"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="记一次线上内存泄漏问题的排查过程" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/09222329E2021.html" title="记一次线上内存泄漏问题的排查过程">记一次线上内存泄漏问题的排查过程</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/10022644542021.html" title="我在深夜里笑"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="我在深夜里笑" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/10022644542021.html" title="我在深夜里笑">我在深夜里笑</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/09152139242021.html" title="一分钟英语趣问答|一分钟英语趣问答 14"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="一分钟英语趣问答|一分钟英语趣问答 14" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/09152139242021.html" title="一分钟英语趣问答|一分钟英语趣问答 14">一分钟英语趣问答|一分钟英语趣问答 14</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/010T1KU2022.html" title="Activity的四种启动模式及其分析"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="Activity的四种启动模式及其分析" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/010T1KU2022.html" title="Activity的四种启动模式及其分析">Activity的四种启动模式及其分析</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/091119544H021.html" title="春芽"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="春芽" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/091119544H021.html" title="春芽">春芽</a></p> </div> </li> </ul> </div> </aside> </div> </div> <footer class="footer"> <div class="container"> <div class="clearfix"> <div class="footer-col footer-col-logo"> <!--<img src="/skin/images/logo-footer.png">--></div> <div class="footer-col footer-col-copy"> <ul class="footer-nav hidden-xs"> <li class="menu-item menu-item-706"><a href="/baike/">生活百科</a></li> <li class="menu-item menu-item-706"><a href="/it/">it技术</a></li> </ul> <div class="copyright"> <p>Copyright © 2017-2022 锐客网 <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备11041112号-41</a> </p> </div> </div> <div class="footer-col footer-col-sns"> <div class="footer-sns"> </div> </div> </div> </div> </footer> <div class="action action-style-0 action-color-0 action-pos-1" style="bottom:15%;"> <div class="action-item gotop j-top"> <i class="web-icon wi action-item-icon"><svg aria-hidden="true"> <use xlink:href="#wi-arrow-up-2"></use> </svg></i></div> </div> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?79e4e485d34c6fc717489eaa10b314e3"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </div> <script>var _web_js={};</script> <script src="/skin/js/index.js"></script> </body> </html>