快速了解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/1950194868756213760.htm" title="程序员必备:10 个提升代码质量的工具" target="_blank">程序员必备:10 个提升代码质量的工具</a> <span class="text-muted">大力出奇迹985</span> <a class="tag" taget="_blank" href="/search/%E5%AE%A0%E7%89%A9/1.htm">宠物</a> <div>在软件开发过程中,代码质量对项目的成功起着决定性作用。高质量的代码不仅易于维护和扩展,还能有效降低成本并提升可靠性。本文精心挑选了10个程序员必备工具,助力提升代码质量。这些工具涵盖代码格式化、静态分析、代码审查、测试、性能优化、安全扫描、版本控制、依赖管理、代码生成以及文档生成等多个关键领域。通过使用它们,开发者能够高效地发现并解决代码中的潜在问题,遵循最佳实践,提升代码的可读性、可维护性与安全</div> </li> <li><a href="/article/1950191587556388864.htm" title="C#中的设计模式:构建更加优雅的代码" target="_blank">C#中的设计模式:构建更加优雅的代码</a> <span class="text-muted">Envyᥫᩣᩚ</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发的程序员来说,理解和应用这些模式可以帮助创建结构良好、易于维护和扩展的应用程序。本文将介绍几种常用的设计模式,并展示如何用C#实现它</div> </li> <li><a href="/article/1950178809030438912.htm" title="今年校招竞争真激烈" target="_blank">今年校招竞争真激烈</a> <span class="text-muted">12_05</span> <div>程序员满大街,都要找不到工作了。即使人工智能满大街,我也后悔当初没学机器学习,后悔当初没学Java。C++真难找工作。难道毕了业就失业吗?好担心!</div> </li> <li><a href="/article/1950169527287345152.htm" title="基于随机森林的白酒风味智能分类系统:从数据到洞察的完整实践" target="_blank">基于随机森林的白酒风味智能分类系统:从数据到洞察的完整实践</a> <span class="text-muted">笙囧同学</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>作者:笙囧同学|中科院计算机大模型方向硕士|全栈开发爱好者座右铭:偷懒是人生进步的阶梯联系方式:3251736703@qq.com各大平台账号/公众号:笙囧同学前言大家好,我是笙囧同学!今天给大家分享一个超级有趣且技术含量爆表的项目——白酒风味智能分类系统。作为一个既爱技术又爱美酒的程序员,我花了大量时间研究如何用机器学习的方法来"品酒",让AI帮我们识别白酒的风味特征。这个项目融合了机器学习、数</div> </li> <li><a href="/article/1950167128745242624.htm" title="程序员职业发展:元学习比技术更重要?" target="_blank">程序员职业发展:元学习比技术更重要?</a> <span class="text-muted">AI天才研究院</span> <a class="tag" taget="_blank" href="/search/AI%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">AI人工智能与大数据</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>程序员职业发展:元学习比技术更重要?关键词:程序员职业发展、元学习、技术、学习能力、知识更新摘要:在快速发展的科技领域,程序员面临着技术不断更新换代的挑战。本文深入探讨了在程序员职业发展中,元学习与技术的重要性对比。通过分析元学习的核心概念、其在职业发展中的作用,结合技术的特点和局限,阐述了元学习为何可能在长远的职业发展中更为关键。同时,提供了实际的案例和操作步骤,介绍了相关的工具和资源,最后对未</div> </li> <li><a href="/article/1950142042847899648.htm" title="java学习笔记8" target="_blank">java学习笔记8</a> <span class="text-muted">幸福,你等等我</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>一、异常处理Error:错误,程序员无法处理,如OOM内存溢出错误、内存泄漏...会导出程序崩溃1.异常:程序中一些程序自身处理不了的特殊情况2.异常类Exception3.异常的分类:(1).检查型异常(编译异常):在编译时就会抛出的异常(代码上会报错),需要在代码中编写处理方式(和程序之外的资源访问)直接继承Exception(2).运行时异常:在代码运行阶段可能会出现的异常,可以不用明文处理</div> </li> <li><a href="/article/1950122124521828352.htm" title="从零到大厂:硬件程序员的硬核修炼手册——2025版面试笔试全攻略" target="_blank">从零到大厂:硬件程序员的硬核修炼手册——2025版面试笔试全攻略</a> <span class="text-muted">small_wh1te_coder</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</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%B5%8C%E5%85%A5%E5%BC%8F/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/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96/1.htm">汇编</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>从零到大厂:嵌入式程序员的硬核修炼手册——2025版面试笔试全攻略第一章:C语言的内功心法——从“会用”到“精通”的蜕变引子:C语言,嵌入式江湖的“独孤九剑”兄弟,你是不是觉得C语言都学烂了?指针、数组、结构体,这些东西张口就来。但为啥一到大厂面试,或者遇到稍微复杂点的嵌入式项目,就感觉力不从心,甚至有点懵圈?原因很简单:你可能只是“会用”C语言,离“精通”C语言,特别是“精通”嵌入式领域所需的C</div> </li> <li><a href="/article/1950090986277367808.htm" title="软件测试的分类" target="_blank">软件测试的分类</a> <span class="text-muted"></span> <div>测试阶段划分冒烟测试:在正式开始测试之前,我们会对测试版本进行冒烟测试,如果测试版本的主流程可以通过没有被阻塞或者出现宕机等重大问题就可以进行正式的测试工作了单元测试:最微小规模的测试,测试对象是某个功能或代码,一般是由程序员来做集成测试:是指一个应用系统的内部的各个部件的联合测试,以决定他们是否能在一起共同工作且没有冲突部件可以是代码块、独立的应用、网络上的客户端或服务器程序一般来说接口测试属于</div> </li> <li><a href="/article/1950053795572543488.htm" title="JavaWeb(苍穹外卖)--学习笔记14" target="_blank">JavaWeb(苍穹外卖)--学习笔记14</a> <span class="text-muted">哈哈哈哈哈0627</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>前言终于开始学习做项目了,本篇文章是学习B站黑马程序员苍穹外卖的学习笔记。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,这篇文章是把我觉得JavaWeb的学习中比较重要的内容写一个总结(其实因为学到下单支付太难了我复习复习前面的)Controller层(这里只讲讲几个需要注意的注解)管理服务端的动态资源:SpringFramewo</div> </li> <li><a href="/article/1950040812469415936.htm" title="25年不倒的“犀牛书“:为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?" target="_blank">25年不倒的“犀牛书“:为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?</a> <span class="text-muted">阿蒙Armon</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</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/ecmascript/1.htm">ecmascript</a> <div>25年不倒的"犀牛书":为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?当一本技术书能连续畅销25年,历经7次迭代仍稳坐领域第一梯队,它必然藏着超越时代的硬实力。《JavaScript权威指南(原书第7版)》就是这样一部传奇——豆瓣9.4分的封神之作,程序员口中的"犀牛书",从网景时代到ES2020,它始终是JavaScript开发者的终极参考书。如果你还在为原型链、闭包、异步编</div> </li> <li><a href="/article/1950039800253837312.htm" title="与网络安全相比,为什么只会Python很难找到工作?" target="_blank">与网络安全相比,为什么只会Python很难找到工作?</a> <span class="text-muted">程序员羊羊</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E5%AE%89%E5%B7%A5%E7%A8%8B%E5%B8%88/1.htm">网安工程师</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E9%BB%91%E5%AE%A2/1.htm">黑客</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/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/%E7%BD%91%E7%BB%9C/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/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>前言作为一门广泛应用的编程语言,Python在众多领域中都有着不可忽视的地位。然而,对于那些寻求就业的程序员来说,仅仅掌握Python可能并不足以让他们轻松地找到一份理想的工作。本文将深入探讨为什么只会Python很难找到工作,以及分析在职程序员在Python岗位上可能会遇到的一些情况。一、Python的优势与局限性Python的优势Python作为一种高级编程语言,具有简洁、易读、易于学习等特点</div> </li> <li><a href="/article/1950035646378733568.htm" title="深入剖析Nginx" target="_blank">深入剖析Nginx</a> <span class="text-muted">书火网_firebook</span> <div>想邀看书之《深入剖析Nginx》一个不会点运维的后端程序员,不是个合格的码农传送门:https://fire100.top/detail?rId=155少年辛苦终身事,莫向光阴惰寸功!</div> </li> <li><a href="/article/1950018741098049536.htm" title="【技术精进】Java集合框架:从入门到精通的思考之路" target="_blank">【技术精进】Java集合框架:从入门到精通的思考之路</a> <span class="text-muted">果冻kk</span> <a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80/1.htm">java基础</a><a class="tag" taget="_blank" href="/search/Java%E9%9B%86%E5%90%88/1.htm">Java集合</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><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>Java集合框架学习指南:一份完整的知识地图️前言JAVA集合,是每个Java开发者的必备武器。工作中的程序员都在使用它,因为它是数据处理中不可或缺的工具。说到如何优雅地使用、如何实现高性能、如何确保线程安全,相信大家都有自己的心得,毕竟实战中遇到的问题和解决方案都是最好的老师。但要说到底层实现原理、设计思想,可能就只有部分开发者有深入研究了。本文旨在帮助新手构建知识体系,也为老手提供系统复习的参</div> </li> <li><a href="/article/1950017480378347520.htm" title="Spring框架深度解析" target="_blank">Spring框架深度解析</a> <span class="text-muted"></span> <div>我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队</div> </li> <li><a href="/article/1950017480860692480.htm" title="Spring框架核心技术解析" target="_blank">Spring框架核心技术解析</a> <span class="text-muted"></span> <div>我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队</div> </li> <li><a href="/article/1949991125741793280.htm" title="《博客园精华集》web标准分册第2论筛选结果文章列表" target="_blank">《博客园精华集》web标准分册第2论筛选结果文章列表</a> <span class="text-muted"></span> <div>《博客园精华集》web标准部分筛选结果(共55篇)一个喜欢网页设计的程序员作者:Awen根本不存在DIV+CSS布局这回事作者:CatChen欲练CSS,必先宫IE作者:CatChen你有强迫症吗?作者:CatChenSPAN元素和DIV元素的区别作者:ChrisLiudiv的认识作者:ChrisLiu实时检验您的页面是否符合XHTML标准——使用ValidatorModule作者:Dflying</div> </li> <li><a href="/article/1949980781245952000.htm" title="一行 Python 代码让女友尖叫!程序员浪漫指南" target="_blank">一行 Python 代码让女友尖叫!程序员浪漫指南</a> <span class="text-muted"></span> <div>本文专为程序员打造,旨在通过一行Python代码传递独特浪漫。将从代码浪漫逻辑、多场景应用、硬件结合玩法、避坑技巧及进阶方案五个方面,详细阐述如何让简单代码发挥巨大作用,让女友感受到程序员式的用心与惊喜,最后总结核心要点,助你用技术表达爱意。一、代码浪漫的底层逻辑一行Python代码的浪漫,在于将抽象技术转化为具象情感。比如print('\n'.join([''.join([('Love'[(x-</div> </li> <li><a href="/article/1949980402898759680.htm" title="程序员 35 岁危机大调查!这 5 个出路让你突破瓶颈,必看" target="_blank">程序员 35 岁危机大调查!这 5 个出路让你突破瓶颈,必看</a> <span class="text-muted">大力出奇迹985</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>在互联网行业飞速发展的当下,程序员35岁危机逐渐成为热议话题。不少人认为35岁后的程序员在精力、学习能力上难以与年轻从业者抗衡,面临被淘汰的风险。本文针对这一现象展开调查,深入分析程序员35岁危机的成因,并提出技术深耕、管理转型、跨界发展、自主创业、副业拓展五个突破瓶颈的出路,为正处于困境或即将面临此危机的程序员提供参考,助其找到适合自己的发展方向。一、技术深耕:成为领域内的技术专家技术领域的深度</div> </li> <li><a href="/article/1949980402416414720.htm" title="AI 时代,程序员如何从代码工人进化为技术战略家?" target="_blank">AI 时代,程序员如何从代码工人进化为技术战略家?</a> <span class="text-muted"></span> <div>在AI技术迅猛发展的时代,传统程序员若想突破“代码工人”的局限,进化为技术战略家,需从多维度实现能力跃迁。这不仅要求深化技术深度,更要拓展行业认知、培养战略思维、强化跨界协作能力,并保持持续进化的动力。本文将从技术深耕、行业洞察、战略布局、协作整合、终身学习五个关键方面,详细探讨程序员实现这一进化的具体路径,为其指明在AI浪潮中从执行者向决策者转变的方向。一、深耕技术内核,筑牢战略根基技术是程序员</div> </li> <li><a href="/article/1949975484238458880.htm" title="APP开发入门:了解主流的编程语言" target="_blank">APP开发入门:了解主流的编程语言</a> <span class="text-muted">agi大模型</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E4%B8%9A%E4%B8%8E%E8%81%8C%E5%9C%BA/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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a> <div>前言在过去的几年里,有许多程序员开始学习和使用编程语言。这其中包括C、C++、Java和Python。尽管有许多语言可供选择,但大多数程序员都会选择最容易学习的编程语言。如今,有很多编程语言供选择。程序员们在学习这些语言时可以自由地选择他们喜欢的方式,因为他们的目标是构建任何软件,而不仅仅是创建一个应用程序。你可以在Linux上学习C/C++、Java、Python、C#或JavaScript,你</div> </li> <li><a href="/article/1949936018186629120.htm" title="Python 的 GIL 时代即将终结,迈向真正的多线程时代" target="_blank">Python 的 GIL 时代即将终结,迈向真正的多线程时代</a> <span class="text-muted">技术狂潮AI</span> <a class="tag" taget="_blank" href="/search/Python%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98/1.htm">Python开发实战</a><a class="tag" taget="_blank" href="/search/AI%E7%BC%96%E7%A8%8B%E5%AE%9E%E6%88%98/1.htm">AI编程实战</a><a class="tag" taget="_blank" href="/search/AI%E5%BA%94%E7%94%A8%E5%AE%9E%E6%88%98/1.htm">AI应用实战</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/GIL/1.htm">GIL</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a> <div>Python功能强大、灵活且对程序员友好,广泛应用于从Web开发到机器学习的各个领域。根据引用次数最多的两项指标,Python甚至超越了Java和C等语言,成为最流行的编程语言。经过多年的流行,Python似乎势不可挡。但Python作为一种编程语言的未来发展至少面临一个重大障碍。它被称为GIL,即全局解释器锁,几十年来,Python开发人员一直试图将其从Python的默认实现中删除。虽然GIL在</div> </li> <li><a href="/article/1949931858041040896.htm" title="今天凌晨,字节开源 Coze,如何白嫖?" target="_blank">今天凌晨,字节开源 Coze,如何白嫖?</a> <span class="text-muted">Python自动化办公社区</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a> <div>大家好,这里是程序员晚枫。最近AI圈放的大招太多了,文章都更新不过来了。本周刚熬夜写完了:开源Qwen3-Coder是顶级AI阳谋,阿里的野心藏不住了,今天凌晨:Coze又开源了!开源地址:https://github.com/coze-dev一、Coze开源,对字节的战略意义本次开源了一系列项目,其中两个比较重要的仓库:CozeStudio一站式AIAgent开发工具-ttps://github</div> </li> <li><a href="/article/1949915472388485120.htm" title="Java 初始化神器:一行不漏读懂 xxx.json 里的国家编码" target="_blank">Java 初始化神器:一行不漏读懂 xxx.json 里的国家编码</a> <span class="text-muted">星际编程喵</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A2%E7%B4%A2Spring%E7%9A%84%E5%A5%87%E5%A6%99%E4%B8%96%E7%95%8C/1.htm">探索Spring的奇妙世界</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a> <div>前言想从JSON文件里读取一堆国家编码,听起来就像是程序员的日常操作?可惜理想丰满,现实骨感。路径错一点,加载空气;格式写错一行,直接报错;大小写不统一,验证就翻车。你以为是小问题,结果可能引发全球数据失配危机,一不小心,程序可能就成为“全球失联”的罪魁祸首。为了拯救各位被JSON支配过的灵魂,这篇文章奉上一个干净利落、优雅靠谱的国家编码加载器。用Java结合Jackson工具,只需一小段代码,就</div> </li> <li><a href="/article/1949901608246636544.htm" title="你适合做HR吗?自测!" target="_blank">你适合做HR吗?自测!</a> <span class="text-muted">拒绝贩卖焦虑</span> <div>任何职业都有一个倦怠期,做HR更是如此。经常看到曾经的某某HR朋友,突然跟你说他转行了,做销售了,做运营了,甚至还有做客服了……转行是大部分HR做了几年都会萌生的一个念头。原因无外乎:1、穷;2、烦。工资太低,拿着卖白菜的价,操着卖白粉的心,拿着5k的月薪劝自家8k的程序员要懂得拒绝外面12000的诱惑。琐事太多,员工大事小事都爱找你,有些事情解释多少遍都不顶用,久而久之,累觉不爱。当然,也有些H</div> </li> <li><a href="/article/1949897434448588800.htm" title="Selenium自动化测试如何结合代理IP解决IP限制?" target="_blank">Selenium自动化测试如何结合代理IP解决IP限制?</a> <span class="text-muted">爱睡觉的圈圈</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1/1.htm">代理服务</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>好的,作为一名熟悉IP代理产品和开发的资深程序员,很高兴与你分享如何在Selenium自动化测试中结合代理IP来解决IP限制的问题。IP限制是自动化测试(尤其是Web抓取或大规模UI测试)中常见的痛点。目标网站可能会因为检测到来自同一IP的大量快速请求而暂时或永久封禁该IP。使用代理IP可以有效地解决这个问题。下面我将详细介绍几种在Selenium中设置代理IP的方法,并提供代码示例和最佳实践。S</div> </li> <li><a href="/article/1949897182211534848.htm" title="爬虫入门:为什么你的爬虫需要代理IP?" target="_blank">爬虫入门:为什么你的爬虫需要代理IP?</a> <span class="text-muted"></span> <div>前言作为一名在爬虫领域摸爬滚打多年的程序员,我经常收到新手朋友的疑问:"为什么我的爬虫跑了一会儿就不工作了?"今天,我就来详细讲解为什么爬虫需要代理IP,以及如何正确使用代理IP来提升爬虫的稳定性和效率。一、爬虫面临的挑战1.1反爬虫机制的普及现代网站都配备了各种反爬虫机制,最常见的包括:反爬虫机制IP限制User-Agent检测验证码行为分析请求频率限制1.2IP封禁的痛点让我们看一个典型的爬虫</div> </li> <li><a href="/article/1949864015018651648.htm" title="要成为更优秀的程序员,先在脑中推演小段逻辑" target="_blank">要成为更优秀的程序员,先在脑中推演小段逻辑</a> <span class="text-muted">CtrlZ学习录</span> <a class="tag" taget="_blank" href="/search/%E8%8B%B1%E6%96%87%E8%B5%84%E8%AE%AF/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%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>要成为更优秀的程序员,先在脑中推演小段逻辑本系列是我个人翻译的英文阅读笔记,既为巩固所学,也为分享知识(如有侵权请联系删除)下面是正文原文链接:https://the-nerve-blog.ghost.io/to-be-a-better-programmer-write-little-proofs-in-your-head/这是一篇关于我偶然学到的编程技巧的短文,它能帮助我更快速、更准确地编写代码</div> </li> <li><a href="/article/1949827447734202368.htm" title="DDD实战精要" target="_blank">DDD实战精要</a> <span class="text-muted">我是廖志伟</span> <a class="tag" taget="_blank" href="/search/Java%E5%9C%BA%E6%99%AF%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8/1.htm">Java场景面试宝典</a><a class="tag" taget="_blank" href="/search/DDD/1.htm">DDD</a><a class="tag" taget="_blank" href="/search/Software/1.htm">Software</a><a class="tag" taget="_blank" href="/search/Architecture/1.htm">Architecture</a><a class="tag" taget="_blank" href="/search/Domain-Driven/1.htm">Domain-Driven</a><a class="tag" taget="_blank" href="/search/Design/1.htm">Design</a> <div>我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队</div> </li> <li><a href="/article/1949827069810634752.htm" title="微服务架构核心技术解析" target="_blank">微服务架构核心技术解析</a> <span class="text-muted">我是廖志伟</span> <a class="tag" taget="_blank" href="/search/Java%E5%9C%BA%E6%99%AF%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8/1.htm">Java场景面试宝典</a><a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/Cloud/1.htm">Cloud</a><a class="tag" taget="_blank" href="/search/Microservices/1.htm">Microservices</a><a class="tag" taget="_blank" href="/search/Service/1.htm">Service</a><a class="tag" taget="_blank" href="/search/Governance/1.htm">Governance</a> <div>我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队</div> </li> <li><a href="/article/1949826943050379264.htm" title="微服务架构深度解析" target="_blank">微服务架构深度解析</a> <span class="text-muted"></span> <div>我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队</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>