快速了解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模型_第1张图片

HTML DOM中通过不同类型节点来表示, Document是每个文档的根节点。这里的document只有一个子节点,称之为文档元素(Element)。Element表示元素类型的节点,Text表示文本类型的节点。

节点类型

DOM 的最小组成单位叫做节点(node)。上面的节点树中,每一段都由不同类型的节点组成。节点的类型有如下几种:

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> <p><code>URL</code>与<code>domain</code>属性是相互关联的。</p> <h2>Element</h2> <p>Element类型用于表现XML或HTML元素,提供对元素标签名、子节点及特性的访问。例如<code><body></code>和<code><div></code>等。<code>Element</code>节点具有以下特征:</p> <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> <p>要访问元素的标签名,可以使用<code>nodeName</code>属性,也可以使用<code>tagName</code>属性;这两个属性会返回相同值。</p> <p>获取<code><div id="divId"></div></code>的标签名:</p> <pre><code class="javascript">var div = document.getElementById("divId"); console.log(div.tagName); // DIV console.log(div.tagName == div.nodeName); // true</code></pre> <h3>特性和属性</h3> <p>所有HTML元素都由<code>HTMLElement</code>类型表示,不能直接通过这个类型,也是通过它的子类型来表示。<code>HTMLElement</code>类型直接继承自<code>Element</code>并添加了一些属性。每个HTML元素中的特性(例如<code><div id="d1" title="附加信息" lang="en" class="container"></code>中的<code>id</code>、<code>class</code>等)会自动变成DOM对象的属性(<code>class</code>特性与<code>className</code>属性对应)。这些都可以通过<code>div.id</code>等获取并赋值。</p> <p>一个元素中的<code>id</code>等是标准的特性,但也有非标准的特性不能使用<code>div.id</code>方式获取。那么要用什么方法来访问非特性。</p> <p><code>DOM</code>主要提供了几个方法用于对任何特性进行操作,分别是:</p> <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> <pre><code class="html"><div id="d1" title="附加信息" lang="en" class="container main" plug-add="添加的非标准的特性"></code></pre> <p>以上面的HTML为例,使用这几种方法。</p> <pre><code class="javascript">var div = document.getElementById('d1'); div.getAttribute('title'); // 附加信息 div.hasAttribute('plug-add'); // true div.setAttribute('title', '修改附加信息'); div.removeAttribute('plug-add');</code></pre> <p>有两类特殊的特性,虽有对应的属性名,但属性的值与<code>getAttribute()</code>返回的值并不相同。</p> <p>第一类特性就是<code>style</code>,用于通过CSS为元素指定样式。通过<code>getAttribute()</code>返回的<code>style</code>中包含的是CSS文本,而通过属性返回的是一个对象。</p> <p>第二类特性是<code>onclick</code>这样的事件处理。如果通过<code>getAttribute()</code>返回的是相应代码的字符串。而访问<code>onclick</code>属性返回的是JavaScript函数(如果未指定相应特性,返回的是<code>null</code>)。</p> <h3>attributes属性</h3> <p><code>Element</code>类型的<code>attributes</code>属性返回该元素所有属性节点的一个集合,该集合是一个"动态"的<code>NamedNodeMap</code>对象。<code>NamedNodeMap</code>对象拥有下列方法。</p> <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> <p><code>attributes</code>属性包含一系列节点,在节点中<code>节点名称-nodeName 节点值-nodeValue</code>。</p> <pre><code class="javascript">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></pre> <p>而<code>removeNamedItem()</code>方法与<code>removeAttribute()</code>方法都是将给定名称的特性删除,唯一区别就是<code>removeAttribute()</code>没有返回值,<code>removeNamedItem()</code>返回被删除特性的<code>Attr</code>节点。</p> <pre><code class="javascript">var oldAttr = element.attributes.removeNamedItem('id');</code></pre> <p><code>setNamedItem()</code>方法为<code>Element</code>添加一个新特性:</p> <pre><code class="javascript">element.attributes.setNamedItem(newAttr);</code></pre> <p>一般情况下<code>getAttribute()</code>、<code>removeAttribute()</code>和<code>setAttribute()</code>方法就够使用了,但想要遍历元素的特性,<code>attributes</code>属性倒是比较方便。下面展示如果迭代元素中每一个特性并将它们以<code>name="value" name="value"</code>这样的字符串格式。</p> <pre><code class="javascript">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 = attrs[i].nodeValue; pairs.push(attrName + "=\"" + attrValue + "\""); } } return pairs.join(" "); }</code></pre> <h3>classList</h3> <p><code>className</code>属性用于操作类名,但<code>className</code>是一个字符串,修改后要设置整个字符串的值。</p> <p>HTML5扩展了<code>classList</code>属性实现类名的操作。该属性返回<code>DOMTokenList</code>集合。定义了几个方法:</p> <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> <h2>Attr</h2> <p><code>Attr</code>类型在<code>DOM</code>表示元素特性。特性是位于元素<code>attributes</code>属性中的节点。具有下列特征:</p> <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> <p>特性节点不被认为是<code>DOM</code>文档树的一部分。最常使用<code>getAttrubute()</code>、<code>setAttribute()</code>和<code>removeAttribute()</code>方法,很少直接引用特性节点。</p> <p><code>Attr</code>对象有3个属性:</p> <ul> <li><code>name</code>,特性名称,与<code>nodeName</code>的值相同。</li> <li><code>value</code>,特性值,与<code>nodeValue</code>的值相同。</li> <li><code>specified</code>,布尔值,用于区分特性在代码中是指定的还是默认的。</li> </ul> <p>如果要为元素添加特性,可以使用<code>document.createAttribute(localName)</code>方法,创建名为<code>localName</code>的特性节点。例如,要为元素添加<code>align</code>特性,可以使用下列代码:</p> <pre><code class="javascript">var attr = document.createAttribute("align"); attr.value = "left"; element.setAttributeNode(attr); alert(element.attributes["align"].value); //"left" alert(element.getAttributeNode("align").value); //"left" alert(element.getAttribute("align")); //"left"</code></pre> <h2>Text</h2> <p>文本节点由<code>Text</code>类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。<code>Text</code>节点具有以下特征:</p> <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> <p>可以通过<code>nodeValue</code>属性或<code>data</code>属性访问<code>Text</code>节点中包含的文本,这两个属性中包含的值相同。对<code>nodeValue</code>的修改也会通过<code>data</code>反映出来,反之亦然。使用下列方法可以操作节点中的文本。</p> <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> <p>除了这些方法外,文本节点还有一个<code>length</code>属性,保存着节点中字符的数目。而且,<code>nodeValue.length</code>和<code>data.length</code>中也保存着同样的值。</p> <p>修改文本节点的结果会立即得到反映。因此字符串会经过HTML(或XML,取决于文档类型)编码。</p> <p>使用<code>document.createTextNode()</code>可以创建文本节点,在<code>DOM创建</code>中会讲述它。</p> <h2>Comment</h2> <p>注释在DOM中是通过<code>Comment</code>类型来表示的。<code>Comment</code>节点具有下列特征:</p> <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> <p><code>Comment</code>类型与<code>Text</code>类型继承自相同的基类,因此它拥有除<code>splitText()</code>之外的所有字符串操作方法。与<code>Text</code>类型相似,也可以通过<code>nodeValue</code>或<code>data</code>属性取得注释的内容。</p> <p>获取<code><div id="divId"><!--A comment--></div></code>代码中的注释:</p> <pre><code class="javascript">var div = document.getElementById("divId"); var comment = div.firstChild; console.log(comment.data); // A comment</code></pre> <p>如果想创建注释节点,可以使用<code>document.createComment(data)</code>方法创建。</p> <pre><code class="javascript">var comment = document.createComment("Create a comment node");</code></pre> <p>浏览器不会识别位于<code></html></code>标签后面的注释。一定保证访问的注释节点位于<code><html></html></code>之间。</p> <h2>CDATASection</h2> <p><code>CDATASection</code>类型只针对基于XML文档,表示的是<code>CDATA</code>区域。与<code>Comment</code>类似,<code>CDATASection</code>类型继承自<code>Text</code>类型,因此拥有除<code>splitText()</code>之外的所有字符串操作方法。<code>CDATASection</code>节点具有以下特征:</p> <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> <p><code>CDATA</code>区域只会出现在XML文档中,因此多数浏览器都会把<code>CDATA</code>区域错误地解析为<code>Comment</code>或<code>Element</code>。以下面的代码为例:</p> <pre><code class="html"><div id="divId"><![CDATA[This is content.]]></div></code></pre> <p>这个例子中的<code><div></code>元素应该包含一个<code>CDATASection</code>节点。可是,四大主流浏览器无一能够这样解析它。即使对于有效的XHTML页面,浏览器也没有正确地支持嵌入的<code>CDATA</code>区域。</p> <p>在真正的XML文档中,可以使用<code>document.createCDataSection()</code>来创建<code>CDATA</code>区域,只需为其传入节点的内容即可。</p> <h2>DocumentType</h2> <p><code>DocumentType</code>类型在Web浏览器中并不常用。<code>DocumentType</code>包含着与文档有关的<code>doctype</code>有关的所有信息,它具有下列特征:</p> <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> <p><code>DOM 1级</code>规定的<code>DocumentType</code>对象不能动态创建,只通过解析文档代码的方式来创建。支持<code>DocumentType</code>的浏览器会把它保存在<code>document.doctype</code>中。</p> <p><code>DocumentType</code>对象在<code>DOM 1级</code>中有3个属性:</p> <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> <p>浏览器中一般是<code>HTML</code>或<code>XHTML</code>类型的文档。所以<code>entities</code>和<code>notations</code>都是空列表。只有<code>name</code>属性有用。</p> <pre><code class="html"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"></code></pre> <p>在这里,<code>DocumentType</code>中的<code>name</code>属性保存的就是<code>HTML</code>。</p> <pre><code class="javascript">console.log(document.doctype.name); // HTML</code></pre> <h2>DocumentFragment</h2> <p><code>DocumentFragment</code>是文档片段,一种"轻量级"文档,可以包含和控制节点,但不像完整文档那样占用额外资源。可以将它作为"仓库"使用。具有下列特征:</p> <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> <p>使用<code>document.createDocumentFragment()</code>方法创建文档片段,如下所示:</p> <pre><code class="javascript">var fragment = document.createDocumentFragment();</code></pre> <p>继承了<code>Node</code>的所有方法,用于执行针对文档的<code>DOM</code>操作。可以通过<code>appendChild()</code>或<code>insertBefore()</code>添加到文档中相应位置,但本身不会成为文档树的一部分。来看下面的HTML 示例代码:</p> <pre><code class="html"><ul id="ulId"></ul></code></pre> <p>我们给<code><ul id=ulId></ul></code>添加3个列表项。可以使用文档片段来保存创建的列表项,一次性将它们添加到文档中,避免浏览器反复渲染。</p> <pre><code class="javascript">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></pre> <h1>DOM查找</h1> <p>现在有一段<code>html</code>页面模板</p> <pre><code class="html">... <style> .container { background-color: blue; width: 55%; height: 55%; } </style> ... <div class="container" id="divId1">Div Text One</div> <p class="container" id="pId1">P Text One</p> <a class="container" id="aId1">A Text One</a> <div class="container" id="divId2">Div Text Two</div> <form id="primary-form" action="#" method="get"> <p>UserName: <input type="text" name="input-name"></p> <p class="container">NickName: <input type="text" name="input-name"></p> <p>Email: <input type="text" name="input-email"></p> <input type="submit" value="Submit"> </form> ...</code></pre> <p>在该模板中,我们想要获取这些标签元素,可以使用<code>document</code>对象获取的几种方法:</p> <h3>id选择器</h3> <p><code>getElementById(elementId: string): HTMLElement | null;</code></p> <p>该方法返回匹配指定<code>id</code>属性的元素节点,如果不存在,则返回<code>null</code>。</p> <p>下面通过<code>id</code>选择器来获取<code>id</code>为<code>aId1</code>的元素:</p> <pre><code class="javascript">let div = document.getElementById("aId1"); console.log(div); // <a class="container" id="aId1">A Text One</a></code></pre> <p>注意:严格匹配,包括大小写。如果写成<code>document.getElementById("aid1")</code>,输出为<code>null</code>。</p> <h3>标签选择器</h3> <p><code>getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;</code></p> <p>该方法返回匹配指定HTML标签名的元素列表。返回的是一个类似数组对象(<code>HTMLCollection</code>实例),可以实时反映HTML文档的变化,如果不存在,则返回<code>null</code>。</p> <pre><code class="javascript">let inputs = document.getElementsByTagName('input'); console.log(inputs); /* HTMLCollection(4) [input, input, input, input, input-name: input, email: input]*/</code></pre> <p><span class="img-wrap"><a href="http://img.e-com-net.com/image/info9/7233ad3f6b2e44dc819a81be3a91f625.jpg" target="_blank"><img class="lazy" alt="快速了解JavaScript的DOM模型_第2张图片" title="" src="http://img.e-com-net.com/image/info9/7233ad3f6b2e44dc819a81be3a91f625.jpg" width="646" height="150" style="border:1px solid black;"></a></span></p> <p>这个对象可以使用<code>length</code>属性获取元素数量,使用数组语法或<code>item()</code>方法来访问HTMLCollection对象中的项。</p> <pre><code class="javascript">inputs.length; // 输出p标签的数量 inputs[0].id; // 输出p标签集合中第一个元素的id特性的名称 inputs.item(0).className; // 输出p标签接种中第一个元素的class特性的名称</code></pre> <p>还可以通过<code>namedItem()</code>方法根据元素的<code>name</code>特性获取集合中的项。</p> <pre><code class="javascript">var nameOfInput = inputs.namedItem("input-name");</code></pre> <p>也可以使用方括号语法来访问:</p> <pre><code class="javascript">var nameOfInput = inputs["input-name"];</code></pre> <p>要想取得文档中的所有元素,可以向getElementsByTagName()中传入<code>"*"</code>,表示"全部"。</p> <pre><code class="javascript">var allElements = document.getElementsByTagName("*");</code></pre> <h3>name选择器</h3> <p><code>getElementsByName(elementName: string): NodeListOf<HTMLElement>;</code></p> <p>该方法返回匹配<code>name</code>属性的所有元素,返回值是<code>NodeList</code>,如果不存在,则返回<code>null</code>。</p> <pre><code class="javascript">var names = document.getElementsByName("input-name"); console.log(names);</code></pre> <p><span class="img-wrap"><a href="http://img.e-com-net.com/image/info9/e4701947209c4d8f808c7ff6b8b2af56.jpg" target="_blank"><img class="lazy" alt="快速了解JavaScript的DOM模型_第3张图片" title="" src="http://img.e-com-net.com/image/info9/e4701947209c4d8f808c7ff6b8b2af56.jpg" width="523" height="119" style="border:1px solid black;"></a></span></p> <p>注意,这个选择器在不同浏览器的效果是不同的,比如在IE和Opera浏览器下,这个方法也会返回<code>id</code>属性为这个值的元素。在使用的时候,应该小心使用,尽量保证<code>name</code>不和其它元素的<code>id</code>一致。</p> <h3>类选择器</h3> <p><code>getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;</code>是HTML5中添加的方法。</p> <p>该方法返回匹配<code>class</code>属性的所有元素,返回值是<code>HTMLCollection</code>,如果不存在,则返回<code>null</code>。</p> <pre><code class="javascript">// 获取所有class中同时包含'red'和'test'的元素 var classes = document.getElementsByClassName("container"); console.log(classes);</code></pre> <p><span class="img-wrap"><a href="http://img.e-com-net.com/image/info9/c61e7c2a5f57496cb2873a347d91b95f.jpg" target="_blank"><img class="lazy" alt="快速了解JavaScript的DOM模型_第4张图片" title="" src="http://img.e-com-net.com/image/info9/c61e7c2a5f57496cb2873a347d91b95f.jpg" width="650" height="188" style="border:1px solid black;"></a></span></p> <p>可以接收包含一个或多个类名的字符串,传入的多个类名的先后顺序不重要。</p> <h2>Selectors API</h2> <p>W3C发起指定的标准,可使浏览器支持CSS查询。Selectors API的核心是两个方法:<code>querySelector()</code>和<code>querySelectorAll()</code>。兼容的浏览器中通过<code>Document</code>及<code>Element</code>节点类型的实例进行调用。</p> <h3>querySelector()方法</h3> <p><code>querySelector<E extends Element = Element>(selectors: string): E | null;</code></p> <p>该方法返回匹配指定选择符的第一个<code>HTMLElement</code>元素,如果不存在,则返回<code>null</code>。传入的<code>selectors</code>必须是有效的CSS选择器;如果选择器不合法,会引发<code>SYNTAX_ERR</code>异常。</p> <pre><code class="javascript">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></pre> <p><code>Document</code>和<code>Element</code>都可以调用<code>querySelector()</code>方法,只是<code>Document</code>会在文档元素的范围内查找匹配的元素;<code>Element</code>只会在该元素后代元素的范围内查找匹配的元素。</p> <h3>querySelectorAll()方法</h3> <p><code>querySelectorAll<E extends Element = Element>(selectors: string): NodeListOf<E>;</code></p> <p>该方法返回匹配指定选择符的元素列表,返回的对象是<code>NodeList</code>,如果不存在,则返回空的<code>NodeList</code>。传入的<code>selectors</code>必须是有效的CSS选择器;如果选择器不合法,会引发<code>SYNTAX_ERR</code>异常。</p> <pre><code class="javascript">// 获取id为"primary-form"中所有<p>元素 document.getElementById("primary-form").querySelectorAll("p"); // 获取类为"container"的所有元素 document.querySelectorAll(".container"); // 获取所有<form>元素中的所有<p>元素 document.querySelectorAll("form p");</code></pre> <p><span class="img-wrap"><a href="http://img.e-com-net.com/image/info9/15d88e192e8e492c9a944777e7c92022.jpg" target="_blank"><img class="lazy" alt="快速了解JavaScript的DOM模型_第5张图片" title="" src="http://img.e-com-net.com/image/info9/15d88e192e8e492c9a944777e7c92022.jpg" width="650" height="263" style="border:1px solid black;"></a></span></p> <h3>matches()方法</h3> <p>Selectors API Level 2规范为<code>Element</code>类型新增了一个方法:</p> <p><code>matches(selectors: string): boolean;</code></p> <p>该方法判断当前DOM节点是否能完全匹配指定选择符,如果匹配成功,返回<code>true</code>;匹配失败,返回<code>false</code>。</p> <pre><code class="javascript">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></pre> <p>注意,有些供应商会有自己实验性方法在<code>matchesSelector()</code>方法之前加些前缀。如果想使用这种方法,可以编写一个包装函数。</p> <pre><code class="javascript">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></pre> <p>当有的浏览器不支持<code>Element.matches()</code>或<code>Element.matchesSelector()</code>,但支持<code>document.querySelectorAll()</code>方法,可以有替代方案:</p> <pre><code class="javascript">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></pre> <h1>DOM遍历</h1> <p><code>Node</code>节点提供了几种属性,用于访问DOM节点。</p> <h3>parentNode</h3> <p><code>node.parentNode</code>属性用于返回指定节点的父节点。除<code>document</code>外,所有节点都有父节点,<code>document</code>对象的父节点为<code>null</code>。示例如下:</p> <pre><code class="javascript">document.getElementById('divId2').parentNode;</code></pre> <h3>childNodes</h3> <p><code>node.childNodes</code>属性用于返回指定节点的子结点的<code>Node</code>对象集合。示例如下:</p> <pre><code class="javascript">document.getElementById('primary-form').childNodes;</code></pre> <h3>firstChild/lastChild</h3> <p><code>node.firstChild</code>属性用于访问第一个子节点;<code>node.lastChild</code>属性用于访问最后一个子节点。如果要访问的节点不存在,则返回<code>null</code>。示例如下:</p> <pre><code class="javascript">document.getElementById('primary-form').firstChild document.getElementById('primary-form').lastChild;</code></pre> <h3>previousSibling/nextSibling</h3> <p><code>node.previousSibling</code>属性用于访问之前的同级节点;<code>node.nextSibling</code>属性用于访问之后的同级节点。具有相同父节点为同级节点,之前或之后表示它们在文档中出现的顺序。实例如下:</p> <pre><code class="javascript">document.getElementById('divId2').previousSibling; document.getElementById('divId2').nextSibling;</code></pre> <h3>ownerDocument</h3> <p><code>node.ownerDocument</code>属性用于返回元素的根节点,即:文档对象(<code>Document</code>)。通过这个属性,我们能够直接访问根节点而不必层层遍历。实例如下:</p> <pre><code class="javascript">document.getElementById('divId2').ownerDocument;</code></pre> <h2>Element Traversal</h2> <p>Element Traversal API 为DOM元素添加了以下5个属性。</p> <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> <p>支持的浏览器为DOM元素添加了这些属性,利用这些元素不必担心空白文档节点,从而可以更方便地查找DOM元素。</p> <h1>DOM操作</h1> <p>因为关系节点都是只读的,所以DOM提供了一些操作节点的方法。</p> <h3>appendChild()</h3> <p><code>node.appendChild(newChild)</code>方法用于向<code>childNodes</code>列表的末尾添加一个节点并返回新增的节点。</p> <pre><code class="javascript">var returnedNode = div.appendChild(newNode);</code></pre> <h3>insertBefore()</h3> <p><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>执行相同的操作。</p> <pre><code class="javascript">var returnedNode = div.insertBefore(newNode, div.lastChild);</code></pre> <h3>replaceChild()</h3> <p><code>node.replaceChild(newChild, oldChild)</code>方法将要替换的节点<code>oldChild</code>移除,并将要插入的节点<code>newChild</code>插入并占据其位置。实例如下:</p> <pre><code class="javascript">document.getElementById('divId2').replaceChild(newnode, oldnode);</code></pre> <p>在使用<code>replaceChild()</code>插入一个节点时,该节点的所有关系指针都会从被它替换的节点复制过来。被替换的节点仍然还在文档中,但它在文档中已经没有自己的位置了。</p> <h3>removeChild()</h3> <p>而如果只想移除而非替换节点,可以使用<code>node.removeChild(oldChild)</code>方法,该方法将要移除的节点<code>oldChild</code>移除,并返回移除的节点。</p> <pre><code class="javascript">var removedNode = node.removeChild(node.firstChild);</code></pre> <p>与使用<code>replaceChild()</code>方法一样,通过<code>removeChild()</code>移除的节点仍然为文档所有,只不过在文档中已经没有了自己的位置。</p> <p>上面介绍的四种方法操作的都是某个节点的子节点,要使用这几个方法必须先取得父节点。另外,并不是所有类型的节点都有子节点,如果在不支持子节点的节点上调用这些方法,将会导致错误发生。</p> <h1>DOM创建</h1> <p>DOM节点创建最常用的便是<code>document.createElement()</code>和<code>document.createTextNode()</code>方法。</p> <h3>createElement()</h3> <p><code>document.createElement(tagName)</code>方法根据指定<code>tagName</code>标签名创建新元素节点,返回一个<code>HTMLElement</code>对象。标签名在HTML文档中不区分大小写,在XML(包括XHTML)文档中区分大小写。例如,创建一个<code><p></code>元素。</p> <pre><code class="javascript">var p = document.createElement('p');</code></pre> <p>在使用<code>createElement()</code>方法创建新元素的同时,也为新元素设置了<code>ownerDocument</code>属性。</p> <h3>createTextNode()</h3> <p><code>document.createTextNode(data: string)</code>方法根据指定<code>data</code>文本创建新文本节点。作为参数的文本按照HTML或XML的格式进行编码。</p> <pre><code class="javascript">var textNode = document.createTextNode("<h4>Hello </h4> world!");</code></pre> <p>在创建新文本节点的同时,也会为其设置<code>ownerDocument</code>属性。</p> <h3>cloneNode()</h3> <p><code>node.cloneNode(deep)</code>方法用于对调用这个方法的节点创建一个完全相同的副本。<code>deep</code>是布尔值,设置是否执行深复制。默认为<code>false</code>,执行浅复制(只复制节点本身);当为<code>true</code>时,执行深复制(复制节点及其整个子节点树)。</p> <pre><code class="javascript">var node = document.getElementById('divId2').lastChild.cloneNode(true);</code></pre> <p>这些用于创建节点和复制节点的方法,创建或复制的节点并不会出现在文档中,需要通过<code>appendChild()</code>、<code>insertBefore()</code>或<code>replaceChild()</code>将它添加到文档中。</p> <pre><code class="javascript">document.getElementById('divId2').appendChild(node);</code></pre> <p>不管是<code>createElement()</code>、<code>createTextNode()</code>或者<code>cloneNode()</code>三种的哪种方法,创建新的节点都未被添加到文档树中。可以使用上面介绍的<code>appendChild()</code>、<code>insertBefore()</code>或<code>replaceChild()</code>方法将新节点添加到文档树中。</p> <p>一旦将节点添加到文档树中,浏览器就会立即呈现。</p> <p>一旦使用<code>appendChild()</code>等方法插入相邻的同胞文本节点时,会导致相邻文本节点混乱。</p> <p>而在一个包含两个或多个文本节点的父元素上调用<code>normalize()</code>方法,就会将所有文本节点合并成一个节点。</p> <pre><code class="javascript">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></pre> <p>浏览器在解析文档时永远不会创建相邻的文本节点。这种情况只会作为执行DOM操作的结果出现。</p> <p>还有一个与<code>normalize()</code>相反的方法<code> splitText(offset)</code>:将一个文本节点分成两个文本节点。</p> <pre><code class="javascript">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></pre> <p>更多内容请关注公众号「海人为记」</p> <p><span class="img-wrap"><img class="lazy" alt="image" title="image" src="http://img.e-com-net.com/image/info9/e03ce80427c7481da6a70ffa5aa3e0d9.jpg" width="0" height="0"></span></p> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1432718117884252160"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(程序员javascript前端)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835501948011376640.htm" title="使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)" target="_blank">使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)</a> <span class="text-muted">编程经验分享</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/1.htm">开发工具</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>目录前言基本使用教程新建远程连接连接主机自定义命令路由追踪前言后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器,总而言之,程序员不可能直接和服务器直接操作,一般都是通过ssh连接来登录服务器。刚接触远程连接时,使用的是XSHELL来远程连接服务器,连接上就能够操作远程服务器了,但是仅用XSHELL并没有上传下载文件的功能</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835497283932745728.htm" title="利用LangChain的StackExchange组件实现智能问答系统" target="_blank">利用LangChain的StackExchange组件实现智能问答系统</a> <span class="text-muted">nseejrukjhad</span> <a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>利用LangChain的StackExchange组件实现智能问答系统引言在当今的软件开发世界中,StackOverflow已经成为程序员解决问题的首选平台之一。而LangChain作为一个强大的AI应用开发框架,提供了StackExchange组件,使我们能够轻松地将StackOverflow的海量知识库集成到我们的应用中。本文将详细介绍如何使用LangChain的StackExchange组件</div> </li> <li><a href="/article/1835494131535802368.htm" title="人工智能时代,程序员如何保持核心竞争力?" target="_blank">人工智能时代,程序员如何保持核心竞争力?</a> <span class="text-muted">jmoych</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作,也有人认为AI是提高效率的得力助手。面对这一趋势,程序员应该如何应对?是专注于某个领域深耕细作,还是广泛学习以适应快速变化的技术环境?又或者,我们是否应该将重点转向AI无法轻易替代的软技能?让我们一起探讨程序员</div> </li> <li><a href="/article/1835425229535539200.htm" title="如何自学软件编程?零基础自学编程入门指南" target="_blank">如何自学软件编程?零基础自学编程入门指南</a> <span class="text-muted">_pangzi</span> <div>前言零基础自学编程的动力是什么?在开启学习编程之路的时候必须搞清楚自己为什么要学编程?是因为工资高?还是对编程有浓厚的兴趣?还有自己有一定的编程基础想要继续提升自己?其实对于这个问题需要具体分析,如果是单纯看到程序员工资高,而自己本身并没有什么兴趣,那我不建议自学,可以选择参加培训或者不要进入编程领域不然自己学不会没有获得高薪,反而浪费了大把的时间,如果方法不对,反而会打击自信心。下面小编针对学习</div> </li> <li><a href="/article/1835424412342513664.htm" title="ChatGPT 高效学习套路揭秘:让知识获取事半功倍的秘诀" target="_blank">ChatGPT 高效学习套路揭秘:让知识获取事半功倍的秘诀</a> <span class="text-muted">kkai人工智能</span> <a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AA%92%E4%BD%93/1.htm">媒体</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>最近这段时间,AI热潮因ChatGPT的火爆再次掀起。如今,网上大部分内容都在调侃AI,但很少有人探讨如何正经使用ChatGPT做事情。作为一名靠搜索引擎和GitHub自学编程的开发者,第一次和ChatGPT深度交流后,我就确信:ChatGPT能够极大提高程序员学习新技术的效率。使用ChatGPT一个月后,我越发感受到它的颠覆性。因此,我想从工作和学习的角度,分享它的优势及我的一些使用技巧,而非娱</div> </li> <li><a href="/article/1835400841788485632.htm" title="程序员如何在AI时代保持核心竞争力" target="_blank">程序员如何在AI时代保持核心竞争力</a> <span class="text-muted">nfgo</span> <a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>程序员如何在AI时代保持核心竞争力随着AIGC(如ChatGPT、MidJourney、Claude等)大语言模型的相继涌现,AI辅助编程工具逐渐普及,程序员的工作方式正在发生深刻的变革。AI不仅能够自动生成代码,还能优化、调试、甚至提出解决方案。这一趋势让许多人担心:AI会不会最终取代部分编程工作?然而,也有人认为AI是提升效率的得力助手。那么,程序员在这个AI崛起的时代该如何应对?是专注某个领</div> </li> <li><a href="/article/1835400085224124416.htm" title="程序员架构师主要是做什么_程序员架构师:职责、技能与挑战" target="_blank">程序员架构师主要是做什么_程序员架构师:职责、技能与挑战</a> <span class="text-muted">绿色小猪</span> <div>免费备考资料(2024年11月软考):历年试题+视频课合集+电子讲义点击领取>>>免费刷题:2024年11月软考备考刷题点此进入>>>程序员架构师的角色定位在软件开发领域,程序员架构师是一个至关重要的角色。他们不仅需要深入理解业务需求,还要将其转化为技术上的解决方案。程序员架构师是项目中的技术领航者,负责制定和维护软件系统的整体架构,确保系统的可扩展性、可维护性和性能。他们的工作涉及从概念化到实现</div> </li> <li><a href="/article/1835387473346260992.htm" title="2020年最新程序员职业发展路线指南,超详细!" target="_blank">2020年最新程序员职业发展路线指南,超详细!</a> <span class="text-muted">编程流川枫</span> <a class="tag" taget="_blank" href="/search/11/1.htm">11</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/IT/1.htm">IT</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E4%B8%9A/1.htm">职业</a> <div>【文章来源微信公众号:每天学编程】01、程序员的特性技术出身的职场人特性很明显,与做市场、业务出身的职场人区别尤其明显。IT行业中常见的一些职场角色:老板、项目经理、产品经理、需求分析师、设计师、开发工程师、运维工程师等。开发工程师具有如下特征:1、逻辑思维清晰、严谨和细腻;但是有时不容易转弯,有些程序员容易较劲、钻牛角尖。2、性格偏内向、不善于沟通、表达和交际;但是在网络聊天工具上,有些显为幽默</div> </li> <li><a href="/article/1835366923651608576.htm" title="40岁的java程序员,还有出路吗?" target="_blank">40岁的java程序员,还有出路吗?</a> <span class="text-muted">cesske</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>目录前言一、现状与挑战二、出路与机遇三、案例分析与启示四、结语前言40岁Java程序员的出路:挑战与机遇并存在科技日新月异的今天,IT行业始终保持着高速的发展态势,而Java作为其中的重要一员,其地位依然稳固且充满挑战。对于一位40岁的Java程序员而言,面对职业生涯的“中年危机”,是否还有出路?本文将从多个维度探讨这一问题,旨在为这一群体提供思考和启示。一、现状与挑战职场竞争加剧随着技术的不断发</div> </li> <li><a href="/article/1835343558979186688.htm" title="程序员单身" target="_blank">程序员单身</a> <span class="text-muted">单身总动员</span> <div>如何判断一个男人会不会出轨?容易知足的男人,相对靠谱。他们不会想要通过征服很多异性来证明自己的魅力,他觉得有你一个就够了,多了他也没精力去讨好;他们也特别踏实,只会用行动来向你证明自己。专注于某项兴趣的男人,相对靠谱。比如小编的朋友,是个程序员,世人眼中的闷骚男,他专注于编程,每天24小时除了吃饭睡觉,脑子里想的都是代码,空间、微博也全是代码,最大的业余爱好就是打打游戏,他对老婆就特别专一。综上所</div> </li> <li><a href="/article/1835338183995387904.htm" title="Python开发游戏?也太好用了吧" target="_blank">Python开发游戏?也太好用了吧</a> <span class="text-muted">七步编程</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%85%B7/1.htm">工具</a><a class="tag" taget="_blank" href="/search/Github/1.htm">Github</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store当然可以啦!现在日常能够用到和想到的场景,绝大多数都可以用Python实现。效果怎么样暂且不提,但是得益于丰富的第三方工具包,的确让Python能够很容易处理各种各样的场景。对于游戏开发也是这样,如果真的要想商业化,Python在游戏开发方面肯定没办法和C++相提并论,但是如果用于日常学习和自</div> </li> <li><a href="/article/1835173325173780480.htm" title="超级无敌详细的Mysql数据库笔记(基础篇版)" target="_blank">超级无敌详细的Mysql数据库笔记(基础篇版)</a> <span class="text-muted">当大哥爱上学习</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>注:本篇笔记根据黑马程序员MySQL数据库入门到精通的内容所创建,适合复习和结合该视频学习使用。一.基础1.关系型数据库(RDBMS)概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。特点:使用表存储数据,格式统一,便于维护使用SQL语言操作,标准统一,使用方便。2.SQLSQL通用语法SQL语句可以单行或多行书写,以分号结尾.SQL语句可以使用空格/缩进来增强语句的可读性。MySQ</div> </li> <li><a href="/article/1835163876656771072.htm" title="函数可以返回数组吗?有哪3种返回方法呢?如代码种的func2、func3、func4都可以返回数组。func1为什么会报错呢?关于返回数组需要注意哪些呢?" target="_blank">函数可以返回数组吗?有哪3种返回方法呢?如代码种的func2、func3、func4都可以返回数组。func1为什么会报错呢?关于返回数组需要注意哪些呢?</a> <span class="text-muted">神笔馬良</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>问题描述:根据下列代码回答下列问题。//Createdby黑马程序员.#include"iostream"usingnamespacestd;/**函数返回数组,就是返回指针,要注意:*-不可返回局部数组(在函数内创建的数组),如果要返回需要*-static修饰*-动态内存创建(new[]、delete[])*-返回全局(在函数外创建的对象)**不推荐函数返回数组,因为要么手动delete、要么s</div> </li> <li><a href="/article/1835163031806504960.htm" title="有个程序员的老公是种什么体验,嫁给程序员,我超级后悔!" target="_blank">有个程序员的老公是种什么体验,嫁给程序员,我超级后悔!</a> <span class="text-muted">前端小芳</span> <div>1:在我还没长开的时候,就常听人说,有两种男人不能嫁:一种是兵哥哥,另一种是程序员。前者见不着,后者死的早。一想到不等头发花白,就要踟蹰独行,我就害怕的厉害。所以,很长一段时间,都对身边的程序员们避而远之。甚至做梦也没有想到,自己会成为程序员的老婆,而且一做就是好多年。2:那天全市停水,为了给部门同事解渴。我气喘吁吁地从超市搬来10瓶矿泉水。“注意性价比啊,一瓶500毫升的水3块,你30块买了5升</div> </li> <li><a href="/article/1835153854530940928.htm" title="Github官方桌面客户端" target="_blank">Github官方桌面客户端</a> <span class="text-muted">zwb_jianshu</span> <div>GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名gitHub。如果你是一名程序员,那么一定会听过或用过现在最流行的版本控制工具GIT!而GitHub.com则是目前全球最热门的公共代码仓库网站,多到数不清的知名开源项目源代码都是托管在它上面。GitHubDesktop免费的Github官方桌面客户端首先,我先对GitHub来一个简单的介绍,Gi</div> </li> <li><a href="/article/1835140682822545408.htm" title="一文搞懂应用架构的3个核心概念" target="_blank">一文搞懂应用架构的3个核心概念</a> <span class="text-muted">公众号-架构师汤师爷</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">架构设计</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/SaaS/1.htm">SaaS</a> <div>如果你是一名业务开发,你可能要说,我整天就是做CRUD(增删改查),哪里需要了解什么应用架构设计?经常有人说,程序员35岁之后很容易陷入瓶颈,被行业淘汰,我觉得原因其实就在此。有些朋友在写代码的时候,可能没有太多考虑非功能性的需求、扩展性,只是完成功能,觉得能用就好。做事情的时候,也没有长远的规划,只是把眼前的事情做好就满足了。我面试过很多大龄候选人,他们的简历长达十几页,项目经历有几十个。然而,</div> </li> <li><a href="/article/1835097183804813312.htm" title="oracle数据库安装和配置详细讲解" target="_blank">oracle数据库安装和配置详细讲解</a> <span class="text-muted">程序员小羊!</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>大家好,我是程序员小羊!前言:Oracle数据库是全球广泛使用的关系型数据库管理系统(RDBMS),提供高性能、可靠性、安全性和可扩展性,广泛应用于企业关键任务系统。下面详细介绍如何在CentOS系统上安装和配置Oracle数据库。1.前提条件1.1硬件要求内存:最小1GB,推荐2GB以上。硬盘:至少10GB的可用空间,视具体应用需求而定。1.2软件要求操作系统:CentOS7或CentOS8(确</div> </li> <li><a href="/article/1835085084538007552.htm" title="切换淘宝最新镜像源npm详细讲解" target="_blank">切换淘宝最新镜像源npm详细讲解</a> <span class="text-muted">程序员小羊!</span> <a class="tag" taget="_blank" href="/search/%E6%9D%82%E6%96%87/1.htm">杂文</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>大家好,我是程序员小羊!前言:在中国大陆,npm(NodePackageManager)的默认源由于网络限制,速度可能较慢。为了解决这个问题,淘宝提供了一个镜像源,它同步了npm的官方仓库,并显著提升了访问速度。切换到淘宝的镜像源可以加快npm包的下载速度。下面是详细的切换步骤及相关说明。1.查看当前npm源在更改npm源之前,查看当前npm使用的源地址:npmconfiggetregistry默</div> </li> <li><a href="/article/1835017631472644096.htm" title="一文理解 Python 中的环境变量" target="_blank">一文理解 Python 中的环境变量</a> <span class="text-muted">简讯Alfred</span> <a class="tag" taget="_blank" href="/search/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6/1.htm">和我一起零基础学</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E6%98%8Epython%E6%95%99%E7%A8%8B/1.htm">简明python教程</a><a class="tag" taget="_blank" href="/search/%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6python/1.htm">零基础学python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/1.htm">环境变量</a> <div>你好,我是简讯!一枚野生程序员。热爱编程,但目前的工作与编程毫无关系。正在尝试各种副业,目前有做:红包封面商城:如何利用红包封面打造副业购物平台赚取佣金:利用淘宝京东等平台优惠券赚取佣金编辑器使用Neovim多一点,如果你也喜欢使用Nvim,我们可以一起交流。我的Nvim配置:https://github.com/alpha87/nvim。个人公众号经常会分享一些编程相关的文章,还有一些我已经操作</div> </li> <li><a href="/article/1834998714993831936.htm" title="Java中的垃圾回收机制是如何工作的?" target="_blank">Java中的垃圾回收机制是如何工作的?</a> <span class="text-muted">Good_tea_h</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>Java中的垃圾回收机制(GarbageCollection,GC)是Java虚拟机(JVM)的一个重要组成部分,它负责自动管理内存的分配和释放,以减轻程序员在内存管理方面的负担,并防止内存泄漏和内存溢出等问题。一、垃圾回收机制的核心思想Java的垃圾回收机制主要基于两个核心思想:标记和回收。标记:垃圾收集器会定期自动扫描内存中的对象,根据特定的算法(如可达性分析法)来判断哪些对象已经不再被程序使</div> </li> <li><a href="/article/1834996321145155584.htm" title="Android app后台运行休眠仍然可以运行的方法(确保一直运行)" target="_blank">Android app后台运行休眠仍然可以运行的方法(确保一直运行)</a> <span class="text-muted">2401_84102689</span> <a class="tag" taget="_blank" href="/search/2024%E5%B9%B4%E7%A8%8B%E5%BA%8F%E5%91%98%E5%AD%A6%E4%B9%A0/1.htm">2024年程序员学习</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。</div> </li> <li><a href="/article/1834980508497440768.htm" title="我们都是小小发明家" target="_blank">我们都是小小发明家</a> <span class="text-muted">蜻蜓之旅</span> <div>说到健康码,相信大家都再熟悉不过了。让人惊奇的是,发明它的并不是程序员而是杭州民警钟毅带着他的团队研发出来的。以前只要听到发明家,就觉得特别高大上,好像离我们普通人比较遥远。以前我也这么认为,直到看到了这本《超能编程队4:我是发明家》,才明白原来发明家就在我们身边,就像那位民警一样,他并不是那么遥不可及的。他可以是我们生活中的每一个人,只要你肯创造、肯想象、肯实践,愿意为大家服务、愿意为社会创造价</div> </li> <li><a href="/article/1834974383685332992.htm" title="程序员35岁会失业吗?" target="_blank">程序员35岁会失业吗?</a> <span class="text-muted">Good kid.</span> <a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长,技术更新换代的速度会使得资深程序员难以跟上;而另一些人则认为,丰富的经验和深厚的技术积累是年轻程序员无法比拟的宝贵财富。那么,让我们来探讨一下这个话题。技术更新与个人适应性确实,技术的快速发展对程序员的职业技能有一定的影响。新的编程语言、框架和工具不断涌现,程序员需要不断学习和适应这</div> </li> <li><a href="/article/1834972741753729024.htm" title="关于Echarts的一些设置总结" target="_blank">关于Echarts的一些设置总结</a> <span class="text-muted">夏之小星星</span> <a class="tag" taget="_blank" href="/search/echarts/1.htm">echarts</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>最近领导让我一个偏后端程序员画各种数据展示echarts页面,遇到好多问题在此记录一下,未完待续。。。ps:不喜欢画页面啊啊啊啊啊,以前公司这些都是ui的活啊啊啊啊,折磨死我啦啊啊啊啊一、柱形图1、echarts如何设置柱形颜色渐变在option加color属性option={color:{type:'linear',//x=0,y=1,柱子的颜色在垂直方向渐变x:0,y:1,colorStops</div> </li> <li><a href="/article/1834962655085948928.htm" title="Python教程:面向对象" target="_blank">Python教程:面向对象</a> <span class="text-muted">无敌开心</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>模块3:Python高级模块概述本课程旨在介绍Python编程语言中的面向对象编程(OOP)概念和技术。学生将学习如何使用类、对象、继承、多态等OOP的关键要素来构建灵活、可重用和可扩展的代码。通过实际编程练习和项目,学生将提高他们的编程技能,学会设计和实现面向对象的解决方案。面向对象编程是在面向过程编程的基础上发展来的,它比面向过程编程具有更强的灵活性和扩展性。面向对象编程是程序员发展的分水岭,</div> </li> <li><a href="/article/1834954954872287232.htm" title="如果面试官问你CAS,你还这么答,可能就要回去等通知了" target="_blank">如果面试官问你CAS,你还这么答,可能就要回去等通知了</a> <span class="text-muted">爱玛士</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>前言大家好,我是JAVA高级开发之路,一个总在为粉丝解决面试题的程序员。最近有几个粉丝说在面试面试中遇到了CAS的问题,连着几次面试都没有让面试官满意,区区CAS底层源码,怎能难倒咱们这届程序员们呢?都支棱起来,跟我一起来搞定CAS底层源码。什么是CASCAS的全称是Compare-And-Swap,它是CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原</div> </li> <li><a href="/article/1834937981719375872.htm" title="程序员被公司开除,隔阵子领导命令回公司讲解代码,网友纷纷支招" target="_blank">程序员被公司开除,隔阵子领导命令回公司讲解代码,网友纷纷支招</a> <span class="text-muted">编程彭于晏</span> <div>对于很多已经步入社会已经开始上班的人来说,离职是一件很常见的事情。有的是员工自己要求离职,可能是有更好的就业机会,也可能是有私事处理,不能继续工作;有的则是企业开除员工,或者是因为员工工作不努力,划水,或者是公司结构调整,需要裁员。但是不管是哪种原因吧,员工在离职前都需要和后来接任的同事将自己手上负责的工作进行交接,包括财务信息、已完成工作、未完成工作等,一方面是给曾经的公司和同事留下一个好印象,</div> </li> <li><a href="/article/1834924157108842496.htm" title="编程小技巧" target="_blank">编程小技巧</a> <span class="text-muted">风的低语</span> <div>40条真言,希望对进阶中的程序朋友有所帮助。1、重构是程序员的主力技能。2、工作日志能提升脑容量。3、先用profiler调查,才有脸谈优化。4、注释贵精不贵多。杜绝大姨妈般的“例注”。漫山遍野的碎碎念注释,实际就是背景噪音。5、普通程序员+google=超级程序员。6、单元测试总是合算的。7、不要先写框架再写实现。最好反过来,从原型中提炼框架。8、代码结构清晰,其它问题都不算事儿。9、好的项目作</div> </li> <li><a href="/article/1834919786136563712.htm" title="基于nodejs+vue的美妆彩妆网站的设计与实现(源码+LW+调试文档+讲解等)" target="_blank">基于nodejs+vue的美妆彩妆网站的设计与实现(源码+LW+调试文档+讲解等)</a> <span class="text-muted">程序员gelei</span> <a class="tag" taget="_blank" href="/search/nodejs%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E9%A1%B9%E7%9B%AE/1.htm">nodejs毕业设计项目</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>目录:博主介绍:完整视频演示:系统技术介绍:后端Java介绍前端框架Vue介绍具体功能截图:部分代码参考:Mysql表设计参考:项目测试:项目论文:为什么选择我:源码获取:博主介绍:博主:程序员gelei:全网拥有20W+粉丝、CSDN作者、博客专家、全栈领域优质创作者、平台优质Java创作者、专注于Java、小程序、python、安卓技术领域和毕业项目实战✌Java精品实战案例《1000套》20</div> </li> <li><a href="/article/118.htm" title="异常的核心类Throwable" target="_blank">异常的核心类Throwable</a> <span class="text-muted">无量</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/1.htm">异常处理</a><a class="tag" taget="_blank" href="/search/exception/1.htm">exception</a> <div>java异常的核心是Throwable,其他的如Error和Exception都是继承的这个类 里面有个核心参数是detailMessage,记录异常信息,getMessage核心方法,获取这个参数的值,我们可以自己定义自己的异常类,去继承这个Exception就可以了,方法基本上,用父类的构造方法就OK,所以这么看异常是不是很easy package com.natsu; </div> </li> <li><a href="/article/245.htm" title="mongoDB 游标(cursor) 实现分页 迭代" target="_blank">mongoDB 游标(cursor) 实现分页 迭代</a> <span class="text-muted">开窍的石头</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>上篇中我们讲了mongoDB 中的查询函数,现在我们讲mongo中如何做分页查询      如何声明一个游标        var mycursor = db.user.find({_id:{$lte:5}});       迭代显示游标数</div> </li> <li><a href="/article/372.htm" title="MySQL数据库INNODB 表损坏修复处理过程" target="_blank">MySQL数据库INNODB 表损坏修复处理过程</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>最近mysql数据库经常死掉,用命令net stop mysql命令也无法停掉,关闭Tomcat的时候,出现Waiting for N instance(s) to be deallocated 信息。查了下,大概就是程序没有对数据库连接释放,导致Connection泄露了。因为用的是开元集成的平台,内部程序也不可能一下子给改掉的,就验证一下咯。启动Tomcat,用户登录系统,用netstat -</div> </li> <li><a href="/article/499.htm" title="剖析如何与设计人员沟通" target="_blank">剖析如何与设计人员沟通</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>最近做图烦死了,不停的改图,改图……。烦,倒不是因为改,而是反反复复的改,人都会死。很多需求人员不知该如何与设计人员沟通,不明白如何使设计人员知道他所要的效果,结果只能是沟通变成了扯淡,改图变成了应付。 那应该如何与设计人员沟通呢? 我认为设计人员与需求人员先天就存在语言障碍。对一个合格的设计人员来说,整天玩的都是点、线、面、配色,哪种构图看起来协调;哪种配色看起来合理心里跟明镜似的,</div> </li> <li><a href="/article/626.htm" title="qq空间刷评论工具" target="_blank">qq空间刷评论工具</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div> var a=document.getElementsByClassName('textinput'); var b=[]; for(var m=0;m<a.length;m++){ if(a[m].getAttribute('placeholder')!=null) b.push(a[m]) } var l</div> </li> <li><a href="/article/753.htm" title="S2SH整合之session" target="_blank">S2SH整合之session</a> <span class="text-muted">灵静志远</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a> <div>错误信息: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cartService': Scope 'session' is not active for the current thread; consider defining a scoped</div> </li> <li><a href="/article/880.htm" title="xmp标签" target="_blank">xmp标签</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/%E6%A0%87%E7%AD%BE/1.htm">标签</a> <div>今天在处理数据的显示上遇到一个问题: var html = '<li><div class="pl-nr"><span class="user-name">' + user + '</span>' + text + '</div></li>'; ulComme</div> </li> <li><a href="/article/1007.htm" title="Ajax的常用技巧(2)---实现Web页面中的级联菜单" target="_blank">Ajax的常用技巧(2)---实现Web页面中的级联菜单</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>在网络上显示数据,往往只显示数据中的一部分信息,如文章标题,产品名称等。如果浏览器要查看所有信息,只需点击相关链接即可。在web技术中,可以采用级联菜单完成上述操作。根据用户的选择,动态展开,并显示出对应选项子菜单的内容。 在传统的web实现方式中,一般是在页面初始化时动态获取到服务端数据库中对应的所有子菜单中的信息,放置到页面中对应的位置,然后再结合CSS层叠样式表动态控制对应子菜单的显示或者隐</div> </li> <li><a href="/article/1134.htm" title="天-安-门,好高" target="_blank">天-安-门,好高</a> <span class="text-muted">atongyeye</span> <a class="tag" taget="_blank" href="/search/%E6%83%85%E6%84%9F/1.htm">情感</a> <div>    我是85后,北漂一族,之前房租1100,因为租房合同到期,再续,房租就要涨150。最近网上新闻,地铁也要涨价。算了一下,涨价之后,每次坐地铁由原来2块变成6块。仅坐地铁费用,一个月就要涨200。内心苦痛。     晚上躺在床上一个人想了很久,很久。        我生在农</div> </li> <li><a href="/article/1261.htm" title="android 动画" target="_blank">android 动画</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E9%80%8F%E6%98%8E%E5%BA%A6/1.htm">透明度</a><a class="tag" taget="_blank" href="/search/%E5%B9%B3%E7%A7%BB/1.htm">平移</a><a class="tag" taget="_blank" href="/search/%E7%BC%A9%E6%94%BE/1.htm">缩放</a><a class="tag" taget="_blank" href="/search/%E6%97%8B%E8%BD%AC/1.htm">旋转</a> <div>android的动画有两种  tween动画和Frame动画   tween动画;,透明度,缩放,旋转,平移效果   Animation   动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 TranslateAnimation 位置移动 Animation</div> </li> <li><a href="/article/1388.htm" title="查看本机网络信息的cmd脚本" target="_blank">查看本机网络信息的cmd脚本</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a> <div>@echo 您的用户名是:%USERDOMAIN%\%username%>"%userprofile%\网络参数.txt" @echo 您的机器名是:%COMPUTERNAME%>>"%userprofile%\网络参数.txt" @echo ___________________>>"%userprofile%\</div> </li> <li><a href="/article/1515.htm" title="plsql 清除登录过的用户" target="_blank">plsql 清除登录过的用户</a> <span class="text-muted">征客丶</span> <a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>tools---preferences----logon history---history  把你想要删除的删除 -------------------------------------------------------------------- 若有其他凝问或文中有错误,请及时向我指出, 我好及时改正,同时也让我们一起进步。 email : binary_spac</div> </li> <li><a href="/article/1642.htm" title="【Pig一】Pig入门" target="_blank">【Pig一】Pig入门</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/pig/1.htm">pig</a> <div>Pig安装 1.下载pig   wget http://mirror.bit.edu.cn/apache/pig/pig-0.14.0/pig-0.14.0.tar.gz   2. 解压配置环境变量      如果Pig使用Map/Reduce模式,那么需要在环境变量中,配置HADOOP_HOME环境变量   expor</div> </li> <li><a href="/article/1769.htm" title="Java 线程同步几种方式" target="_blank">Java 线程同步几种方式</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/volatile/1.htm">volatile</a><a class="tag" taget="_blank" href="/search/synchronized/1.htm">synchronized</a><a class="tag" taget="_blank" href="/search/ThredLocal/1.htm">ThredLocal</a><a class="tag" taget="_blank" href="/search/ReenTranLock/1.htm">ReenTranLock</a><a class="tag" taget="_blank" href="/search/Concurrent/1.htm">Concurrent</a> <div>为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,      从而保证了该变量的唯一性和准确性。 1.同步方法&</div> </li> <li><a href="/article/1896.htm" title="StringUtils判断字符串是否为空的方法(转帖)" target="_blank">StringUtils判断字符串是否为空的方法(转帖)</a> <span class="text-muted">BreakingBad</span> <a class="tag" taget="_blank" href="/search/null/1.htm">null</a><a class="tag" taget="_blank" href="/search/StringUtils/1.htm">StringUtils</a><a class="tag" taget="_blank" href="/search/%E2%80%9C%E2%80%9D/1.htm">“”</a> <div>转帖地址:http://www.cnblogs.com/shangxiaofei/p/4313111.html   public static boolean isEmpty(String str)     判断某字符串是否为空,为空的标准是 str== null  或 str.length()== 0  </div> </li> <li><a href="/article/2023.htm" title="编程之美-分层遍历二叉树" target="_blank">编程之美-分层遍历二叉树</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class LevelTraverseBinaryTree { /** * 编程之美 分层遍历二叉树 * 之前已经用队列实现过二叉树的层次遍历,但这次要求输出换行,因此要</div> </li> <li><a href="/article/2150.htm" title="jquery取值和ajax提交复习记录" target="_blank">jquery取值和ajax提交复习记录</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/jquery%E5%8F%96%E5%80%BC/1.htm">jquery取值</a><a class="tag" taget="_blank" href="/search/ajax%E6%8F%90%E4%BA%A4/1.htm">ajax提交</a> <div> // 取值 // alert($("input[name='username']").val()); // alert($("input[name='password']").val()); // alert($("input[name='sex']:checked").val()); // alert($("</div> </li> <li><a href="/article/2277.htm" title="推荐国产工作流引擎嵌入式公式语法解析器-IK Expression" target="_blank">推荐国产工作流引擎嵌入式公式语法解析器-IK Expression</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a> <div>这个开源软件包是国内的一位高手自行研制开发的,正如他所说的一样,我觉得它可以使一个工作流引擎上一个台阶。。。。。。欢迎大家使用,并提出意见和建议。。。 ----------转帖--------------------------------------------------- IK Expression是一个开源的(OpenSource),可扩展的(Extensible),基于java语言</div> </li> <li><a href="/article/2404.htm" title="关于系统中使用多个PropertyPlaceholderConfigurer的配置及PropertyOverrideConfigurer" target="_blank">关于系统中使用多个PropertyPlaceholderConfigurer的配置及PropertyOverrideConfigurer</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>1、PropertyPlaceholderConfigurer Spring中PropertyPlaceholderConfigurer这个类,它是用来解析Java Properties属性文件值,并提供在spring配置期间替换使用属性值。接下来让我们逐渐的深入其配置。 基本的使用方法是:(1) <bean id="propertyConfigurerForWZ&q</div> </li> <li><a href="/article/2531.htm" title="二叉树:二叉搜索树" target="_blank">二叉树:二叉搜索树</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%8F%89%E6%A0%91/1.htm">二叉树</a> <div>    所谓二叉树,就是一个节点最多只能有两个子节点,而二叉搜索树就是一个经典并简单的二叉树.规则是一个节点的左子节点一定比自己小,右子节点一定大于等于自己(当然也可以反过来).在树基本平衡的时候插入,搜索和删除速度都很快,时间复杂度为O(logN).但是,如果插入的是有序的数据,那效率就会变成O(N),在这个时候,树其实变成了一个链表. tree代码: </div> </li> <li><a href="/article/2658.htm" title="C语言字符串函数大全" target="_blank">C语言字符串函数大全</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/function/1.htm">function</a> <div>C语言字符串函数大全     函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例:   #include <stdio.h> #include <string.h>   int main</div> </li> <li><a href="/article/2785.htm" title="友盟统计页面技巧" target="_blank">友盟统计页面技巧</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E5%B7%A7/1.htm">技巧</a> <div>在基类调用就可以了, 基类ViewController示例代码 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [MobClick beginLogPageView:[NSString stringWithFormat:@"%@",self.class]]; </div> </li> <li><a href="/article/2912.htm" title="window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法" target="_blank">window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法</a> <span class="text-muted">flyvszhb</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装jdk1.6前,执行java -version得到 C:\Users\liuxiang2>java -version java version "1.7.0_21&quo</div> </li> <li><a href="/article/3039.htm" title="Java在创建子类对象的同时会不会创建父类对象" target="_blank">Java在创建子类对象的同时会不会创建父类对象</a> <span class="text-muted">happyqing</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%88%9B%E5%BB%BA/1.htm">创建</a><a class="tag" taget="_blank" href="/search/%E5%AD%90%E7%B1%BB%E5%AF%B9%E8%B1%A1/1.htm">子类对象</a><a class="tag" taget="_blank" href="/search/%E7%88%B6%E7%B1%BB%E5%AF%B9%E8%B1%A1/1.htm">父类对象</a> <div>  1.在thingking in java 的第四版第六章中明确的说了,子类对象中封装了父类对象,   2."When you create an object of the derived class, it contains within it a subobject of the base class. This subobject is the sam</div> </li> <li><a href="/article/3166.htm" title="跟我学spring3 目录贴及电子书下载" target="_blank">跟我学spring3 目录贴及电子书下载</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>    一、《跟我学spring3》电子书下载地址: 《跟我学spring3》  (1-7 和 8-13) http://jinnianshilongnian.iteye.com/blog/pdf     跟我学spring3系列 word原版 下载     二、 源代码下载 最新依</div> </li> <li><a href="/article/3420.htm" title="第12章 Ajax(上)" target="_blank">第12章 Ajax(上)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3547.htm" title="BI and EIM 4.0 at a glance" target="_blank">BI and EIM 4.0 at a glance</a> <span class="text-muted">blueoxygen</span> <a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a> <div>http://www.sap.com/corporate-en/press.epx?PressID=14787   有机会研究下EIM家族的两个新产品~~~~   New features of the 4.0 releases of BI and EIM solutions include: Real-time in-memory computing – </div> </li> <li><a href="/article/3674.htm" title="Java线程中yield与join方法的区别" target="_blank">Java线程中yield与join方法的区别</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。 &nb</div> </li> <li><a href="/article/3801.htm" title="android Manifest.xml选项" target="_blank">android Manifest.xml选项</a> <span class="text-muted">阿尔萨斯</span> <a class="tag" taget="_blank" href="/search/Manifest/1.htm">Manifest</a> <div>结构 继承关系 public final class Manifest extends Objectjava.lang.Objectandroid.Manifest 内部类 class Manifest.permission权限 class Manifest.permission_group权限组 构造函数 public Manifest () 详细 androi</div> </li> <li><a href="/article/3928.htm" title="Oracle实现类split函数的方" target="_blank">Oracle实现类split函数的方</a> <span class="text-muted">zhaoshijie</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>关键字:Oracle实现类split函数的方 项目里需要保存结构数据,批量传到后他进行保存,为了减小数据量,子集拼装的格式,使用存储过程进行保存。保存的过程中需要对数据解析。但是oracle没有Java中split类似的函数。从网上找了一个,也补全了一下。 CREATE OR REPLACE TYPE t_split_100 IS TABLE OF VARCHAR2(100); cr</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>