快速了解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/1883454535393931264.htm" title="老大说了,即使你是女程序员,这性能调优你也得拿下!" target="_blank">老大说了,即使你是女程序员,这性能调优你也得拿下!</a> <span class="text-muted">码炫课堂-码哥</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98/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%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E9%98%9F%E5%88%97/1.htm">队列</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>【悟思维】项目架构决定性能?优秀的架构胜过一万次的调优这个问题很容易理解,一个单节点(一台应用服务器+一台数据库服务器)的系统架构,任凭你使出浑身解数来调优也不可能让系统达到百万级并发,别说百万级了,上万并发都不可能。不说其他的,在一个性能相对不错的物理机上,mysql最多也就能承载3500-4500的QPS,你说你能调优调到上万并发??在目前来看如果不借助于其他组件或者其他技术手段是不太可能的。</div> </li> <li><a href="/article/1883447471133224960.htm" title="Scala(6) -- scala类(成员变量、成员方法、修饰符)和对象" target="_blank">Scala(6) -- scala类(成员变量、成员方法、修饰符)和对象</a> <span class="text-muted">erainm</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AD%A6%E4%B9%A0/1.htm">大数据学习</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>1.类和对象Scala是一种函数式的面向对象语言,它也是支持面向对象编程思想的,也有类和对象的概念。我们依然可以基于Scala语言来开发面向对象的应用程序。1.1相关概念什么是面向对象?面向对象是一种编程思想,它是基于面向过程的,强调的是以对象为基础完成各种操作.面向对象的三大思想特点是什么?更符合人们的思考习惯.把复杂的事情简单化.把程序员从执行者变成指挥者.什么是类?类是属性和行为的集合,是一</div> </li> <li><a href="/article/1883377621371252736.htm" title="python编程入门电子书-Python编程从入门到实践PDF电子书" target="_blank">python编程入门电子书-Python编程从入门到实践PDF电子书</a> <span class="text-muted">编程大乐趣</span> <div>本书的第一部分介绍编写Python程序所需要熟悉的基本概念,其中很多都适用于所有编程语言,因此它们在你的整个程序员生涯中都很有用。第1章介绍在计算机中安装Python,并运行第一个程序——它在屏幕上打印消息"Helloworld!”。第2章论述如何在变量中存储信息以及如何使用文本和数字。第3章和第4章介绍列表。使用列表能够在一个变量中存储任意数量的信息,从而高效地处理数据:只需几行代码,你就能够处</div> </li> <li><a href="/article/1883366742143594496.htm" title="失业,仲裁,都赶上了(一)" target="_blank">失业,仲裁,都赶上了(一)</a> <span class="text-muted"></span> <div>前言翻开以前的文章,没想到最后一篇是停留在去年8月。今年没有任何一篇文章输出,想不到输出的第一篇文章是在失业之后。如今我已经离职,走了仲裁,心里一块巨大的石头算是落下了。其实想想也挺好:大部分人顺利的话都在离职-->重新找工作-->在职-->又离职-->重新找工作-->在职的循环中度过,所以被迫失业、仲裁从某种程度上来说,也算是填满了我目前职场生活中的一段空白,让我的职场生活变得更加完整。程序员嘛</div> </li> <li><a href="/article/1883296529154895872.htm" title="面试官说 “你还有什么问题想问的” ,作为一名程序员该如何回答?" target="_blank">面试官说 “你还有什么问题想问的” ,作为一名程序员该如何回答?</a> <span class="text-muted">Misdirection_XG</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><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/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>前言程序员面试时经常会听到面试官说一些套话,比如“今天的面试就到这里了,回去等通知吧”,“你还有什么问题想问我的吗”,“如果这道题不会做,那么我们也可以换一道”今天我们要说的是大多数面试官都会说的一句话“你还有什么问题想问的?”这是一个老生常谈的问题,之前经历过不少面试,针对这个问题我也做过很多不同的回答,当然也参考了其他人的一些建议,我这里总结了几种回答的方法,仅供大家参考。1、没有了这听起来是</div> </li> <li><a href="/article/1883286440465461248.htm" title="linux 二进制编辑工具,全网最全Linux的十大十进制编辑器,要接触Linux的你摆脱不了..." target="_blank">linux 二进制编辑工具,全网最全Linux的十大十进制编辑器,要接触Linux的你摆脱不了...</a> <span class="text-muted">金雪锋</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%BC%96%E8%BE%91%E5%B7%A5%E5%85%B7/1.htm">二进制编辑工具</a> <div>简单来说,十六进制编辑器允许您检查和编辑二进制文件。标准文本编辑器和十六进制编辑器之间的区别在于,逻辑文件内容由常规编辑器表示,而实际文件内容由十六进制编辑器表示。在本文中,我们将看到Linux的顶级十六进制编辑器。谁在使用十六进制编辑器:为了编辑数据的各个字节,使用了十六进制编辑器,程序员或系统管理员经常使用十六进制编辑器。调试或逆向工程二进制通信协议是一些最常用的情况。当然,您可以将十六进制编</div> </li> <li><a href="/article/1883280640032436224.htm" title="我喜欢和不喜欢的C++特点" target="_blank">我喜欢和不喜欢的C++特点</a> <span class="text-muted">liulun</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/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++把我当成年人对待:在C++设计中有一条原则,那就是:无论做什么事情,都要相信程序员。与可能出现什么样的错误相比,能做出什么好产品更重要。C++程序员总是被看作成年人,只需要最少的看护。C++之父的《C++语言的设计与演化》我不太喜欢别人管着我,因为事情做的好不好是我自己的事,如果我的工具担心我做不好事,就给我灌输一大堆原则、理念,骑在我脖子上,这也不让我做,那也不让我做,必须如何如何做</div> </li> <li><a href="/article/1883233587684241408.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><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0/1.htm">函数</a> <div>引言在Python编程的世界中,函数堪称构建复杂逻辑和模块化程序的基础砖石。它能够帮助程序员组织代码、避免重复,并通过封装逻辑提高代码的可读性和可维护性。本文旨在全方位解析Python函数的核心概念,包括基础定义、文档化、默认参数、可选参数、解包参数、关键字仅参数、注解、可调用性检查、函数名称获取、匿名函数(lambda表达式)、生成器以及装饰器等多种实用特性。一、函数基础与文档化defexamp</div> </li> <li><a href="/article/1883226394566127616.htm" title="【数据结构】最有效的实现栈和队列的方式(C&C++语言版)" target="_blank">【数据结构】最有效的实现栈和队列的方式(C&C++语言版)</a> <span class="text-muted">大名顶顶</span> <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/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</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/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a> <div>在这个技术飞速发展的时代,掌握基础的数据结构知识是每个程序员必不可少的技能。本文将深入探讨栈和队列这两种线性数据结构,带你了解它们在实际编程中的应用以及如何用C/C++代码实现这些结构的核心操作。我们不仅讲解了栈的后进先出(LIFO)和队列的先进先出(FIFO)原理,还通过实例展示了如何将这两种数据结构结合起来,提升编程效率和解决实际问题的能力⚙️。不论你是编程新手还是经验丰富的开发者‍,本文都将</div> </li> <li><a href="/article/1883222610662191104.htm" title="移动应用开发技术 架构图" target="_blank">移动应用开发技术 架构图</a> <span class="text-muted">彭乙肱</span> <div>移动应用相关视频讲解:AIGC和微信的辅助学习移动应用开发技术架构图移动应用开发技术架构图是移动应用程序员必备的工具之一。它展示了一个应用程序的各个部分如何相互交互,以及它们之间的关系。在这篇文章中,我们将简要介绍移动应用开发技术架构图的基本概念,并使用代码示例来说明其重要性。架构图的重要性移动应用开发技术架构图对于理解一个应用程序的整体设计和功能至关重要。它可以帮助开发人员更好地组织代码,减少代</div> </li> <li><a href="/article/1883161570834444288.htm" title="2021 年 GitHub 上十大最火 Python 项目,看完之后我裂开了" target="_blank">2021 年 GitHub 上十大最火 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/github/1.htm">github</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>GitHub作为程序员每天必逛的网站之一,上面有着太多优秀的开源项目,今天派森酱就带大家来梳理下在过去的一年里,GitHub上最火的Python项目Top10。数据获取如果你留心看过GitHub的文档的话,你就会知道关于GitHub上的大部分数据,GitHub官方都是提供了接口了的。比如我们今天要获取的数据就可以从下面这个接口拿到。https://api.github.com/search/rep</div> </li> <li><a href="/article/1883153503505936384.htm" title="激光线扫标定和相机标定:中高级C++程序员与计算机视觉工程师的指南" target="_blank">激光线扫标定和相机标定:中高级C++程序员与计算机视觉工程师的指南</a> <span class="text-muted">m0_57781768</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%A0%81%E7%9B%B8%E6%9C%BA/1.htm">数码相机</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a> <div>激光线扫标定和相机标定:中高级C++程序员与计算机视觉工程师的指南简介在计算机视觉和机器人领域,激光标定和相机标定是实现高精度测量和检测的关键技术。激光线扫标定和相机标定在许多应用中都是必不可少的,如自动驾驶、工业检测、三维重建等。本文将详细介绍激光线扫标定和相机标定的基本概念、实现细节以及常见问题的解决方案。目标读者为中高级C++程序员和计算机视觉工程师,文章将提供详细的技术细节和代码示例,确保</div> </li> <li><a href="/article/1883126647964626944.htm" title="C++ —— 智能指针 unique_ptr (上)" target="_blank">C++ —— 智能指针 unique_ptr (上)</a> <span class="text-muted">奶香臭豆腐</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/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><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>C++——智能指针unique_ptr(上)普通指针的不足普通指针的释放智能指针智能指针unique_ptr智能指针初始化错误用法get()方法返回裸指针智能指针不支持指针的运算(+、-、++、--)普通指针的不足new和new[]的内存需要用delete和delete[]释放(堆区的内存一定要手工释放,否则会发生内存的泄露);程序员主观上的失误,忘记或漏掉释放;不确定何时释放。普通指针的释放类内</div> </li> <li><a href="/article/1883120846353002496.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/%E9%87%91%E8%9E%8D/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>今天分享一篇Python量化金融最全汇总,推荐大家收藏~记得划到文末点赞呐~本文汇总了定量金融的大量三方库,按功能进行分类,覆盖数值运算,衍生品定价,回溯检验,风险管理,数据爬取,可视化等多个子领域,供每个Python程序员参考。不要重复造轮子,明确要解决的问题,然后寻找相应的工具。很多著名的包如Numpy,Pandas,Seaborn,backtrader等已经被证明高度有效,即便没有找到符合应</div> </li> <li><a href="/article/1883097266592477184.htm" title="golang网络编程" target="_blank">golang网络编程</a> <span class="text-muted">编程小猹</span> <a class="tag" taget="_blank" href="/search/go%E5%AD%A6%E4%B9%A0/1.htm">go学习</a><a class="tag" taget="_blank" href="/search/go/1.htm">go</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/1.htm">网络编程</a> <div>socket编程socket图解Socket是BSDUNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。Socket又称“套接字”,应用程序通常通过“套接字”向网络发出</div> </li> <li><a href="/article/1882941166735912960.htm" title="C语言内存管理详解" target="_blank">C语言内存管理详解</a> <span class="text-muted">池央</span> <a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/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语言不像其他高级语言那样提供自动内存管理,它要求程序员手动进行内存的分配和释放。在C语言中,动态内存的管理主要依赖于malloc、calloc、realloc和free等函数。理解这些函数的用法、内存泄漏的原因及其防止方法,对于编写高效、可靠的C程序至关重要。本文将深入讲解C语言中的内存管理,涵盖动态内存分配、内存泄漏以及如何防止内存泄漏等内容。推荐阅读:操作符详细解说,让你的编程技能更上一层楼</div> </li> <li><a href="/article/1882930323868676096.htm" title="python的中文翻译-再聊聊Python中文社区的翻译" target="_blank">python的中文翻译-再聊聊Python中文社区的翻译</a> <span class="text-muted">weixin_37988176</span> <div>在写《学习Python,怎能不懂点PEP呢?》的时候,我已经发现国内的Python翻译环境不容乐观。这个结论可能不对,毕竟这几年Python大热,或许有不少优秀的翻译项目,只是我还不知道而已。不管如何,接着上一篇关于“Python学习资料汉化”的话题,今天,我们再聊聊Python中文社区的翻译话题。Python部落的翻译社很巧合的是,Python部落(公众号:Python程序员)刚刚低调地上线了“</div> </li> <li><a href="/article/1882872829259608064.htm" title="数据仓库面试题集锦(附答案和数仓知识体系)" target="_blank">数据仓库面试题集锦(附答案和数仓知识体系)</a> <span class="text-muted">2401_83703951</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/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/1.htm">数据仓库</a> <div>15、为什么需要数据仓库建模?16、数据仓库建模方法有哪些?17、数仓架构为什么要分层?光阴似箭,岁月如刀。小编已经从刚毕业时堤上看风的白衣少年,变成了一个有五年开发经验的半老程序员。五年——是一个非常重要的时间节点,意味你见过很多套技术构架,学过很多技术组件,写过很多行代码,有了自己的技术理解、知识体系和编码风格。这个时候我们对待技术的态度已经从扩宽广度,慢慢转变成沉淀深度为主了。也是刚刚面试了</div> </li> <li><a href="/article/1882788988293541888.htm" title="单例模式 java面试题_8道常考Java单例模式面试题" target="_blank">单例模式 java面试题_8道常考Java单例模式面试题</a> <span class="text-muted">知然789</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a><a class="tag" taget="_blank" href="/search/java%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">java面试题</a> <div>Java单例设计模式是GoF23种设计模式之一,也是是使用频率最高的设计模式之一,所以想参加java程序员岗位面试的朋友们,必须要提前学习好java单例模式面试题的内容,java单例模式在初级中高级的面试中几乎都会出现,所以还是十分重要的。答:单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如</div> </li> <li><a href="/article/1882769113676312576.htm" title="Redis之父学生时代发现的ping漏洞的源码分析" target="_blank">Redis之父学生时代发现的ping漏洞的源码分析</a> <span class="text-muted"></span> <div>Redis的作者SalvatoreSanfilippo(网名antirez)在意大利西西里岛长大,虽然从小就接触计算机,也有一些编程经验,但在大学期间却选择了建筑学院,可能当时并没有打算走职业程序员的道路吧。然而antirez应该就属于老天爷赏饭的那类人,据说仅仅因为错把显卡买成了网卡,商家又不肯退货,他就放下游戏,拿起了C语言的教材。不久之后,antirez发现了一个ping的漏洞,非root用</div> </li> <li><a href="/article/1882742201805500416.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/1882741193075388416.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/mysql/1.htm">mysql</a><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/sql/1.htm">sql</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/%E8%80%83%E7%A0%94/1.htm">考研</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>前言:学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇+,涵盖入门、进阶、高级(一些原理分析);这一篇是讲解单行函数,当然mysql函数很多哈,只有多用才能记得住;这些函数,如果不用,记得再牢都会忘记(我是这样的),但是可以先看一下,动手打一下,会现用现查即可,而且现在AI这么发达不是么;虽然MYSQL命令很多,但是自己去多敲一点,到后面忘记了,</div> </li> <li><a href="/article/1882736144551047168.htm" title="2021最全大厂Java面试题总结,备战2022春招~~" target="_blank">2021最全大厂Java面试题总结,备战2022春招~~</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/%E9%9D%A2%E8%AF%95/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/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/%E6%9E%B6%E6%9E%84/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><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a> <div>前言2021年已不足一月,再过不久就要迎来2022年了,相信很多小伙伴在为跳槽做准备,每年的金三银四都是各大公司招聘程序员的最佳时期,在这段时间内有好多程序员为面试而发愁,不知道如何才能收到好的offer,拿到理想的薪资,实现自我的人生价值!所以小编特地分享出总结的一份480余页的面试手册。俗话说得好,他山之石,可以攻玉,多看多借鉴希望能对大家有所帮助✌。需要原文件学习的朋友们点赞+收藏,关注我之</div> </li> <li><a href="/article/1882644092735778816.htm" title="如何用3个月零基础入门网络安全?_网络安全零基础怎么学习" target="_blank">如何用3个月零基础入门网络安全?_网络安全零基础怎么学习</a> <span class="text-muted">白帽黑客啊一</span> <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/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E5%AF%86%E7%A0%81%E5%AD%A6/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> <div>基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包前言写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是:1.指出一些自学的误区2.提供客观可行的学习表3.推荐我认为适合小白学习的资源.大佬绕道哈!基于入门网络安全/黑客打造的:黑客&网络安全入门&进阶学习资源包一、自学网络安全学习的误区和陷阱1.不要试图先成为一名程序员(以编程为基础的学习)</div> </li> <li><a href="/article/1882606636225327104.htm" title="探索React前端框架:JavaScript技巧与最佳实践" target="_blank">探索React前端框架:JavaScript技巧与最佳实践</a> <span class="text-muted">自由翱翔碧海蓝</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>React是一个广泛使用的JavaScript前端框架,它提供了一种组件化的开发模式,使得构建交互式用户界面变得更加简单和高效。在本文中,我们将深入探讨React框架的一些关键技巧和最佳实践,同时提供相应的源代码示例。合理使用函数组件和类组件React提供了两种主要的组件类型:函数组件和类组件。函数组件是纯粹的JavaScript函数,而类组件则是通过继承React.Component类创建的。在</div> </li> <li><a href="/article/1882521749371809792.htm" title="《石头做的汤》" target="_blank">《石头做的汤》</a> <span class="text-muted">jerry201108</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>资料来源《程序员修炼之道:通向务实的最高境界(第2版)》我记得幼儿园时的绘本中好像就有《石头汤》,不知道变成大孩子后对石头汤的理解是怎样的,回头可以再让他看看这段故事说说其中的体会。有三个战场归途中的士兵饥肠辘辘。他们看到前方有一座村庄,顿时重整精神——他们觉得村民们会给口饭吃。可是当他们抵达那里时,却发现四处门窗紧闭。多年战乱下,村民们食物短缺,仅有的存粮都藏了起来。士兵们没有气馁,他们烧了一锅</div> </li> <li><a href="/article/1882513679979704320.htm" title="vector迭代器" target="_blank">vector迭代器</a> <span class="text-muted">黄亚磊11</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a> <div>vector迭代器:除了使用下标来访问vector对象的元素外,标准库还提供了另一种检测元素的方法:使用迭代器(iterator)。迭代器是一种允许程序员检查容器内元素,并实现元素遍历的数据类型。迭代器类型提供了比下标操作更一般化的方法:所有的标准容器容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标访问容器元素,即</div> </li> <li><a href="/article/1882478127658102784.htm" title="c#分页_《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐" target="_blank">c#分页_《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐</a> <span class="text-muted">weixin_39654058</span> <a class="tag" taget="_blank" href="/search/c%23%E5%88%86%E9%A1%B5/1.htm">c#分页</a><a class="tag" taget="_blank" href="/search/c%23%E7%BB%99%E6%8C%89%E9%92%AE%E6%B7%BB%E5%8A%A0%E9%93%BE%E6%8E%A5/1.htm">c#给按钮添加链接</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员。我最近开始写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用dotnet技术更好的运用于工作和学习中去。历经3个白天2个黑夜(至凌晨2点),Dotnet9小编经过反复修改、润色,终于完成此文编写(本文略长,手机党请考虑流量),只能说小编我不容易呀不容易。完成此文编</div> </li> <li><a href="/article/1882452026441396224.htm" title="用Java发送Email就这么简单" target="_blank">用Java发送Email就这么简单</a> <span class="text-muted">五行星辰</span> <a class="tag" taget="_blank" href="/search/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F%E5%BA%94%E7%94%A8%E6%8A%80%E6%9C%AF/1.htm">业务系统应用技术</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>咱程序员在开发过程中,时常会遇到需要发送邮件的场景,好比通知用户注册成功、提醒密码找回啥的。这时候,Java就派上大用场啦,今儿个咱就唠唠咋用Java发送Email。一、准备工作要实现Java发送邮件,咱得先引入相关的依赖。要是用Maven构建项目,在pom.xml文件里加上这几行代码:javax.mailmail1.4.7javax.activationactivation1.1.1这就好比给你</div> </li> <li><a href="/article/1882405504160952320.htm" title="多级缓存 JVM进程缓存" target="_blank">多级缓存 JVM进程缓存</a> <span class="text-muted">Rverdoser</span> <a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>在Java虚拟机(JVM)中,多级缓存通常指的是JVM内部的多层缓存机制,包括指令缓存、数据缓存等,这些缓存都是为了提高程序运行效率。在Java中,JVM的多级缓存是自动管理的,不需要程序员手动干预。但是,如果你想要监控或调试这些缓存的行为,可以使用一些JVM提供的工具和选项,如JMC(JavaMissionControl)、JVisualVM、JFR(JavaFlightRecorder)等。如</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>