JavaScript高级程序设计——笔记(第10章)

第10章 DOM

DOM(文档对象模型)是针对HTML和XML文档的一个API。DOM描述了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。
注意:IE中所有的DOM对象都是以COM对象的形式实现的。这意味着IE中的DOM对象和原生JavaScript对象的行为或活动特点并不一致

10.1 节点层次

文档节点是每个文档的根节点,文档节点通常只有一个子节点——文档元素(元素)。
文档元素是稳当的最外层元素,文档中的其他元素都包含在文档元素中。每个文档只能有一个文档元素。在HTML页面中,文档元素始终是元素,在XML中,没有预定义的元素,因此任何一个元素都可以成为文档元素。

10.1.1 Node类型

DOM1级定义了一个Node接口,该接口将由DOM中所有节点类型实现。这个Node接口在JavaScript中是作为Node类型实现的;除了IE之外,在其他所有浏览器中都可以访问到这个类型。JavaScript中所有节点类型都继承自Node类型,因此所有节点类型都共享着基本属性和方法。每个节点都有一个nodeType属性,用于表明节点的类型。节点类型由在Node类型中定义的下列12个数值常量来表示,任何节点类型必居其一:

1 ELEMENT_NODE
2 ATTRIBUTE_NODE
3 TEXT_NODE
4 CDATA_SECTION_NODE
5 ENTITY_REFERENCE_NODE
6 ENTITY_NODE
7 PROCESSING_INSTRUCTION_NODE
8 COMMENT_NODE
9 DOCUMENT_NODE
10 DOCUMENT_TYPE_NODE
11 DOCUMENT_FRAGMENT_NODE
12 NOTATION_NODE

确定节点类型时,可以将someNode.nodeTypeNode.XXX_NODE常量相比较,然而,由于IE并没有公开Node类型的构造函数,因此在IE中不能这样确定节点类型。为了确保跨浏览器兼容,最好还是someNode.nodeType属性与数字值相比较,如下所示:
if (someNode.nodeType == 1) {
//适用于所有浏览器 1~12
}
并不是所有节点都受到Web浏览器的支持,开发者最常用的是元素节点文本节点

nodeNamenodeValue属性
要了解节点的具体信息,可以使用节点的nodeNamenodeValue属性。在使用这两个节点之前,最好先检测一下节点类型:

    if (someNode.nodeType == 1) {
        value = someNode.nodeName;  //nodeName的值是元素的标签名
    }

对于元素节点,nodeName中保存的始终是元素的标签名,nodeValue始终为null。

节点关系
每个节点都有一个childNodes属性,其中保存着一个NodeList对象。NodeList是一种类数组对象,和arguments一样,并非Array的实例。NodeList的独特之处在于,它实际上是基于DOM结构动态执行查询的结果。因此DOM结构的变化能够自动反映到NodeList对象中。我们常说,NodeList对象是有呼吸,有生命的对象,而不是我们在第一次访问它时拍下的一张快照。访问NodeList对象里的节点有两种方法,方括号(类似于数组)的方式item()方法。示例:

        var firstChild = someNode.childNodes[0];
        var secondChild = someNode.childNodes.item(1);
        var cpunt = someNode.childNodes.length;//length属性表示childNodes对象中子节点的数量

在前面介绍过,使用Array.prototype.slice()方法可以将arguments对象转换为一个数组,同样,使用这个方法可以把childNodes对象转换为数组:

     //在IE8之前的版本中无效
        var arrayOfNodes = Array.prototype.slice.call(someNode.childNodes, 0);

因为在IE8之前,childNodes在IE中并非一个JScript对象,而是一个COM对象,使用上面的语法会抛出错误。在IE浏览器(IE8之前),需要手动枚举childNodes中的每个子节点,最终组成一个数组

       function convertToArray(nodes) {
            var array = null;
            try {
                array = Array.prototype.slice.call(nodes.childNodes, 0); //针对非IE浏览器
            } catch (ex) {
                array = new Array();
                for (var i = 0;i < nodes.childNodes.length;i++) {
                    array.push(nodes[i]);
                }
                i = null;
            }
            return array;
        }

每个节点都有一个parent属性,里面是它的父节点。包含在childNodes对象中的所有子节点都有一个共同的父节点。因此他们的parent属性都指向同一个父节点。此外,包含在childNodes列表中的节点都是同胞节点,通过每个节点的previousSibling属性和nextSibling属性可以访问到同一列表的其他节点。列表中第一个节点的previousSibling属性为null,最后一个节点的nextSibling属性为null。如下所示:

        if (someNode.nextSibling === null) {
            alert("Last node in the parent's childNodes list.")
        } else if (someNode.previousSibling === null) {
            alert("First node in the parent's childNodes list.")
        }

如果childNodes中只有一个节点,那它的previousSibling属性和nextSibling属性都为null。
父节点和第一个子节点、最后一个子节点也有特殊的关系。父节点的firstChildlastChild分别指向childNotes的第一个节点和最后一个节点。如果没有子节点,那么firstChildlastChild都为null。仔细查看原书中图10-2。
hasChildNodes()方法在父节点包含一个或者多个子节点时返回true,没有子节点时返回false
最后是所有的节点都有的一个属性叫做ownerDocument,该属性指向表示整个文档的文档节点。这种关系表示的是任何节点都属于它所在的文档。任何节点都不能同时存在于两个或更多文档中,通过这个属性,我们不必层层回溯到达顶端,而是可以直接访问文档节点。
虽然所有节点都继承自Node节点,但并非所有节点都有子节点

操作节点
因为关系指针都是只读的,所以DOM提供了一系列操作节点的方法。
appendChild():添加一个新节点到父节点childNotes的最后一个位置并返回这个节点

    var returnedNode = someNode.appendChild(newNode);
    alert(returnedNode == newNode); //true
    alert(someNode.lastChild == newNode);   //true

如果添加的新节点是文档中已有节点的话,则改变它的位置(将这个节点移动到最后)

    //someNode有多个子节点
    var returnedNode = someNode.appendChild(someNode.firstChild);
    alert(returnedNode == someNode.firstChild); //false 第一个子节点已经改变
    alert(returnedNode == someNode.lastChild);  //true

insertrefore():插入节点,将要插入的节点放在父节点childNotes的某个位置上,接收两个参数。参数一是要插入的节点,参数二是作为参照的节点。结果是要插入的节点将插入到参照节点之前(成为同胞节点,参数一是参数二的previousSibling)。方法返回要插入的节点(即参数一)
参数二为null时,和appendChild()方法一样,插入到childNotes的最后

    //插入后成为最后一个子节点
    returnedNode = someNode.insertrefore(newNode, null);
    alert(returnedNode == someNode.lastChild);  //true

    //插入后成为第一个子节点
    returnedNode = someNode.insertrefore(newNode, someNode.firstChild);
    alert(returnedNode == newNode); //true
    alert(newNode == someNode.firstChild);  //true

    //插入到最后一个子节点前面
    returnedNode = someNode.insertrefore(newNode, someNode.lastChild);
    alert(newNode == someNode.childNodes[someNode.childNodes.length - 2]);  //true

replaceChild():替换节点。接收两个参数,参数一是要插入到childNotes中的节点(新节点),参数二是被替换的节点(旧节点)。被替换的节点将从文档树中被移除,由参数一代表的要插入的节点占据其位置(参数一替换参数二)。方法返回被替换的节点(参数二)。在使用replaceChild()替换一个节点时,被替换的节点所有关系指针将被复制到要插入的节点上。从技术角度讲,被替换的节点还在文档中,但是在文档树中已经没有了它的位置。

    //替换第一个子节点
    var returnedNode = someNode.replaceChild(newNode, someNode.firstChild);

    //替换最后一个子节点
    returnedNode = someNode.replaceChild(newNode, someNode.lastChild);

removeChild():移除指定节点,返回被移除的节点。被remove的节点还在文档中,但是在文档树中已经没有了它的位置

    //移除第一个子节点
    var formerFirstChild = someNode.removeChild(someNode.firstChild);

    //移除最后一个子节点
    var formerLastChild = someNode.removeChild(someNode.lastChild);

上面介绍的四个方法操作的都是某个节点的子节点,也就是说,要使用这几个方法要先取得父节点,另外,不是所有的节点都有子节点,如果在不支持子节点的节点上调用了这些方法,将会导致错误发生。

其他方法
有两个方法是所有类型的节点都有的:cloneNode() normalize()
cloneNode():创建一个调用这个方法的节点的一个副本。接收一个参数,参数值为true和false。true表示深复制,将复制整个节点和子节点树;false表示浅复制,只复制这个节点,不复制其子节点树。复制后返回的节点归文档所有,但没有为它指定父节点,因此这个节点副本就成了一个“孤儿”。除非通过appendChild()、insertrefore()或者replaceChild()方法将它添加到文档中
假设有如下HTML代码:

    <ul id="ul"><li>item1li><li>item2li><li>item3li>ul>

脚本:

        var mylist = document.getElementryId("ul");
        var deepList = mylist.cloneNode(true);
        alert(deepList.childNodes.length);  //3

        var shallowList = mylist.cloneNode(false);
        alert(shallowList.childNodes.length);   //0

如果HTML代码如下:

        <ul id="ul">
            <li>item1li>
            <li>item2li>
            <li>item3li>
        ul>

那么脚本代码结果将变为:

        var mylist = document.getElementryId("ul");
        var deepList = mylist.cloneNode(true);
        alert(deepList.childNodes.length);  //7

        var shallowList = mylist.cloneNode(false);
        alert(shallowList.childNodes.length);   //0

之所以(deepList.childNodes.length的值会发生改变,是因为IE(IE<9)和其他浏览器处理空白文本节点的机制不一样 ,FF,谷歌,IE>=9浏览器会将各个节点之间的空白也算作一个节点,但是IE(IE<9)不会
解决方法一:像上面那样修改HTML源码节点之间无空格。
解决方法二:调用childNodes属性之前先将空格删除 (HTML源码可以缩进),脚本代码为:

        var mylist = document.getElementryId("ul");
        var deepList = mylist.cloneNode(true);
        for (var i = 0; i < deepList.childNodes.length; i++) {
            //如果是文本节点,并且值为空,则删除该节点
            if (deepList.childNodes[i].nodeType == 3 && /\s/.test(deepList.childNodes[i].nodeValue)) {
                deepList.childNodes[i].parentNode.removeChild(deepList.childNodes[i]);
            }
        }
        alert(deepList.childNodes.length);  //3

        var shallowList = mylist.cloneNode(false);
        alert(shallowList.childNodes.length);   //0

nodeType为常数3时表示节点为文本节点,第二个条件为使用正则表达式判断当前这个节点中是否含有空格(\s)。
normalize():这个方法的唯一作用就是处理文档树中的文本节点。由于解析器的实现或者DOM操作等原因,可能会出现文本节点不包含文本,或者接连出现两个文本节点的情况。当在某个节点上调用这个方法时,就会在该节点的后代节点中查找上述两种情况。如果找到了空文本节点则删除它,如果找到了两个相邻的文本节点则将它们合并为一个文本节点。

10.1.2 Document类型

JavaScript中通过Document类型表示文档。在浏览器中,document对象是HTMLDocument(继承自Document类型)的第一个实例,表示整个HTML页面。而且,document对象是window对象的属性,因此可以将其作为全局对象来访问。Document节点具有以下特征:

  • nodeType的值为9
  • nodeName的值为“#document”
  • nodeValue的值为null
  • parentNode的值为null
  • ownerDocument的值为null
  • 其子节点可能是一个DocumentType(最多一个)、Element(最多一个)、ProcessingInstruction或Comment。

Document类型可以表示HTML页面或者其他基于XML的文档。不过,最常见的应该是作为HTMLDocument实例的document对象。通过这个对象,不仅能够取得与页面有关的信息,还可以操作页面的外观和底层结构。
补充:在Firefox、Safari、Chrome和Opera中,可以通过脚本访问Document类型的构造函数和原型。但在所有浏览器中都可以访问HTMLDocument类型的构造函数和原型。

文档的子节点
虽然DOM标准规定Document节点的子节点可以是DocumentType、Element、ProcessingInstruction或Comment,但还有两个内置的访问其子节点的快捷方式,第一个就是documentElement属性,该属性始终指向HTML页面中的元素。另一个就是通过childNotes列表访问文档元素,但通过documentElement属性能更快捷、更直接的访问该元素。示例;
HTML代码:

    <html lang="en">
    <body>
    body>
    html>

脚本代码:

        var html = document.documentElement;
        alert(html === document.firstChild);    //true
        alert(html === document.childNodes[0]); //true

documentElement虽然永远指向元素,但是document.firstChilddocument.childNodes[0]不一定
document还有一个body属性,指向元素,开发人员经常要使用这个元素,因此document.body在JavaScript代码中出现的频率非常高。

    var body = document.body

所有浏览器都支持document.documentElementdocument.body属性。
Document另一个可能的子节点是DocumentType。通常将标签看成一个与文档其他部分不同的实体,可以通过doctype属性(浏览器中是document.type来访问它的信息):

    vardoctype=document.doctype;

浏览器对document.doctype的支持差别很大,可以给出如下总结:

1.IE8及之前版本:如果存在文档类型声明,会将其错误的解释为一个注释并把它当做Comment节点;而`document.doctype`的值始终为null。
2.IE9+及Firefox:如果存在文档类型声明,则将其作为文档的第一个子节点;`document.doctype`是一个DocumentType节点,也可以通过`document.firstChild`或者`document.childNodes[0]`访问同一个节点。
3.Safari、Chrome和Opera:如果存在文档类型声明,则将其解析,但不作为文档的子节点。`document.doctype`是一个DocumentType节点,但该节点不会出现在document.childNodes中。

由于浏览器对这个属性的支持不一致,因此这个属性的用处也很有限。

文档信息
作为HTMLDocument的一个实例,document对象还有一些标准的Document对象所没有的属性。这些属性提供了document对象所表现的一些网页的信息。其中第一个属性就是title,包含着</code>元素的文本——显示在浏览器的标题栏或者标签页上。修改title的值就是修改<code><title></code>元素中文本的值,不会影响<code><title></code>元素。示例:</p> <pre class="prettyprint"><code class=" hljs avrasm"> vartitleName=document<span class="hljs-preprocessor">.title</span><span class="hljs-comment">;</span> alert(titleName)<span class="hljs-comment">;</span> document<span class="hljs-preprocessor">.title</span>=<span class="hljs-string">"修改后的title"</span><span class="hljs-comment">;//会反映在标签页或者标题栏上</span></code></pre> <p>接下来的3个属性都与浏览器请求有关,分别是<code>URl</code>、<code>domain</code>和<code>referrer</code>。<code>URL</code>属性包含页面完整的URL,<code>domain</code>属性只包含页面的域名,而<code>referrer</code>属性则保存着链接到当前页面的那个页面的URL。在没有来源页面的情况下,<code>referrer</code>属性中可能存放的是<strong>空字符串</strong>。所有的这些信息都存储在<strong>HTTP请求头部</strong>,只不过通过这些属性让我们可以访问到它们而已,如下所示:</p> <pre class="prettyprint"><code class=" hljs lasso"> <span class="hljs-comment">//获得完整的URL</span> <span class="hljs-built_in">var</span> url <span class="hljs-subst">=</span> document<span class="hljs-built_in">.</span>URL; <span class="hljs-comment">//取得域名</span> <span class="hljs-built_in">var</span> domain <span class="hljs-subst">=</span> document<span class="hljs-built_in">.</span>domain; <span class="hljs-comment">//取得来源页面的URL</span> <span class="hljs-built_in">var</span> <span class="hljs-keyword">referrer</span> <span class="hljs-subst">=</span> document<span class="hljs-built_in">.</span><span class="hljs-keyword">referrer</span>;</code></pre> <p><code>URL</code>和<code>domain</code>属性是相关联的。例如,如果<code>document.URL</code>等于https://www.baicu.com/s,那么<code>document.domain</code>就等于 www.baidu.com 。在这三个属性中,<strong>只有<code>domain</code>是可以设置的</strong>,但出于安全方面的限制,也并非可以给<code>domain</code>设置任何值。书中貌似可以给<code>domain</code>属性设置值,但是我查了W3SCHOOL,上面指出该属性是只读的:</p> <blockquote> <p>该属性是一个只读的字符串,包含了载入当前文档的 web 服务器的主机名。 <br> 来自 http://www.w3school.com.cn/jsref/prop_doc_domain.asp </p> </blockquote> <p>为了验证,我写了一个试试:</p> <pre class="prettyprint"><code class=" hljs xml"> <span class="hljs-tag"><<span class="hljs-title">html</span>></span> <span class="hljs-tag"><<span class="hljs-title">body</span>></span> 本文档的域名是: <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> document.write(document.domain); document.domain = <span class="hljs-string">"w3school.com.cn"</span>; document.write(<span class="hljs-string">"<br>本文档的域名是:"</span>+document.domain); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"></<span class="hljs-title">html</span>></span></code></pre> <p>运行结果:</p> <blockquote> <p>本文档的域名是: www.w3school.com.cn <br> 本文档的域名是:w3school.com.cn </p> </blockquote> <p>这段代码并非在编辑器中所写,而是在W3SCHOOL中的示例代码中修改的。 <br> 书中说的是正确的,<strong><code>domain</code>属性确实可以修改,但是<code>domain</code>不能设置为URL中不包含的域</strong>。 <br> 如下所示:</p> <pre class="prettyprint"><code class=" hljs xml"> <span class="hljs-tag"><<span class="hljs-title">html</span>></span> <span class="hljs-tag"><<span class="hljs-title">body</span>></span> 本文档的域名是: <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> document.write(document.domain); document.domain = <span class="hljs-string">"baidu.com.cn"</span>; document.write(<span class="hljs-string">"<br>本文档的域名是:"</span>+document.domain); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"></<span class="hljs-title">html</span>></span></code></pre> <p>我修改了<code>domain</code>设置的值,运行后结果:</p> <blockquote> <p>本文档的域名是: www.w3school.com.cn </p> </blockquote> <p>这说明<code>domain</code>设置是有限制的(<code>domain</code>设置的值必须在当前这个网站下,不可以设置为别的网站的域名)。 <br> <strong>通过设置<code>domain</code>属性,可以实现来自不同子域的页面之间的JavaScript通信</strong>。当页面中含有来自其他子域的框架或者内嵌框架时,由于<strong>跨域安全限制</strong>,来自不同子域的页面是无法通过JavaScript进行通信的,<strong>通过设置这些子域页面的<code>domain</code>属性为相同的值,这些页面就可以互相访问对方包含的JavaScript对象了</strong>。举例:</p> <blockquote> <p>有一个页面加载自www.baidu.com,其中包含一个内嵌框架,框架内的页面加载自p2p.baidu.com,由于<code>document.domain</code>中保存的字符串不同,内外两个页面之间无法访问对方的JavaScript对象,但如果将两个页面的<code>domain</code>属性都设置为baidu.com,则它们之间就可以相互通信了。</p> </blockquote> <p>浏览器对<code>domain</code>属性还有一个限制,即如果域名一开始是<strong>“松散的”(loose)</strong>,那么不能将它再设置为<strong>“紧绷的”(tight)</strong>。换句话说,将<code>document.domain</code>属性设置为“baidu.com”之后,无法再将<code>domain</code>属性设置为“www.baidu.com”,否则将会导致错误。如下所示:</p> <pre class="prettyprint"><code class=" hljs avrasm"> //假设页面来自www<span class="hljs-preprocessor">.baidu</span><span class="hljs-preprocessor">.com</span> document<span class="hljs-preprocessor">.domain</span> = <span class="hljs-string">"baidu.com"</span><span class="hljs-comment">; //松散的(成功)</span> document<span class="hljs-preprocessor">.domain</span> = <span class="hljs-string">"www.baidu.com"</span><span class="hljs-comment">; //紧绷的(出错!)</span></code></pre> <p>所有的浏览器都存在这个限制,但IE8是最早实现这个限制的版本。</p> <p><strong><em>查找元素</em></strong> <br> 查找元素的三个方法:</p> <blockquote> <p>document.getElementryId(); <br> document.getElementsByTagName(); <br> document.getElementsByName();</p> </blockquote> <p><code>document.getElementryId()</code>:接收一个参数,参数值为文档中元素节点的id特性值(Attribute),返回这个元素。参数id严格匹配,区分大小写(IE8及较低版本不区分大小写)。<strong>如果页面中多个元素的id值相同,则只返回文档中第一次出现的元素</strong>。IE7及较低版本还有一个怪癖:name特性与给定ID匹配的表单元素也会被该方法返回。 <br> <code>document.getElementsByTagName()</code>:接收一个参数,即元素的标签名,返回包含零或多个元素的NodeList。在HTML文档中,这个方法会返回一个HTMLCollection对象,作为一个“动态”集合,该对象与NodeList非常类似,可以使用方括号语法或者<code>item()</code>方法来访问HTMLCollection中的项,同样具有<code>length</code>属性。方括号中可以是<strong>数值索引</strong>和<strong>字符串索引</strong>(字符串必须为HTMLCollection中某个元素的name特性值)。HTMLCollection还有一个方法,叫做<code>namedItem()</code>,使用这个方法可以通过元素的<code>name</code>属性取得集合中的项。示例:</p> <pre class="prettyprint"><code class=" hljs cs"> <span class="hljs-comment">//获取所有<img>标签元素</span> <span class="hljs-keyword">var</span> images = document.getElementsByTagName(<span class="hljs-string">"img"</span>); <span class="hljs-comment">//输出图片的数量</span> alert(images.length); <span class="hljs-comment">//输出第一个图像的src特性值</span> alert(images[<span class="hljs-number">0</span>].src); <span class="hljs-comment">//输出第一个图像的src特性值</span> alert(images.item(<span class="hljs-number">0</span>).src);</code></pre> <p>假设现在有这么一个元素:</p> <pre class="prettyprint"><code class=" hljs xml"> <span class="hljs-tag"><<span class="hljs-title">img</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">""</span> <span class="hljs-attribute">alt</span>=<span class="hljs-value">""</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"myImage"</span>></span></code></pre> <p>在上面的“images”变量中取得这个元素:</p> <pre class="prettyprint"><code class=" hljs cs"> <span class="hljs-keyword">var</span> myImage = images.namedItem(<span class="hljs-string">"myImage"</span>);</code></pre> <p>或者</p> <pre class="prettyprint"><code class=" hljs cs"> <span class="hljs-keyword">var</span> myImage = images[<span class="hljs-string">"myImage"</span>];</code></pre> <p>\对于HTMLCollection而言,我们可以向方括号中传入数值或者字符串形式的索引值,在后台,<strong>对数值索引就会调用item(),对字符串索引就会调用namedItem()</strong>。 <br> 向<code>document.getElementsByTagName()</code>中传入一个“<em>”</em>表示通配符全部,即可以获取整个页面中所有的元素(按照先后顺序)。<strong>补充:IE将注释(Comment)实现为元素(Element)</strong>,因此IE中传入“<em>”</em>会返回所有注释节点。传给<code>document.getElementsByTagName()</code>中的参数是不区分大小写的。 <br> <code>document.getElementsByName()</code>:接收一个参数,参数值为页面中某个元素的<code>name</code>特性值。最常使用在单选按钮中,操纵一组单选按钮,因此一组单选按钮的<code>name</code>特性值一般相同。该方法也返回一个HTMLCollection,但是对于一组<code>name</code>相同的元素来说,使用字符串索引或者调用<code>namedItem()</code>方法则只会取得集合中的第一项(因为每一项的name特性值都相同)。</p> <p><strong><em>特殊集合</em></strong> <br> 除了属性和方法,<code>document</code>对象还有一些特殊的集合。这些集合都是HTMLCollection对象,为访问文档提供了快捷方式。</p> <ul> <li>document.anchors:返回文档中所有带有name特性的元素。</li> <li>document.applets:包含文档中所有的元素,因为不再推荐使用元素,所以不建议使用这个集合。</li> <li>document.forms:包含文档中所有的元素,与document.getElementryTagName(“form”)得到的结果相同。</li> <li>document.images:包含文档中所有的元素,与document.getElementryTagName(“img”)得到的结果相同。</li> <li>document.links:包含文档中所有带href特性的元素。</li> </ul> <p>上面这些集合始终都可以通过HTMLDocument对象访问到,而且,和HTMLCollection对象类似,集合中的项也会随着当前文档内容的更新而更新。</p> <p><strong><em>DOM一致性检测</em></strong> <br> 由于DOM分为多个级别,也包含多个部分,因此检测浏览器实现了哪些DOM标准就十分必要了。<code>document.implementation</code>属性就是为此提供相应信息和功能的对象,它提供了一个<code>hasFeature()</code>方法,该方法接收两个参数,参数一是DOM功能的名称,参数二是版本号。如果浏览器支持给定名称和版本的功能则返回<code>true</code>,不支持则返回<code>false</code>。示例:</p> <pre class="prettyprint"><code class=" hljs coffeescript"> <span class="hljs-reserved">var</span> hasXMLDom = <span class="hljs-built_in">document</span>.implementation.hasFeature(<span class="hljs-string">"XML"</span>, <span class="hljs-string">"1.0"</span>); alert(hasXMLDom); <span class="hljs-regexp">//</span><span class="hljs-literal">true</span></code></pre> <p><code>document.implementation</code>属性貌似已经被弃用了…… <br> https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature</p> <p><strong><em>文档写入</em></strong> <br> 将输出流写入到网页。<code>write()</code>、<code>writeln()</code>、<code>open()</code>、<code>close()</code>。 <br> <code>document.write()</code>和<code>document.writeln()</code>方法都接收一个字符串参数,<code>write()</code>会原样输出,而<code>writeln()</code>会在字符串的末尾添加一个换行符(\n)。在页面加载的过程中,可以向页面动态地加载内容:</p> <pre class="prettyprint"><code class=" hljs xml"> <span class="hljs-tag"><<span class="hljs-title">p</span>></span>The current date and time is: <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> document.write(<span class="hljs-string">"<b>"</span> + <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toString() + <span class="hljs-string">"<\/b>>"</span>); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span> <span class="hljs-tag"></<span class="hljs-title">p</span>></span></code></pre> <p>除此之外,还可以使用<code>document.write()</code>和<code>document.writeln()</code>方法动态地包含外部资源(如JS文件),在包含JS脚本时,要注意不能直接包含字符串<code></script></code>,而是要将斜杠进行转义。否则将会导致字符串中的<code></script></code>解释为脚本代码结束,之后的代码将无法运行。示例;</p> <pre class="prettyprint"><code class=" hljs applescript"> <p>The <span class="hljs-command">current date</span> <span class="hljs-keyword">and</span> <span class="hljs-property">time</span> <span class="hljs-keyword">is</span>: <<span class="hljs-keyword">script</span> type=<span class="hljs-string">"text/javascript"</span>> document.<span class="hljs-command">write</span>(<span class="hljs-string">"<script type\"text\/javascript\" src=\"example.js\">"</span> + <span class="hljs-string">"<\/<script>"</span>); </<span class="hljs-keyword">script</span>> </p></code></pre> <p>前面的例子都是在文档加载时向网页输出内容,如果在页面加载完成后再调用<code>document.write()</code>或<code>document.writeln()</code>,<strong>输出的内容将会重写整个页面</strong>:</p> <pre class="prettyprint"><code class=" hljs javascript"> window.onload = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">()</span> {</span> document.write(<span class="hljs-string">"重写页面!"</span>); };</code></pre> <p>使用<code>window.onload</code>事件,表示页面加载后再执行函数。 <br> <code>open()</code>和<code>close()</code>分别用于打开和关闭网页的输出流。如果是在页面加载期间使用<code>write()</code>和<code>writeln()</code>方法,则不需要使用这两个方法。 <br> <strong>严格类型的XHTML文档不支持文档写入。对于那些按照application/xml+xhtml内容类型提供的页面,write()和writeln()也同样无效</strong>。</p> <h4 id="1013-element类型">10.1.3 Element类型</h4> <p>除了Document类型以外,Element类型是最常使用的类型了。Element类型用于表现XML或HTML元素,提供了对元素标签名,子节点及特性的访问。Element类型具有以下特征:</p> <ul> <li><code>nodeType</code>的值为1</li> <li><code>nodeName</code>的值为元素的标签名</li> <li><code>nodeValue</code>的值为null</li> <li><code>parentNode</code>可能是Document也可能是Element</li> <li>其子节点可能是Element、Text、Comment、ProcessingInstruction、CDTASection或者EntityReference</li> </ul> <p>要访问元素的标签名,可以使用<code>nodeName</code>属性,也可以使用<code>tagName</code>属性。后者更为清晰:</p> <pre class="prettyprint"><code class=" hljs xml"> HTML:<span class="hljs-tag"><<span class="hljs-title">divid="mydiv"</span>></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span></code></pre> <p>脚本代码:</p> <pre class="prettyprint"><code class=" hljs avrasm"> varmydiv=document<span class="hljs-preprocessor">.getElementryId</span>(<span class="hljs-string">"mydiv"</span>)<span class="hljs-comment">;</span> alert(mydiv<span class="hljs-preprocessor">.tagName</span>)<span class="hljs-comment">;//"DIV"</span> alert(mydiv<span class="hljs-preprocessor">.tagName</span>===mydiv<span class="hljs-preprocessor">.nodeName</span>)<span class="hljs-comment">;//true</span></code></pre> <p><strong>在HTML中,标签名全部以大写表示;而在XML(有时候也包括XHTML)中,标签名则始终会与源代码中保持一致</strong>。假如不确定脚本将会在HTML还是XML文件中运行,最好是在比较之前将标签名转换为相同的大小写形式:</p> <pre class="prettyprint"><code class=" hljs livecodeserver">//不要这样做,很容易出错! <span class="hljs-keyword">if</span>(<span class="hljs-keyword">element</span>.tagName==<span class="hljs-string">"div"</span>){<span class="hljs-comment"> //执行某些代码……</span> }<span class="hljs-comment"> //下面的写法适用于任何文档</span> <span class="hljs-keyword">if</span>(<span class="hljs-keyword">element</span>.tagName.toLowerCase()==<span class="hljs-string">"div"</span>){<span class="hljs-comment"> //执行某些代码……</span> }</code></pre> <p>在比较之前转换为小写(大写)形式再比较。</p> <p><strong><em>HTML元素</em></strong> <br> 所有的HTML元素都由HTMLElement类型表示,不是直接通过这个类型,也是通过它的子类型来表示。HTMLElement直接继承自Element并添加了一些属性,添加的这些属性分别对应html元素中的下列标准特性:</p> <ul> <li><code>id</code>,元素在文档中的唯一标识符。</li> <li><code>title</code>,有关元素的附加说明信息,一般通过工具提示条显示出来。</li> <li><code>lang</code>,元素内容的语言代码,现在很少使用了。</li> <li><code>dir</code>,语言的方向,值为“ltr”(left to right)和“rtl”(right to left),也很少使用。</li> <li><code>className</code>,与元素的class属性对应,即为元素指定的CSS类。没有将这个属性命名为“class”,是因为class在ECMAScript中是保留字。 <br> 上面这些属性都可以用来取得或者修改相应的特性值。</li> </ul> <p><strong><em>取得特性</em></strong> <br> 每个元素都有一个或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。操作特性的DOM方法主要有三个,分别是<code>getAttribute()</code>、<code>setAttribute()</code>和<code>removeAttribute()</code>。<strong>这三个方法可以对任何特性使用</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"bd"</span> <span class="hljs-attribute">title</span>=<span class="hljs-value">"Body text"</span> <span class="hljs-attribute">lang</span>=<span class="hljs-value">"en"</span> <span class="hljs-attribute">dir</span>=<span class="hljs-value">"ltr"</span>></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> myDiv = document.getElementryId(<span class="hljs-string">"myDiv"</span>); console.log(myDiv.getAttribute(<span class="hljs-string">"id"</span>)); <span class="hljs-comment">//myDiv</span> console.log(myDiv.getAttribute(<span class="hljs-string">"class"</span>)); <span class="hljs-comment">//bd</span> console.log(myDiv.getAttribute(<span class="hljs-string">"title"</span>)); <span class="hljs-comment">//Body text</span> console.log(myDiv.getAttribute(<span class="hljs-string">"lang"</span>)); <span class="hljs-comment">//en</span> console.log(myDiv.getAttribute(<span class="hljs-string">"dir"</span>)); <span class="hljs-comment">//ltr</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>注意:<strong>传递给<code>getAttribute()</code>的特征名和实际的特征名相同</strong>。因此要得到<code>class</code>特性的值,就应该传入“class”而不是“className”,<strong>后者只有通过对象属性访问时才用</strong>。如果给定名称的特性不存在,方法返回null。 <br> 通过<code>getAttribute()</code>方法也可以获取自定义属性,示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"bd"</span> <span class="hljs-attribute">title</span>=<span class="hljs-value">"Body text"</span> <span class="hljs-attribute">lang</span>=<span class="hljs-value">"en"</span> <span class="hljs-attribute">dir</span>=<span class="hljs-value">"ltr"</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span>></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> myDiv = document.getElementryId(<span class="hljs-string">"myDiv"</span>); <span class="hljs-keyword">var</span> value = myDiv.getAttribute(<span class="hljs-string">"my_special_attribute"</span>); <span class="hljs-comment">//hello!</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>特性的名称是布区分大小写的</strong>,即“ID”和“id”是同一个特性。 <br> <strong>根据HTML5规范,自定义特性应该加上<code>data-</code>前缀以便验证</strong>。 <br> 任何元素的所有属性,也都可以通过DOM元素本身的属性来访问。当然,HTMLElement也会有5个属性与相应的特性一一对应。不过,只有公认的(非自定义的)特性才会以属性的形式添加到DOM对象中。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"bd"</span> <span class="hljs-attribute">title</span>=<span class="hljs-value">"Body text"</span> <span class="hljs-attribute">lang</span>=<span class="hljs-value">"en"</span> <span class="hljs-attribute">dir</span>=<span class="hljs-value">"ltr"</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span>></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> myDiv = document.getElementryId(<span class="hljs-string">"myDiv"</span>); console.log(myDiv.id); <span class="hljs-comment">//myDiv</span> console.log(myDiv.className); <span class="hljs-comment">//bd</span> console.log(myDiv.title); <span class="hljs-comment">//Body text</span> console.log(myDiv.lang); <span class="hljs-comment">//en</span> console.log(myDiv.dir); <span class="hljs-comment">//ltr</span> console.log(myDiv.my_special_attribute); <span class="hljs-comment">//undefined(IE除外)</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>自定义特性在Safari、Chrome、Opera和Firefox中是不存在的,但是IE却会为自定义属性也创建特性</strong>。 <br> 有两类特殊的特性,它们虽然有对应的属性名,但属性值与通过<code>getAttribute()</code>返回的值并不相同。<strong>第一类特性就是<code>style</code></strong>,用于通过CSS元素指定样式。在通过<code>getAttribute()</code>访问时,返回的<code>style</code>特性值中包含的是CSS文本,而通过属性访问<code>style</code>则返回一个对象。由于<code>style</code>特性是用于以编程方式访问元素样式,因此并没有直接映射到<code>style</code>特性。<strong>第二类与众不同的特性是<code>onclick</code>这样的事件处理程序</strong>。当在元素上使用时,<code>onclick</code>特性中包含的是JavaScript代码,如果通过<code>getAttribute()</code>方法访问,返回的是相应代码的字符串。而在访问<code>onclick</code>属性时,则返回一个JavaScript函数(如果未在元素中指定相应的特性,则返回null)。这是因为<code>onclick</code>等事件处理程序特性本身就应该赋予函数值。 <br> 由于存在上面的差别,因此在通过JavaScript以编程方式操作DOM时,<strong>开发人员不经常使用<code>getAttribute()</code>,而是只使用对象的属性,只有在取得自定义属性的情况下,才会使用<code>getAttribute()</code>方法</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">onclick</span>=<span class="hljs-value">"myDivOnclick()"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myDivOnclick</span><span class="hljs-params">()</span> {</span> alert(<span class="hljs-string">"You click me!"</span>); } <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); console.log(myDiv.getAttribute(<span class="hljs-string">"style"</span>)); <span class="hljs-comment">//返回CSS代码</span> console.log(myDiv.style); <span class="hljs-comment">//返回一个对象</span> console.log(myDiv.getAttribute(<span class="hljs-string">"onclick"</span>)); <span class="hljs-comment">//返回相应代码的字符串</span> console.log(myDiv.onclick); <span class="hljs-comment">//返回一个JavaScript函数</span> console.log(myDiv.getAttribute(<span class="hljs-string">"my_special_attribute"</span>)); <span class="hljs-comment">//hello!</span> console.log(myDiv.my_special_attribute); <span class="hljs-comment">//undefined</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong><em>*设置特性</em></strong> <br> 与<code>getAttribute()</code>对应的方法是 <code>setAttribute()</code>,这个方法接收两个参数:要<strong>设置的特性名和特性值</strong>。如果特性已经存在,<code>setAttribute()</code>会以指定的值替换现有的值;如果特性不存在,<code>setAttribute()</code>则创建该属性并设置相应的值。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">onclick</span>=<span class="hljs-value">"myDivOnclick()"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myDivOnclick</span><span class="hljs-params">()</span> {</span> alert(<span class="hljs-string">"You click me!"</span>); } <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); myDiv.setAttribute(<span class="hljs-string">"id"</span>,<span class="hljs-string">"some other id"</span>); myDiv.setAttribute(<span class="hljs-string">"class"</span>, <span class="hljs-string">"ft"</span>); myDiv.setAttribute(<span class="hljs-string">"title"</span>, <span class="hljs-string">"some other text"</span>); myDiv.setAttribute(<span class="hljs-string">"lang"</span>,<span class="hljs-string">"fr"</span>); myDiv.setAttribute(<span class="hljs-string">"dir"</span>,<span class="hljs-string">"rtl"</span>); console.log(myDiv.getAttribute(<span class="hljs-string">"id"</span>)); <span class="hljs-comment">//some other id</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>通过<code>setAttribute()</code>方法设置了某元素各项特性后,并<strong>不会对已经取得该元素的变量产生任何影响,继续使用已经取得该元素的变量依然可以进行各种操作</strong>。除了使用<code>setAttribute()</code>方法外,可以直接设置某元素的属性,示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">onclick</span>=<span class="hljs-value">"myDivOnclick()"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myDivOnclick</span><span class="hljs-params">()</span> {</span> alert(<span class="hljs-string">"You click me!"</span>); } <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); myDiv.id = <span class="hljs-string">"some other id"</span>; myDiv.className = <span class="hljs-string">"ft"</span>; myDiv.title = <span class="hljs-string">"some other text"</span>; myDiv.lang = <span class="hljs-string">"fr"</span>; myDiv.dir = <span class="hljs-string">"rtl"</span>; console.log(myDiv.getAttribute(<span class="hljs-string">"id"</span>)); <span class="hljs-comment">//some other id</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>但是,为DOM元素添加一个自定义属性,该属性不会自动成为元素的特性。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">onclick</span>=<span class="hljs-value">"myDivOnclick()"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myDivOnclick</span><span class="hljs-params">()</span> {</span> alert(<span class="hljs-string">"You click me!"</span>); } <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); myDiv.myAttr = <span class="hljs-string">"world!"</span>; alert(myDiv.getAttribute(<span class="hljs-string">"myAttr"</span>)); <span class="hljs-comment">//null</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>推荐开发者通过属性来设置特性</strong>。 <br> 最后一个方法<code>removeAttribute</code>,这个方法用于彻底删除元素特性,调用这个方法不仅可以删除特性值,而且会在元素中完全删除特性。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">my_special_attribute</span>=<span class="hljs-value">"hello!"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">onclick</span>=<span class="hljs-value">"myDivOnclick()"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myDivOnclick</span><span class="hljs-params">()</span> {</span> alert(<span class="hljs-string">"You click me!"</span>); } <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); myDiv.removeAttribute(<span class="hljs-string">"my_special_attribute"</span>); alert(myDiv.getAttribute(<span class="hljs-string">"my_special_attribute"</span>)); <span class="hljs-comment">//null</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong><em><code>attributes</code>特性</em></strong> <br> Element类型是使用<code>attributes</code>属性的唯一一个DOM节点类型,<code>attributes</code>属性中包含一个NamedNodeMap,与NodeList类似,也是一个“动态”的集合。元素的每一个特性都由一个Attr节点表示,每个节点都保存在NamedNodeMap对象中,NamedNodeMap对象具有以下的方法。</p> <ul> <li>getNamedItem_(name)_:返回nodeName属性等于name的节点。</li> <li>removeNamedItem_(name)_:从列表中移除nodeName属性等于name的节点。</li> <li>setNamedItem_(name)_:向列表中添加节点,以节点的nodeName属性为索引。</li> <li>item_(pos)_:返回位于数字pos位置处的节点。</li> </ul> <p><code>attributes</code>属性中包含一系列的节点,<strong>每个节点的nodeName就是特性的名称,而节点的nodeValue就是特性的值</strong>。取得元素的<code>id</code>特性,示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); <span class="hljs-keyword">var</span> id = myDiv.attributes.getNamedItem(<span class="hljs-string">"id"</span>).nodeValue; alert(id); <span class="hljs-comment">//myDiv</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>问题:</strong>不是很理解下面这段代码:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-comment">// var myDiv = document.getElementById("myDiv");</span> <span class="hljs-keyword">var</span> id = myDiv.attributes.getNamedItem(<span class="hljs-string">"id"</span>).nodeValue; alert(id); <span class="hljs-comment">//myDiv</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>将获取<code>id</code>特性值为myDiv的element元素的代码注释掉后,脚本中的代码正常执行并返回了正确的结果,但是脚本代码第一行<code>var id = myDiv.attributes.getNamedItem("id").nodeValue;</code>中的myDiv并未定义,不知道为什么仍能正确运行……</p> <p>以下是使用方括号语法通过特性名访问节点的简写方式:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-comment">// var myDiv = document.getElementById("myDiv");</span> <span class="hljs-keyword">var</span> id = myDiv.attributes[<span class="hljs-string">"id"</span>].nodeValue; alert(id); <span class="hljs-comment">//myDiv</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>还是上面那个问题,未定义myDiv却可以使用。</p> <p>也可以使用<strong>方括号语法</strong>将某个特性设置为一个新值:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> element = document.getElementById(<span class="hljs-string">"myDiv"</span>); element.attributes[<span class="hljs-string">"id"</span>].nodeValue = <span class="hljs-string">"other id"</span>; alert(element.id); <span class="hljs-comment">//other id</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>使用<code>removeNamedItem()</code>删除某个特性(与在元素中调用<code>removeAttribute()</code>方法效果相同),两者之间有一点小小的不同就是<strong>使用<code>removeNamedItem()</code>会返回被删除了指定特性的节点</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span> <span class="hljs-attribute">my_special_attr</span>=<span class="hljs-value">"hello!"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> element = document.getElementById(<span class="hljs-string">"myDiv"</span>); <span class="hljs-keyword">var</span> oldAttr = element.attributes.removeNamedItem(<span class="hljs-string">"id"</span>); alert(oldAttr); <span class="hljs-comment">//[object Attr]</span> alert(element.id); <span class="hljs-comment">//空字符串</span> <span class="hljs-keyword">var</span> antherOldValue = element.attributes.removeNamedItem(<span class="hljs-string">"my_special_attr"</span>); alert(antherOldValue); <span class="hljs-comment">//[object Attr]</span> alert(element.getAttribute(<span class="hljs-string">"my_special_attr"</span>)); <span class="hljs-comment">//null</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>补充</strong>:其实对书中的说法持怀疑态度,在多次实验后,我发现只有<strong>自定义特性才会被真的删除(值和特性都被删除)</strong>,而非自定义特性(例如id,class,style……)<strong>只会被删除特性值而不会删除特性!</strong></p> <p>最后,<code>setNamedItem()</code>是一个不常用的方法,通过这个方法可以为元素添加一个新特性,为此需要传入一个新的特性节点。示例:</p> <pre class="prettyprint"><code class=" hljs avrasm">element<span class="hljs-preprocessor">.attributes</span><span class="hljs-preprocessor">.setNamedItem</span>(newAttr)<span class="hljs-comment">;</span></code></pre> <p>一般来说,使用<code>attributes</code>的方法不够方便,因此<strong>开发人员更多的会使用<code>getAttribute()</code>、<code>setAttribute()</code>和<code>removeAttribute()</code>方法</strong>。不过,如果要遍历元素的特性,<code>attributes</code>属性就可以派上用场了,在<strong>需要将DOM结构序列化为XML和HTML字符串时,多数都会涉及遍历元素特性</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"color: red;background-color: aqua"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span> <span class="hljs-attribute">my_special_attr</span>=<span class="hljs-value">"hello!"</span>></span> <span class="hljs-tag"><<span class="hljs-title">span</span>></span>测试文本<span class="hljs-tag"></<span class="hljs-title">span</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">outputAttributes</span><span class="hljs-params">(element)</span> {</span> <span class="hljs-keyword">var</span> paris = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Array</span>(), attrName, attrValue, i, len; <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, len = element.attributes.length; i < len; i++) { attrName = element.attributes[i].nodeName; attrValue = element.attributes[i].nodeValue; paris.push(attrName + <span class="hljs-string">"=\""</span> + attrValue + <span class="hljs-string">"\""</span>); } <span class="hljs-keyword">return</span> paris.join(<span class="hljs-string">" "</span>); } alert(outputAttributes(document.getElementById(<span class="hljs-string">"myDiv"</span>))); <span class="hljs-comment">//style="color: red;background-color: aqua" id="myDiv" my_special_attr="hello!"</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>使用了一个数组来保存名值对,最后再以空格为分隔符将它们拼接起来(这是序列化长字符串的一种常用技巧)</strong>。注意两点:一是不同的浏览器在遍历元素的<code>attributes</code>时,返回特性的顺序不同,二是在IE7及更早的版本中,会返回HTML中所有可能的特性,包括没有指定的特性(换句话说,就是可能返回一百多个特性)。 <br> 针对IE7及其以下版本中返回未指定特性的问题,可以对上面的函数加以改进:</p> <pre class="prettyprint"><code class=" hljs avrasm"> for (i = <span class="hljs-number">0</span>, len = element<span class="hljs-preprocessor">.attributes</span><span class="hljs-preprocessor">.length</span><span class="hljs-comment">; i < len; i++) {</span> attrName = element<span class="hljs-preprocessor">.attributes</span>[i]<span class="hljs-preprocessor">.nodeName</span><span class="hljs-comment">;</span> attrValue = element<span class="hljs-preprocessor">.attributes</span>[i]<span class="hljs-preprocessor">.nodeValue</span><span class="hljs-comment">;</span> if (element<span class="hljs-preprocessor">.attributes</span>[i]<span class="hljs-preprocessor">.specified</span>) { paris<span class="hljs-preprocessor">.push</span>(attrName + <span class="hljs-string">"=\""</span> + attrValue + <span class="hljs-string">"\""</span>)<span class="hljs-comment">;</span> } }</code></pre> <p>只需修改其中的for循环部分。使用了<strong>每个特性节点都有的一个属性:<code>specified</code>,这个属性的值为true时,表示要么在HTML代码中指定了相应的特性,要么是在脚本中使用<code>setAttribute()</code>方法设置了该特性</strong>。<strong>在IE中,所有未设置过的特性的该属性值都为false,而在其他浏览器中根本不会为这类特性生成对应的特性节点(因此,在这些浏览器中,任何特性节点的<code>specified</code>值始终为true)</strong>。</p> <p><strong><em>创建元素</em></strong> <br> 使用<code>document.createElement()</code>可以创建新元素,这个方法只接收一个参数,即要创建元素的标签名。这个标签名<strong>在HTML文档中不区分大小写,在XML(包括XHTML)文档中区分大小写</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs coffeescript"><span class="hljs-reserved">var</span> div = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"div"</span>);</code></pre> <p>在使用<code>document.createElement()</code>方法创建新元素的同时,也为新元素设置了<code>ownerDocument</code>属性。此时,还可以操作元素的特性,为其添加更多的节点。示例:</p> <pre class="prettyprint"><code class=" hljs applescript"><span class="hljs-keyword">div</span>.<span class="hljs-property">id</span> = <span class="hljs-string">"myNewId"</span>; <span class="hljs-keyword">div</span>.className = <span class="hljs-string">"box"</span>;</code></pre> <p>在新元素上设置了这些特性只是赋予了它们相应的信息,由于新元素尚未被添加到文档树中,因此设置这些特性也不会影响浏览器的显示。要把新元素添加到文档中,需要使用<code>appendChild()</code>、<code>insertBefore()</code>或者<code>replaceChild()</code>方法。示例:</p> <pre class="prettyprint"><code class=" hljs avrasm">var div = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"div"</span>)<span class="hljs-comment">;</span> div<span class="hljs-preprocessor">.id</span> = <span class="hljs-string">"myNewId"</span><span class="hljs-comment">;</span> div<span class="hljs-preprocessor">.className</span> = <span class="hljs-string">"box"</span><span class="hljs-comment">;</span> document<span class="hljs-preprocessor">.body</span><span class="hljs-preprocessor">.appendChild</span>(div)<span class="hljs-comment">;</span></code></pre> <p>一旦将元素添加到文档树中,那么该元素就会在浏览器中立即呈现出来,此后,对该元素的任何修改,都会呈现在浏览器中。 <br> 在IE中可以使用另一种方式使用用<code>document.createElement()</code>方法,<strong>即为这个方法传入完整的HTML标签,也可以包含属性</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml">var div = document.createElement("<span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">\"myNewId\"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">\"box\"</span>></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span>");</code></pre> <p>使用这种方式有助于避开在IE7及更早版本中动态创建元素的某些问题(具体的问题在书中已经详细的列举出来了)。<strong>其他浏览器都不支持这种用法(传入完整的HTML标签创建DOM元素)</strong>。 <br> <code>document.createElement()</code>方法会返回一个DOM元素的引用。可以将这个引用添加到DOM文档中,也可以对其加以增强。 <br> <strong><em>元素的子节点</em></strong> <br> 这里的问题就是在前面曾经出现过的问题,在 <em>10.1.1 Node类型</em>一章中的“其他方法”这一部分中有过详细的解释。下面解决如何通过某个特定的标签名获取其子节点或者后代节点。解决方法很简单,因为<strong>元素也支持<code>getElementsByTagName()</code>方法</strong>,在通过元素调用方法时,除了搜索起点是当前这个元素之外,其他方面都跟<code>document</code>调用这个方法是相同的,因此结果只会返回当前元素的后代。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">ul</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myList"</span>></span> <span class="hljs-tag"><<span class="hljs-title">li</span>></span>item1<span class="hljs-tag"></<span class="hljs-title">li</span>></span> <span class="hljs-tag"><<span class="hljs-title">li</span>></span>item2<span class="hljs-tag"></<span class="hljs-title">li</span>></span> <span class="hljs-tag"><<span class="hljs-title">li</span>></span>item3<span class="hljs-tag"></<span class="hljs-title">li</span>></span> <span class="hljs-tag"></<span class="hljs-title">ul</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> myList = document.getElementById(<span class="hljs-string">"myList"</span>); <span class="hljs-keyword">var</span> items = myList.getElementsByTagName(<span class="hljs-string">"li"</span>); alert(items.length); <span class="hljs-comment">//3</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>值得注意的是:这里的<code><ul></code>元素的后代中只包含了直接子元素。不过,如果它包含更多层次的后代元素,那么各个层次中包含的<code><li></code>元素也会返回。</p> <h4 id="1014-text类型">10.1.4 Text类型</h4> <p>文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容,<strong>纯文本中可以包含转义后的HTML字符,但是不能包含HTML代码</strong>。Text节点具有以下几个特征:</p> <ul> <li><code>nodeType</code>的值为3</li> <li><code>nodeName</code>的值为”#text”</li> <li><code>nodeValue</code>的值为节点包含的文本</li> <li><code>parentNode</code>是一个Element</li> <li>不支持(没有)子节点</li> </ul> <p><strong>可以使用<code>nodeValue</code>属性或者<code>data</code>属性访问Text节点的内容,两个属性中包含的内容相同</strong>,都是Text节点中包含的文本。<strong>对其中一个属性的修改会反映到另一个属性上</strong>。使用下列方法可以操纵节点中的文本:</p> <ul> <li><code>appendData(text)</code>:将text文本添加到节点的末尾</li> <li><code>deleteData(offset,count)</code>:从offset开始的位置删除count个字符</li> <li><code>insertData(offset,count)</code>:在offset指定的位置插入text</li> <li><code>replaceData(offset,count,text)</code>:用text替换从offset指定的位置开始到offset+count为止处的文本</li> <li><code>splitText(offset)</code>:从offset指定的位置将当前文本节点分成两个文本节点</li> <li><code>substringData(offset,count)</code>:提取从offset指定的位置开始到offset+count为止处的字符串 <br> 除了这些方法之外,<strong>文本节点还有一个<code>length</code>属性,保存着节点中字符的数目</strong>。而且,<code>nodeValue.length</code>和<code>data.length</code>中也保存着同样的值。<strong>在默认情况下,每个可以包含内容的元素最多只能有一个文本节点,而且必须有内容存在</strong>。示例:</li> </ul> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-comment"><!--没有内容,也就没有文本节点--></span> <span class="hljs-tag"><<span class="hljs-title">div</span>></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-comment"><!--有空格,因此有一个文本节点--></span> <span class="hljs-tag"><<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-comment"><!--有内容,因此有一个文本节点--></span> <span class="hljs-tag"><<span class="hljs-title">div</span>></span>Hello world!<span class="hljs-tag"></<span class="hljs-title">div</span>></span></code></pre> <p>访问上面的文本子节点:</p> <pre class="prettyprint"><code class=" hljs delphi"><span class="hljs-keyword">var</span> textNode = <span class="hljs-keyword">div</span>.firstChild; <span class="hljs-comment">//或者</span> <span class="hljs-keyword">div</span>.childNodes[<span class="hljs-number">0</span>];</code></pre> <p>修改文本节点中的文本(首先必须获取文本节点的引用,像上面一样):</p> <pre class="prettyprint"><code class=" hljs avrasm">div<span class="hljs-preprocessor">.firstChild</span><span class="hljs-preprocessor">.nodeValue</span> = <span class="hljs-string">"Some other message"</span><span class="hljs-comment">;</span></code></pre> <p>在修改文本节点时需要注意,此时的字符串需要经过HTML(或者XML,取决于文档类型)编码,示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span>Hello world!<span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> myDiv = document.getElementById(<span class="hljs-string">"myDiv"</span>); <span class="hljs-comment">//修改的部分内容的源代码是:</span> <span class="hljs-comment">//<div id="myDiv">Some <strong>other</strong> message</div></span> myDiv.firstChild.nodeValue = <span class="hljs-string">"Some <strong>other</strong> message"</span>; </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>Firefox中,选中该<code><div></code>元素后,右键“查看选中部分源代码”</strong>,即可看到上面注释中的代码。 <br> <em>整个页面的源代码仍然是上面的部分</em></p> <p><strong><em>创建文本节点</em></strong> <br> 使用<code>document.createTextNode()</code>创建一个新的文本节点,这个方法接收一个参数,就是要要插入文本节点中的文本。与上面修改已有文本节点的文本值一样,作为参数的文本也将按照HTML或XML的格式进行编码。示例:</p> <pre class="prettyprint"><code class=" hljs coffeescript"><span class="hljs-reserved">var</span> textNode = <span class="hljs-built_in">document</span>.createTextNode(<span class="hljs-string">"Some <strong>other</strong> message"</span>);</code></pre> <p>在创建出新的文本节点时,也会为其自动设置<code>ownerDocument</code>属性。不过,除非把新节点添加到文档树已经存在的节点中,否则不会在浏览器窗口中看到这个添加的新文本节点。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-comment"><!-- 查看选中部分源代码 <div class="message">Hello world!</div> --></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> element = document.createElement(<span class="hljs-string">"div"</span>); element.className = <span class="hljs-string">"message"</span>; <span class="hljs-keyword">var</span> textNode = document.createTextNode(<span class="hljs-string">"Hello world!"</span>); element.appendChild(textNode); document.body.appendChild(element); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>创建了一个<code><div></code>元素并为其添加了一个文本节点,然后将创建的<code><div></code>元素添加到<code>body</code>中。 <br> 一般情况下,每个元素只能有一个文本节点,但是在某些情况下也会有多个文本节点。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> element = document.createElement(<span class="hljs-string">"div"</span>); element.className = <span class="hljs-string">"message"</span>; <span class="hljs-keyword">var</span> textNode = document.createTextNode(<span class="hljs-string">"Hello world!"</span>); element.appendChild(textNode); <span class="hljs-comment">//再添加一个文本节点</span> <span class="hljs-keyword">var</span> antherTextNode = document.createTextNode(<span class="hljs-string">"Yippee!"</span>); element.appendChild(antherTextNode); document.body.appendChild(element); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>如果两个文本节点是同胞(兄弟)节点,那么这两个节点中的文本就会连接起来,中间不会有空格</strong>。</p> <p><strong><em>规范化文本节点</em></strong> <br> DOM文档中存在相邻的同胞文本节点很容易导致混乱,因为分不清哪个文本节点表示哪个字符串。由于DOM文档中出现同胞文本节点的情况不在少数,因此催生了一个能够将相邻的文本节点合并的方法——<code>normalize()</code>,这个方法是由Node类型定义的(因而在所有的节点类型中都存在)。<strong>在一个包含两个或者两个以上文本节点的父元素上调用<code>normalize()</code>方法,则会将所有的文本节点合并为一个文本节点,合并后的节点的<code>nodeValue</code>值为合并前所有文本节点的<code>nodeValue</code>值的拼接字符串</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs avrasm"><script type=<span class="hljs-string">"text/javascript"</span>> var element = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"div"</span>)<span class="hljs-comment">;</span> element<span class="hljs-preprocessor">.className</span> = <span class="hljs-string">"message"</span><span class="hljs-comment">;</span> var textNode = document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"Hello world!"</span>)<span class="hljs-comment">;</span> element<span class="hljs-preprocessor">.appendChild</span>(textNode)<span class="hljs-comment">;</span> //再添加一个文本节点 var antherTextNode = document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"Yippee!"</span>)<span class="hljs-comment">;</span> element<span class="hljs-preprocessor">.appendChild</span>(antherTextNode)<span class="hljs-comment">;</span> alert(element<span class="hljs-preprocessor">.childNodes</span><span class="hljs-preprocessor">.length</span>)<span class="hljs-comment">; //2</span> element<span class="hljs-preprocessor">.normalize</span>()<span class="hljs-comment">; //调用合并方法</span> alert(element<span class="hljs-preprocessor">.childNodes</span><span class="hljs-preprocessor">.length</span>)<span class="hljs-comment">; //1</span> alert(element<span class="hljs-preprocessor">.firstChild</span><span class="hljs-preprocessor">.nodeValue</span>)<span class="hljs-comment">; //"Hello world!Yippee!"</span> </script></code></pre> <p><strong>浏览器解析文档时永远不会创建相邻的文本节点</strong>。 <br> (在某些情况下,在IE6中使用<code>normalize()</code>方法会导致浏览器崩溃)</p> <p><strong><em>分割文本节点</em></strong> <br> 与上述能够合并文本节点的<code>normalize()</code>方法相对的,Text类型有一个<strong>分割文本节点的方法——<code>splitText()</code></strong>,这个方法传入一个分割位置,即按照指定的位置分割<code>nodeValue</code>值。原来的文本节点包含从开始到指定位置之前的内容,返回的新文本节点包含剩下的值。示例:</p> <pre class="prettyprint"><code class=" hljs avrasm"><script type=<span class="hljs-string">"text/javascript"</span>> var element = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"div"</span>)<span class="hljs-comment">;</span> element<span class="hljs-preprocessor">.className</span> = <span class="hljs-string">"message"</span><span class="hljs-comment">;</span> var textNode = document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"Hello world!"</span>)<span class="hljs-comment">;</span> element<span class="hljs-preprocessor">.appendChild</span>(textNode)<span class="hljs-comment">;</span> document<span class="hljs-preprocessor">.body</span><span class="hljs-preprocessor">.appendChild</span>(element)<span class="hljs-comment">;</span> var newNode = element<span class="hljs-preprocessor">.firstChild</span><span class="hljs-preprocessor">.splitText</span>(<span class="hljs-number">5</span>)<span class="hljs-comment">;</span> alert(element<span class="hljs-preprocessor">.firstChild</span><span class="hljs-preprocessor">.nodeValue</span>)<span class="hljs-comment">; //"Hello"</span> alert(newNode<span class="hljs-preprocessor">.nodeValue</span>)<span class="hljs-comment">; //" world!"</span> alert(textNode<span class="hljs-preprocessor">.data</span>)<span class="hljs-comment">; //"Hello"</span> alert(element<span class="hljs-preprocessor">.childNodes</span><span class="hljs-preprocessor">.length</span>)<span class="hljs-comment">; //2</span> </script></code></pre> <p><strong>分割文本节点是从文本节点中提取数据的一种常用DOM解析技术</strong>。</p> <h4 id="1015-comment类型">10.1.5 Comment类型</h4> <p>注释在DOM中是通过Comment类型来表示的。Comment节点有以下特征:</p> <ul> <li><code>nodeType</code>的值为8</li> <li><code>nodeName</code>的值为“#comment”</li> <li><code>nodeValue</code>的值是注释内容</li> <li><code>parentNode</code>可能是Document和Element</li> <li>不支持(没有)子节点</li> </ul> <p><strong>Comment类型和Text类型继承自相同的基类,因此它拥有除<code>splitText()</code>方法之外的所有字符串操作方法。与Text类型类似,也可以通过<code>nodeValue</code>和<code>data</code>属性来取得注释的内容</strong>。注释节点可以通过其父节点来访问。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span><span class="hljs-comment"><!--A Comment--></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> div = document.getElementById(<span class="hljs-string">"myDiv"</span>); <span class="hljs-keyword">var</span> comment = div.firstChild; alert(comment.data); <span class="hljs-comment">//"A Comment"</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>还可以使用<strong><code>document.createComment()</code></strong>方法创建一个注释节点,方法参数为注释文本。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> comment = document.createComment(<span class="hljs-string">"A Comment"</span>); <span class="hljs-keyword">var</span> div = document.getElementById(<span class="hljs-string">"myDiv"</span>); div.appendChild(comment); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>开发人员很少会创建和访问注释节点,因为注释节点对算法鲜有影响。此外,浏览器也不会识别位于<code></html></code>标签后面的注释。<strong>如果要访问注释节点,一定要保证该注释节点是<code><html></code>元素的后代</strong>。</p> <h4 id="1016-cdatasection类型">10.1.6 CDATASection类型</h4> <p>CDATASection类型只针对基于XML的文档,表示的是CDATA区域。与Comment类似,<strong>CDATASection类型继承自Text类型</strong>,因此具有除<code>splitText()</code>方法之外的所有字符串操作方法。CDATASection节点具有以下特征:</p> <ul> <li><code>nodeType</code>的值为4</li> <li><code>nodeName</code>的值为“#cdata-section”</li> <li><code>nodeValue</code>的值是CDATA区域中的内容</li> <li><code>parentNode</code>可能是Document和Element</li> <li>不支持(没有)子节点</li> </ul> <p>CDATA区域只会出现在XML文档中,因此多数浏览器都会把CDATA区域错误的解释为Comment或Element。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myDiv"</span>></span><span class="hljs-cdata"><![CDATA[This is some content.]]></span><span class="hljs-tag"></<span class="hljs-title">div</span>></span></code></pre> <p>这个例子中的<code><div></code>元素中应该包含一个CDATAsection节点,但四大主流浏览器无一能够正确的解析它,即使对于有效的XHTML页面,浏览器也没能正确的支持嵌入的CDATA区域。<strong>在真正的XML文档中,可以使用<code>document.createCDataSection()</code>方法来创建CDATA区域,只需向方法中传入节点的内容即可</strong>。</p> <h4 id="1017-documenttype类型">10.1.7 DocumentType类型</h4> <p>DocumentType类型在web浏览器中并不常用,仅有Firefox、Safari和Opera支持它(Chrome4.0也支持了)。DocumentType包含着与文档doctype有关的所有信息,它具有以下特征:</p> <ul> <li><code>nodeType</code>的值为10</li> <li><code>nodeName</code>的值为doctype的名称</li> <li><code>nodeValue</code>的值为null</li> <li><code>parentNode</code>是Document</li> <li>不支持(没有)子节点</li> </ul> <p><strong>在DOM1级中,DocumentType对象不能动态创建,而只能通过解析文档代码的方式来创建</strong>。支持它的浏览器会将DocumentType对象保存在<code>document.doctype</code>中。DOM1级描述了DocumentType对象的三个属性:name、entities和notactions。其中,name表示文档类型的名称;entities是由文档类型描述的实体的NamedNodeMap对象;notations是由文档类型描述的符号的NamedNodeMap对象。<strong>通常,浏览器中的文档实用的都是HTML或者XHTML文档类型,因此entities和notations都是空列表(列表中的项来自行内文档类型声明)</strong>。但不管怎样,只有name属性是有用的。这个属性保存的是文档类型的名称,也就是<strong>出现在<code><!DOCTYPE</code>之后的文本</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-doctype"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"></span> <span class="hljs-tag"><<span class="hljs-title">html</span>></span> <span class="hljs-tag"><<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>Title<span class="hljs-tag"></<span class="hljs-title">title</span>></span> <span class="hljs-tag"></<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> alert(document.doctype.name); <span class="hljs-comment">//"html"</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"></<span class="hljs-title">html</span>></span></code></pre> <p>示例中创建了一个严格型HTML4.01文档类型声明,DocumentType中name属性的值就是“HTML”,<strong>但是输出却是小写的“html”(没有找到具体的原因,但是只有H5的<code><!DOCTYPE</code>之后是“html”)</strong>。 <br> (IE的早期版本不支持DocumentType,因此<code>document.doctype</code>的值始终都是null。可是,这些浏览器会将文档类型声明错误的解释为注释,并且为其创建一个注释节点。IE9会为<code>document.doctype</code>赋正确的对象,但任然不支持访问DocumentType类型。)</p> <h4 id="1018-documentfragment类型">10.1.8 DocumentFragment类型</h4> <p>在所有的节点类型当中,只有DocumentFragment在文档中没有对应的标记。DOM规定文档片段(document fragment)是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源。DocumentFragment节点具有下列特征:</p> <ul> <li><code>nodeType</code>的值为11</li> <li><code>nodeName</code>的值为”#document-fragment”</li> <li><code>nodeValue</code>的值为null</li> <li><code>parentNode</code>是null</li> <li>子节点可以是Element、ProcessingInstruction、Comment、Text、CDATASection或EntityReference。</li> </ul> <p>虽然不能直接将文档片段直接添加到文档中,但可以将它作为一个“仓库”来使用,即可以在里面保存将来可能会添加到文档中的节点。创建示例:</p> <pre class="prettyprint"><code class=" hljs coffeescript"><span class="hljs-reserved">var</span> fragment = <span class="hljs-built_in">document</span>.createDocumentFragment();</code></pre> <p>文档片段继承了所有Node的所有方法,通常用于执行那些针对文档的DOM操作。<strong>如果将文档中节点添加到文档片段中,被添加的节点将会在文档树中移除,在浏览器中也不会再看到该节点。添加到文档片段中的节点同样也不属于文档树</strong>。可以通过<code>appendChild()</code>和<code>insertBefore()</code>将文档片段中的内容添加到文档树中。使用这两个方法时,参数是DocumentFragment类型,但是其实现原理是<strong>将文档片段中所有子节点添加到相应位置上;文档片段本身永远不会成为文档树的一部分</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">ui</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"myList"</span>></span><span class="hljs-tag"></<span class="hljs-title">ui</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> fragment = document.createDocumentFragment(); <span class="hljs-keyword">var</span> ul = document.getElementById(<span class="hljs-string">"myList"</span>); <span class="hljs-keyword">var</span> li = <span class="hljs-literal">null</span>; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">3</span>; i++) { li = document.createElement(<span class="hljs-string">"li"</span>); li.appendChild(document.createTextNode(<span class="hljs-string">"Item:"</span> + (i + <span class="hljs-number">1</span>))); fragment.appendChild(li); } alert(fragment.childNodes.length); <span class="hljs-comment">//3</span> ul.appendChild(fragment); alert(fragment.childNodes.length); <span class="hljs-comment">//0</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>简单的逻辑不需要特别说明,但是有一点:<strong>将文档片段中所有子节点添加到相应位置上(同时原本属于文档片段的所有子节点都会在被添加到文档树中后从文档片段中删除),文档片段本身永远不会成为文档树的一部分</strong>。这也是代码中两次弹窗的结果不一样的原因。</p> <h4 id="1019-attr类型">10.1.9 Attr类型</h4> <p>元素的特性在DOM中以Attr类型来表示。<strong>从技术角度讲,特性就是存在于元素的<code>attributes</code>属性中的节点</strong>。特性节点具有以下特征:</p> <ul> <li><code>nodeType</code>的值为11</li> <li><code>nodeName</code>的值是特性的名称</li> <li><code>nodeValue</code>的值是特性的值</li> <li><code>parentNode</code>的值为null</li> <li>在HTML中不支持(没有)子节点</li> <li>在XML中子节点可以是Text或EntityReference</li> </ul> <p><strong>尽管特性节点也是节点,但是却不被认为是DOM文档树的一部分</strong>。 <br> Attr对象有三个属性:name、value和specified。name是特性名称(与<code>nodeName</code>的值相同),value是特性的值(与<code>nodeValue</code>的值相同),而spe cified是一个布尔值,用以区别特性是在代码中指定的还是默认的。为某个元素添加一个特性,示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"element"</span>></span>MyDiv<span class="hljs-tag"></<span class="hljs-title">div</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> element = document.getElementById(<span class="hljs-string">"element"</span>); <span class="hljs-keyword">var</span> attr = document.createAttribute(<span class="hljs-string">"align"</span>); attr.value = <span class="hljs-string">"left"</span>; element.setAttributeNode(attr); <span class="hljs-comment">//将新创建的特性添加到元素中</span> alert(element.attributes.getNamedItem(<span class="hljs-string">"align"</span>).value); <span class="hljs-comment">//letf</span> alert(element.getAttributeNode(<span class="hljs-string">"align"</span>).value); <span class="hljs-comment">//left</span> alert(element.getAttribute(<span class="hljs-string">"align"</span>)); <span class="hljs-comment">//left</span> </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>不建议使用特性节点访问和设置特性,使用<code>getAttribute()</code>、<code>setAttribute()</code>和<code>removeAttribute()</code>更加简便。</p> <h3 id="102-dom操作技术">10.2 DOM操作技术</h3> <h4 id="1021-动态脚本">10.2.1 动态脚本</h4> <p>动态脚本:<strong>动态脚本是指在页面加载时不存在,但将来的某一时刻通过修改DOM动态的添加脚本</strong>。跟操作HTML元素一样,创建动态脚本也有两种方式:插入外部文件和直接插入JavaScript代码。动态加载的脚本可以立即执行。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">"client.js"</span>></span><span class="javascript"></span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>使用一个函数动态加载某个外部js文件:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loadScript</span><span class="hljs-params">(url)</span> {</span> <span class="hljs-keyword">var</span> script = document.createElement(<span class="hljs-string">"script"</span>); script.type = <span class="hljs-string">"text/javascript"</span>; script.url = url; document.body.appendChild(script); } <span class="hljs-comment">//调用上述方法动态加载一个外部的js文件</span> loadScript(<span class="hljs-string">"client.js"</span>); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><em>加载完成后,就可以在页面中其他地方使用这个脚本了,问题只有一个,怎么知道脚本加载完成呢?遗憾的是,并没有什么标准方式来探知这一点。不过,与此相关的一些事件可以派上用场,但要取决于使用的浏览器</em>。 <br> 另一种指定JavaScript代码的方式是行内方式(直接插入行内)。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sayHi</span><span class="hljs-params">()</span> {</span> alert(<span class="hljs-string">"Hi!"</span>); } </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>理论上讲,下面的代码是有效的:</p> <pre class="prettyprint"><code class=" hljs avrasm">var script = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"script"</span>)<span class="hljs-comment">;</span> script<span class="hljs-preprocessor">.type</span> = <span class="hljs-string">"text/javascript"</span><span class="hljs-comment">;</span> script<span class="hljs-preprocessor">.appendChild</span>(document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"function sayHi() {alert('Hi!');}"</span>))<span class="hljs-comment">;</span> document<span class="hljs-preprocessor">.body</span><span class="hljs-preprocessor">.appendChild</span>(script)<span class="hljs-comment">;</span></code></pre> <p>上述代码可以在Chrome、Firefox、Safari、Opera中正确运行,但是在IE中却不可以,因为<strong>IE中将<code><script></code>元素视为特殊的元素,不允许DOM访问子节点,可以使用<code><script></code>元素的<code>text</code>属性来指定元素中包含的JavaScript代码</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs avrasm">var script = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"script"</span>)<span class="hljs-comment">;</span> script<span class="hljs-preprocessor">.type</span> = <span class="hljs-string">"text/javascript"</span><span class="hljs-comment">;</span> //使用<script>元素的text属性 script<span class="hljs-preprocessor">.text</span> = <span class="hljs-string">"function sayHi() {alert('Hi!');}"</span><span class="hljs-comment">;</span> document<span class="hljs-preprocessor">.body</span><span class="hljs-preprocessor">.appendChild</span>(script)<span class="hljs-comment">;</span></code></pre> <p>为了兼容早期版本的Safari(主要是Safari3.0以前),可以使用下列代码:</p> <pre class="prettyprint"><code class=" hljs applescript"><<span class="hljs-keyword">script</span> type=<span class="hljs-string">"text/javascript"</span>> var <span class="hljs-keyword">script</span> = document.createElement(<span class="hljs-string">"script"</span>); <span class="hljs-keyword">script</span>.type = <span class="hljs-string">"text/javascript"</span>; var code = <span class="hljs-string">"function sayHi() {alert('Hi!');}"</span>; <span class="hljs-keyword">try</span> { <span class="hljs-keyword">script</span>.appendChild(document.createTextNode(code)); } catch (ex) { <span class="hljs-keyword">script</span>.<span class="hljs-type">text</span> = code; } document.body.appendChild(<span class="hljs-keyword">script</span>); </<span class="hljs-keyword">script</span>></code></pre> <p>分析过程:首先尝试标准的DOM文本节点方法,因为除了IE之外(在IE中会导致错误),所有的浏览器都支持这种方式。如果这行代码抛出错误,那么说明浏览器是IE,可以使用<code>text</code>属性。整个过程可以表示为下列函数:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loadScriptString</span><span class="hljs-params">(code)</span> {</span> <span class="hljs-keyword">var</span> script = document.createElement(<span class="hljs-string">"script"</span>); script.type = <span class="hljs-string">"text/javascript"</span>; <span class="hljs-keyword">try</span> { script.appendChild(document.createTextNode(code)); } <span class="hljs-keyword">catch</span> (ex) { script.text = code; } document.body.appendChild(script); } <span class="hljs-comment">//调用示例</span> loadScriptString(<span class="hljs-string">"function sayHi() {alert('Hi!');}"</span>); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>实际上,这种方法与在全局作用域中把相同的字符串传递给<code>eval()</code>中是一样的。</p> <h4 id="1022-动态样式">10.2.2 动态样式</h4> <p>能够把CSS样式包含到HTML页面中的元素有两个。其中,<code><link></code>元素用于包含来自外部的文件,而<code><style></code>元素用于指定嵌入的样式。与动态脚本类似,所谓<strong>动态样式就是指在页面刚加载时不存在的样式;动态样式是在页面加载完成后动态添加到页面中的</strong>。 <br> 示例:典型的<code><link></code>元素:</p> <pre class="prettyprint"><code class=" hljs rust"><link rel=<span class="hljs-string">"stylesheet"</span> href=<span class="hljs-string">"styles.css"</span> <span class="hljs-keyword">type</span>=<span class="hljs-string">"text/css"</span>></code></pre> <p>使用DOM代码可以很容易的创建出上面的这个元素:</p> <pre class="prettyprint"><code class=" hljs lasso"><span class="hljs-subst"><</span>script <span class="hljs-keyword">type</span><span class="hljs-subst">=</span><span class="hljs-string">"text/javascript"</span><span class="hljs-subst">></span> <span class="hljs-built_in">var</span> <span class="hljs-keyword">link</span> <span class="hljs-subst">=</span> document<span class="hljs-built_in">.</span>createElement(<span class="hljs-string">"link"</span>); <span class="hljs-keyword">link</span><span class="hljs-built_in">.</span>rel <span class="hljs-subst">=</span> <span class="hljs-string">"stylesheet"</span>; <span class="hljs-keyword">link</span><span class="hljs-built_in">.</span><span class="hljs-keyword">type</span> <span class="hljs-subst">=</span><span class="hljs-string">"text/css"</span>; <span class="hljs-keyword">link</span><span class="hljs-built_in">.</span>href <span class="hljs-subst">=</span> <span class="hljs-string">"style.css"</span>; <span class="hljs-built_in">var</span> head <span class="hljs-subst">=</span> document<span class="hljs-built_in">.</span>getElementsByTagNameNS(<span class="hljs-string">"head"</span>)<span class="hljs-preprocessor">[</span><span class="hljs-number">0</span><span class="hljs-preprocessor">]</span><span class="hljs-markup">; head.appendChild(link); </script></span></code></pre> <p>注意:<strong>必须将<code><link></code>元素添加到<code><head></code>而不是<code><body></code>中</strong>。 <br> 上面的整个过程可以使用一个函数来表示:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loadStyles</span><span class="hljs-params">(url)</span> {</span> <span class="hljs-keyword">var</span> link = document.createElement(<span class="hljs-string">"link"</span>); link.rel = <span class="hljs-string">"stylesheet"</span>; link.type =<span class="hljs-string">"text/css"</span>; link.href = url; <span class="hljs-keyword">var</span> head = document.getElementsByTagNameNS(<span class="hljs-string">"head"</span>)[<span class="hljs-number">0</span>]; head.appendChild(link); } <span class="hljs-comment">//调用上面的方法</span> loadStyles(<span class="hljs-string">"style.css"</span>); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p><strong>加载外部样式文件的过程是异步的,也就是加载样式和执行JavaScript代码的过程没有固定的次序</strong>。在第13章中可以学到利用事件来检测外部样式文件是否加载完成。</p> <p>另一种定义样式的方式是嵌入式CSS:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">style</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/css"</span>></span><span class="css"> <span class="hljs-tag">body</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">background-color</span>:<span class="hljs-value"> red</span></span>; <span class="hljs-rule">}</span></span> </span><span class="hljs-tag"></<span class="hljs-title">style</span>></span></code></pre> <p>和上面的引入外部样式一样,下列代码应该是有效的:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> style = document.createElement(<span class="hljs-string">"style"</span>); style.type = <span class="hljs-string">"text/css"</span>; style.appendChild(document.createTextNode(<span class="hljs-string">"body{background-color: red;}"</span>)); <span class="hljs-keyword">var</span> head = document.getElementsByTagName(<span class="hljs-string">"head"</span>)[<span class="hljs-number">0</span>]; head.appendChild(style); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>在五大主流浏览器中,只有IE会在执行上述代码时报错,<strong>IE将<code><style></code>视为一个特殊的、和<code><script></code>类似的节点,不允许访问其子节点,解决办法就是在IE中该节点有一个<code>styleSheet</code>属性(貌似已经废弃),该属性又有一个<code>cssText</code>属性可以接受CSS代码</strong>。示例:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> style = document.createElement(<span class="hljs-string">"style"</span>); style.type = <span class="hljs-string">"text/css"</span>; <span class="hljs-keyword">try</span> { style.appendChild(document.createTextNode(<span class="hljs-string">"body{background-color: red;}"</span>)); } <span class="hljs-keyword">catch</span> (ex) { <span class="hljs-comment">//貌似styleSheet已经废弃</span> <span class="hljs-comment">//style.styleSheet.cssText = "body{background-color: red;}";</span> style.cssText = <span class="hljs-string">"body{background-color: red;}"</span>; <span class="hljs-comment">//正确执行</span> } <span class="hljs-keyword">var</span> head = document.getElementsByTagName(<span class="hljs-string">"head"</span>)[<span class="hljs-number">0</span>]; head.appendChild(style); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>一个通用的解决方案如下:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loadStyleString</span><span class="hljs-params">(css)</span> {</span> <span class="hljs-keyword">var</span> style = document.createElement(<span class="hljs-string">"style"</span>); style.type = <span class="hljs-string">"text/css"</span>; <span class="hljs-keyword">try</span> { style.appendChild(document.createTextNode(css)); } <span class="hljs-keyword">catch</span> (ex) { style.cssText = css; } <span class="hljs-keyword">var</span> head = document.getElementsByTagName(<span class="hljs-string">"head"</span>)[<span class="hljs-number">0</span>]; head.appendChild(style); } <span class="hljs-comment">//调用上面的方法</span> loadStyleString(<span class="hljs-string">"body {background-color: red;}"</span>); </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>补充:在IE中重用同一个<code><style></code>元素并再次设置<code>styleSheet.cssText</code>属性时,会导致浏览器崩溃。</p> <h4 id="1023-操作表格">10.2.3 操作表格</h4> <p>为了构建表格,HTML DOM为<code><table></code>、<code><tbody></code>、<code><tr></code>元素添加了一些属性和方法。</p> <p>以下是为元素添加的属性和方法:</p> <ul> <li>caption:保存了对<code><caption></code>元素(如果有)的指针</li> <li>tBodies:是一个<code><tBody></code>元素的HTMLCollection</li> <li>tFoot:保存着对<code><tfoot></code>元素的指针</li> <li>tHead:保存着对<code><thead></code>元素的指针</li> <li>rows:是一个表格中所有行的HTMLCollection</li> <li>createTHead():创建<code><thead></code>元素,将其放入表格中,返回引用</li> <li>createTFoot():创建<code><tfoot></code>元素,将其放入表格中,返回引用</li> <li>createCaption():创建<code><caption></code>元素,将其放入表格中,返回引用</li> <li>deleteTHead():删除<code><thead></code>元素</li> <li>deleteTFoot():删除<code><tfoot></code>元素</li> <li>deleteCaption():删除<code><caption></code>元素</li> <li>deleteRow(<em>pos</em>):删除指定位置的行</li> <li>insertRow(<em>pos</em>):向rows集合中的指定位置插入一行</li> </ul> <p>以下是为<code><tbody></code>元素添加的属性和方法:</p> <ul> <li>rows:保存着<code><tbody></code>元素中行的HTMLCollection</li> <li>deleteRow(pos):删除指定位置的行</li> <li>insertRow(pos):向rows集合中的指定位置插入一行,返回对新插入行的引用</li> </ul> <p>为<code><tr></code>元素添加的属性和方法:</p> <ul> <li>cells:保存着<code><tr></code>元素中单元格的HTMLCollection</li> <li>deleteCell(pos):删除指定位置的单元格</li> <li>insertCell(pos):向cells集合中指定的位置插入一个单元格,返回对新插入单元格的引用</li> </ul> <p>使用上述API,可以简化DOM中对表格的操作,例如,现在有一个表格如下:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">table</span> <span class="hljs-attribute">border</span>=<span class="hljs-value">"1"</span> <span class="hljs-attribute">width</span>=<span class="hljs-value">"100%"</span>></span> <span class="hljs-tag"><<span class="hljs-title">tbody</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span>></span> <span class="hljs-tag"><<span class="hljs-title">td</span>></span>1<span class="hljs-tag"></<span class="hljs-title">td</span>></span> <span class="hljs-tag"><<span class="hljs-title">td</span>></span>2<span class="hljs-tag"></<span class="hljs-title">td</span>></span> <span class="hljs-tag"></<span class="hljs-title">tr</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span>></span> <span class="hljs-tag"><<span class="hljs-title">td</span>></span>3<span class="hljs-tag"></<span class="hljs-title">td</span>></span> <span class="hljs-tag"><<span class="hljs-title">td</span>></span>4<span class="hljs-tag"></<span class="hljs-title">td</span>></span> <span class="hljs-tag"></<span class="hljs-title">tr</span>></span> <span class="hljs-tag"></<span class="hljs-title">tbody</span>></span> <span class="hljs-tag"></<span class="hljs-title">table</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span></code></pre> <p>使用上述API插入这个表格:</p> <pre class="prettyprint"><code class=" hljs avrasm"><script type=<span class="hljs-string">"text/javascript"</span>> //创建table var table = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"table"</span>)<span class="hljs-comment">;</span> table<span class="hljs-preprocessor">.border</span> = <span class="hljs-string">"1"</span><span class="hljs-comment">;</span> table<span class="hljs-preprocessor">.width</span> = <span class="hljs-string">"100%"</span><span class="hljs-comment">;</span> //创建tbody var tbody = document<span class="hljs-preprocessor">.createElement</span>(<span class="hljs-string">"tbody"</span>)<span class="hljs-comment">;</span> table<span class="hljs-preprocessor">.appendChild</span>(tbody)<span class="hljs-comment">;</span> //创建第一行 tbody<span class="hljs-preprocessor">.insertRow</span>(<span class="hljs-number">0</span>)<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">0</span>]<span class="hljs-preprocessor">.insertCell</span>(<span class="hljs-number">0</span>)<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">0</span>]<span class="hljs-preprocessor">.cells</span>[<span class="hljs-number">0</span>]<span class="hljs-preprocessor">.appendChild</span>(document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"1"</span>))<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">0</span>]<span class="hljs-preprocessor">.insertCell</span>(<span class="hljs-number">1</span>)<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">0</span>]<span class="hljs-preprocessor">.cells</span>[<span class="hljs-number">1</span>]<span class="hljs-preprocessor">.appendChild</span>(document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"2"</span>))<span class="hljs-comment">;</span> //创建第二行 tbody<span class="hljs-preprocessor">.insertRow</span>(<span class="hljs-number">1</span>)<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">1</span>]<span class="hljs-preprocessor">.insertCell</span>(<span class="hljs-number">0</span>)<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">1</span>]<span class="hljs-preprocessor">.cells</span>[<span class="hljs-number">0</span>]<span class="hljs-preprocessor">.appendChild</span>(document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"3"</span>))<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">1</span>]<span class="hljs-preprocessor">.insertCell</span>(<span class="hljs-number">1</span>)<span class="hljs-comment">;</span> tbody<span class="hljs-preprocessor">.rows</span>[<span class="hljs-number">1</span>]<span class="hljs-preprocessor">.cells</span>[<span class="hljs-number">1</span>]<span class="hljs-preprocessor">.appendChild</span>(document<span class="hljs-preprocessor">.createTextNode</span>(<span class="hljs-string">"4"</span>))<span class="hljs-comment">;</span> //将上述表格添加到文档主体中 document<span class="hljs-preprocessor">.body</span><span class="hljs-preprocessor">.appendChild</span>(table)<span class="hljs-comment">;</span> </script></code></pre> <h4 id="1024-使用nodelist">10.2.4 使用NodeList</h4> <p>理解NodeList及其“近亲”NamedNodeMap和HTMLCollection,是从整体上透彻理解DOM的关键所在。这三个集合都是“动态”的。每当文档结构发生变化时,它们都会得到更新,因此,它们始终都保存着最新、最准确的信息。从本质上说,<strong>所有NodeList对象都是在访问DOM文档时实时运行的查询</strong>。下列就是一个会导致无线循环的代码:</p> <pre class="prettyprint"><code class=" hljs applescript"><<span class="hljs-keyword">script</span> type=<span class="hljs-string">"text/javascript"</span>> var divs = document.getElementsByTagName(<span class="hljs-string">"div"</span>), i, <span class="hljs-keyword">div</span>; <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>;i<divs.<span class="hljs-property">length</span>;i++) { <span class="hljs-keyword">div</span> = document.createElement(<span class="hljs-string">"div"</span>); document.body.appendChild(<span class="hljs-keyword">div</span>); } </<span class="hljs-keyword">script</span>></code></pre> <p>上述代码中,由于循环的判断条件中使用了NodeList对象,因此每次执行到此(判断)时,都会对文档运行一次查询,效率比较低。这样做的结果就是循环体中不断向body中添加div元素,因此divs.length不断增长,i也不断增长,成为一个死循环。解决方法如下:</p> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span>></span><span class="javascript"> <span class="hljs-keyword">var</span> divs = document.getElementsByTagName(<span class="hljs-string">"div"</span>), len, i, div; <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>,len=divs.length;i<len;i++) { <span class="hljs-comment">//将NodeList在某一时刻的length属性保存到另一个变量中</span> div = document.createElement(<span class="hljs-string">"div"</span>); document.body.appendChild(div); } </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code></pre> <p>解决方法就是将某一时刻的length属性保存到另一个变量中,这种方式更加保险。 <br> 一般来说,应该尽量减少访问NodeList,因为每访问一次NodeList就会对文档进行一次查询。</p> <h3 id="103-小结">10.3 小结</h3> <p>理解DOM的关键,就是理解DOM对性能的影响。DOM操作往往是JavaScript程序中开销最大的部分,而因访问NodeList导致的问题为最多。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1717760762895740928"></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/1833518628872482816.htm" title="转码日记——Javascript笔记(8)" target="_blank">转码日记——Javascript笔记(8)</a> <span class="text-muted">zzcoding_</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AC%E7%A0%81%E6%97%A5%E8%AE%B0/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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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>数组(Array)数组也是一个对象,和普通对象功能类似。普通对象使用字符串作为属性名,而数组使用数字来作为索引操作。索引:从0开始的整数。数组的存储效率比较高,对属性名没有要求的时候可以使用。基本应用//创建数组对象vararr=newArray();//向数组中添加对象//语法:数组[索引]=值;arr[0]=10;arr[1]=33;//如果读取不存在的索引则返回undefined//获取数组</div> </li> <li><a href="/article/1831229628279255040.htm" title="转码日记——Javascript笔记(14)BOM对象" target="_blank">转码日记——Javascript笔记(14)BOM对象</a> <span class="text-muted">zzcoding_</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AC%E7%A0%81%E6%97%A5%E8%AE%B0/1.htm">转码日记</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>BOM(browserobjectmodel)浏览器对象模型在BOM中,为我们提供了一组对象,用来帮助我们完成对浏览器的操作。BOM对象:Window(代表整个浏览器的窗口,同时也是网页中的全局对象),Navigator(代表当前浏览器的信息,通过该对象可以识别不同的浏览器),Location(代表当前浏览器的地址栏信息,可以获得地址栏信息并操纵浏览器跳转页面),History(代表浏览器的历史记</div> </li> <li><a href="/article/1827874635652362240.htm" title="前端笔记+面试" target="_blank">前端笔记+面试</a> <span class="text-muted">huahua1112520</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>一:JS基础部分原型链和原型每个对象都有_proto_属性,并且指向它的原型对象每个构造函数都有它的prototype原型对象prototype原型对象里的constructor指向它的构造函数new一个构造函数会形成它的实例对象深拷贝与浅拷贝涉及堆栈内存、引用类型的区别如何深拷贝:递归拷贝&&利用JSON函数深拷贝JSON.parse(JSON.stringify({对象}))堆栈内存堆内存:接</div> </li> <li><a href="/article/1757459823798009856.htm" title="前端笔记(2)" target="_blank">前端笔记(2)</a> <span class="text-muted">rtrhhthth</span> <div>一.代码:(1)css样式cssp{color:green;font-size:30px;}-->先天下之忧而忧后天下之乐而乐-->先天下之忧而忧,后天下之乐而乐(2)css语法CSS语法/*CSS的注释,作用和HTML注释类似,只不过它必须编写在style标签中,或者是CSS文件中CSS的语法:选择器声明块选择器:-通过选择器可以选中页面中指定的元素,并且将声明块中的样式应用到选择器对应的元素上</div> </li> <li><a href="/article/1756253773111508992.htm" title="JavaScript笔记/ES6常用语法(笔记)" target="_blank">JavaScript笔记/ES6常用语法(笔记)</a> <span class="text-muted">joker731</span> <div>ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是</div> </li> <li><a href="/article/1755366709264400384.htm" title="前端笔记——JavaScript" target="_blank">前端笔记——JavaScript</a> <span class="text-muted">ALLIN5</span> <div>一、什么是JavaScript?概念:JavaScript是运行在浏览器端的'脚本语言',JavaScript是浏览器解释执行的作用:JavaScript主要解决的是前端与用户交互的问题,包括'使用交互'与'数据交互'。意义:负责'页面行为':部分动画效果、页面与用户的交互、页面功能;二、嵌入页面的三种方式1、行间事件(主要用于事件)2、页面script标签嵌入alert('ok!');3、外部引</div> </li> <li><a href="/article/1754107951653601280.htm" title="前端笔记(14)" target="_blank">前端笔记(14)</a> <span class="text-muted">rtrhhthth</span> <div>代码:1.新增选择器新增选择器window.onload=function(){varoDiv=document.querySelector('#div1');alert(oDiv);//弹出[objectHTMLDivElement],表示选择了该Div//如果要选择多个元素用querySelectorAllvaraLi=document.querySelectorAll('.listli');</div> </li> <li><a href="/article/1753919903963824128.htm" title="Javascript笔记" target="_blank">Javascript笔记</a> <span class="text-muted">nuomi_w</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>1、什么是JavaScript1.1、概述JavaScript是一门世界上最流行的脚本语言Java、JavaScript=一个合格的后端人员,必须要精通JavaScript=1.2、历史https://www.w3school.com.cn/js/pro_js_history.aspECMAScript它可以理解为是JavaScript的一个标准最新版本已经到es6版本但大部分浏览器还只停留在支持</div> </li> <li><a href="/article/1753594298760183808.htm" title="Web前端笔记 -- CSS①" target="_blank">Web前端笔记 -- CSS①</a> <span class="text-muted">十八岁讨厌编程</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">web前端开发</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/CSS/1.htm">CSS</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>文章目录CSS简介HTML的局限性CSS-网页的美容师CSS语法规范CSS代码风格样式格式书写样式大小写空格规范CSS基础选择器CSS选择器的作用选择器分类标签选择器类选择器类选择器-多类名id选择器通配符选择器基础选择器总结CSS字体属性字体系列字体大小字体粗细文字样式字体复合属性字体属性总结CSS文本样式文本颜色对齐文本装饰文本文本缩进行间距文本属性总结CSS的引入方式CSS的三种样式表内部样</div> </li> <li><a href="/article/1753593659648917504.htm" title="【Web前端笔记06】CSS常用属性" target="_blank">【Web前端笔记06】CSS常用属性</a> <span class="text-muted">墨倾许</span> <a class="tag" taget="_blank" href="/search/Web%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Web前端学习笔记</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>目录一、字体属性1、color字体颜色2、font-size字体大小(默认16px)3、font-weight文本粗细4、font-style字体样式5、font-family指定一个元素的字体二、背景属性1、background-color背景颜色2、background-image:url("img/do.png");背景图片3、background-repeat背景图片是否重复4、backg</div> </li> <li><a href="/article/1753591869708713984.htm" title="【Web前端笔记07】CSS选择器" target="_blank">【Web前端笔记07】CSS选择器</a> <span class="text-muted">墨倾许</span> <a class="tag" taget="_blank" href="/search/Web%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Web前端学习笔记</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>目录07CSS选择器一、关系选择器二、伪类选择器三、伪对象选择器四、属性选择器总结07CSS选择器一、关系选择器后代选择器EF{}(所有被E元素包含的F元素,中间用空格隔开)通用兄弟选择器E~F{}(选择E元素之后的所有兄弟元素F,作用于多个元素,用~隔开)相邻兄弟选择器E+F{}(选择紧跟E元素后的F元素,用加好表示,选择相邻的第一个兄弟元素)子代选择器E>F{}(选择所有作为E元素的直接子元素</div> </li> <li><a href="/article/1751889648726065152.htm" title="JavaScript笔记整理" target="_blank">JavaScript笔记整理</a> <span class="text-muted">无所不能的蓝巨人</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>title:JavaScripttags:JavaScriptnotebook:JavaScript笔记整理1.JavaScript基础2022年3月18日大数据类型使用bigIntnull有数据位置但是没有数据,undefined是完全没有数据位置object{}对象,array[]数组if中如果没有写判断语句则括号中的内容会被转换成布尔类型(隐式转换)false:nullnuderfined0</div> </li> <li><a href="/article/1750970868550352896.htm" title="web前端javascript笔记——(14)Navigator 、History、Location" target="_blank">web前端javascript笔记——(14)Navigator 、History、Location</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>Navigator/*DOM文档对象,通过js操作网页BOM浏览器对象BOM可以使我们通过JS来操作浏览器在BOM中为我们提供了一组对象。用来完成对浏览器的操作BOM对象window代表的是整个浏览器的窗口,同时window也是网页中的全局对象Navigator代表的是当前浏览器的信息,通过该对象可以来识别不同的浏览器由于历史原因,Navigator对象中的大部分属性都已经不能帮我们识别浏览器了一</div> </li> <li><a href="/article/1750970869171109888.htm" title="web前端javascript笔记——(15)定时器" target="_blank">web前端javascript笔记——(15)定时器</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>定时器简介window.onload=function(){//获取countvarcount=document.getElementById("count");//使得count中的内容,自动切换/*JS的程序的执行速度是非常非常快的如果希望一段程序,可以每隔一段时间执行一次,可以使用定时调用*//*for(vari=0;i1切换图片练习img{width:600;height:450px;}w</div> </li> <li><a href="/article/1750970869821227008.htm" title="web前端javascript笔记——(16)类" target="_blank">web前端javascript笔记——(16)类</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>类的操作.b1{width:100px;height:100px;background-color:red;}.b2{width:200px;height:200px;background-color:yellow;}window.onload=function(){//获取boxvarbox=document.getElementById("box");//获取btn01varbtn01=doc</div> </li> <li><a href="/article/1750640515834986496.htm" title="前端笔记(6)" target="_blank">前端笔记(6)</a> <span class="text-muted">rtrhhthth</span> <div>代码:1.元素的层级元素的层级.box1{width:200px;height:200px;background-color:red;position:relative;z-index:2;opacity:0.5;filter:alpha(opacity=50);}.box2{width:200px;height:200px;background-color:yellow;/*开启绝对定位*/po</div> </li> <li><a href="/article/1750613883426455552.htm" title="javascript笔记" target="_blank">javascript笔记</a> <span class="text-muted">Tdithyrambus</span> <div>javascript代码必须位于与中脚本可被放置于或中单引号双引号均可双斜杠//或/*...*/之间的代码被视为注释标识符用于命名变量(以及关键词、函数和标签),首字符必须是字母、下划线(-)或美元符号($)对大小写敏感不能使用连字符,如first-nameJavaScript能够以不同方式“显示”数据:使用window.alert()写入警告框使用document.write()写入HTML输出</div> </li> <li><a href="/article/1750532711073726464.htm" title="Web前端笔记——表单" target="_blank">Web前端笔记——表单</a> <span class="text-muted">墨倾许</span> <a class="tag" taget="_blank" href="/search/Web%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Web前端学习笔记</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>目录章节03表单一、Form表单二、表单元素1、表单2、表单元素三、HTML5新增type类型1、email2、url3、search4、tel5、color6、number7、range8、date9、month10、year四、HTML5新增属性1、autofocus属性2、multiple属性3、placeholder属性4、required属性五、实体字符章节03表单一、Form表单表单在</div> </li> <li><a href="/article/1750031383419437056.htm" title="【链接目录】" target="_blank">【链接目录】</a> <span class="text-muted">刘恒123456789</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>推荐链接环境配置PhpStormWindows浏览器插件键盘特殊符号dockerdocker基础Windows10dockerdockerfileLinuxApacheComposerUbuntu后门程序技术Excel压力测试工具GitWampServer前端笔记JavaScript+jQueryLayuiVUESQL笔记MySQLSQLServerRedisPHPPHP笔记PHP设计模式Thin</div> </li> <li><a href="/article/1749907772167700480.htm" title="web前端javascript笔记——(13)事件(2)" target="_blank">web前端javascript笔记——(13)事件(2)</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、拖拽#box1{width:300px;height:300px;background-color:yellowgreen;position:absolute;}#box2{width:300px;height:300px;background-color:yellow;position:absolute;left:300px;top:300px;}window.onload=function</div> </li> <li><a href="/article/1749907644841213952.htm" title="web前端javascript笔记——(12)样式" target="_blank">web前端javascript笔记——(12)样式</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、通过style操作内联样式#box1{width:200px;height:200px;background-color:red;}/*通过style属性读取和设置的都是内联样式通过JS修改元素的样式语法:元素.style.样式名=样式值*通过JS读取元素的样式*语法:元素.style.样式名*/window.onload=function(){/*点击按钮以后,修改box1的大小*///获取</div> </li> <li><a href="/article/1749907514293501952.htm" title="web前端javascript笔记——(13)事件(1)" target="_blank">web前端javascript笔记——(13)事件(1)</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、事件对象鼠标/键盘属性altKey返回当事件被触发时,“ALT”是否被按下。button返回当事件被触发时,哪个鼠标按钮被点击clientX返回当事件被触发时,鼠标指针的水平坐标。clientY返回当事件被触发时,鼠标指针的垂直坐标。ctrlkey返回当事件被触发时,“CTRL"键是否被按下。metakey返回当事件被触发时,"meta"键是否被按下。relatedTarget返回与事件的目标</div> </li> <li><a href="/article/1748795355312439296.htm" title="web前端笔记整理,从入门到上天,周周更新" target="_blank">web前端笔记整理,从入门到上天,周周更新</a> <span class="text-muted">weixin_30527551</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a> <div>由于大前端知识点太多,所以一一做了分类整理,详情可见本人博客http://www.cnblogs.com/luxiaoyao/一、HTML1.注释格式:作用:1.解释说明代码的含义(代码量大,后期维护,便于新人交接)2.调试代码2.head内标签//meta:定义关于HTML文档的元信息3s之后刷新3s之后刷新并跳转到百度//title:定义文档的标题网站的标题//link:定义文档与外部资源的关</div> </li> <li><a href="/article/1747992683802017792.htm" title="JavaScript笔记之一:JS原生" target="_blank">JavaScript笔记之一:JS原生</a> <span class="text-muted">浅度学习的ryan</span> <a class="tag" taget="_blank" href="/search/%E5%90%83%E6%8E%89%E8%BF%99%E6%9C%AC%E5%89%8D%E7%AB%AF%E5%9F%BA%E7%A1%80/1.htm">吃掉这本前端基础</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a> <div>JavaScript一、基础运行在客户端的脚本语言脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来解释执行也可以基于Node.js技术进行服务器端编程1.作用表单动态验证网页特效服务端开发Node.js桌面程序ElectronApp物联网游戏开发2.浏览器执行JS浏览器分为两部分:渲染引擎、JS引擎渲染引擎:用来解释HTML和CSS,内核JS引擎:JS解释器,读取网页中的JS代码,处</div> </li> <li><a href="/article/1746588752622403584.htm" title="web前端javaScript笔记——(11)DOM" target="_blank">web前端javaScript笔记——(11)DOM</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、DOM简介DOM简介/*宿主对象,由浏览器,运行环境为我们提供的对象,BOM对象和DOM对象DOMdocumentobjectmodel文档对象模型JS中通过DOM来对HTML文档进行操作。只要理解了DOM就可以随心所欲的操作WEB页面文档-文档表示的就是整个的HTML网页文档,一个HTML网页就是一个文档对象-对象表示将网页中的每一个部分,各种标签、属性、文本都转换为了一个对象模型-使用模型</div> </li> <li><a href="/article/1745814395830681600.htm" title="前端笔记(11)" target="_blank">前端笔记(11)</a> <span class="text-muted">rtrhhthth</span> <div>代码:(1)函数传参函数传参window.onload=function(){varoDiv=document.getElementById('div1');changeStyle('color','gold');changeStyle('background','red');changeStyle('width','300px');changeStyle('height','300px');ch</div> </li> <li><a href="/article/1745084619885133824.htm" title="web前端javaScript笔记——(8)call()、apply()、arguments()" target="_blank">web前端javaScript笔记——(8)call()、apply()、arguments()</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>/*functionfun(){alert("我是fun函数!");}*//*call()和apply()这两个方法都是函数对象的方法,需要通过函数对象来调用当会函数调用call()和apply()都会调用函数执行在调用call()和appply()可以将一个对象指定为第一个参数此时这个对象将会成为函数执行时的this*///fun();//弹出"我是fun函数"//fun.apply();//弹</div> </li> <li><a href="/article/1745084620442976256.htm" title="web前端javaScript笔记——(10)正则表达式" target="_blank">web前端javaScript笔记——(10)正则表达式</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>正则表达式的简介/*正则表达式*邮箱举例:*admin@atiguigu.com*admin@.com*adminatguigu.com*邮件的规则:*1.前边可以是xxxxx乱七八糟*2.跟着一个@*3.后边可以是xxxxx乱七八糟*4..com获取其他的乱七八糟**正则表达式用于定义一些字符串的规则*计算机可以根据正则表达式,来检查一个字符串是否符合规则*或者将字符串中复合规则的内容提取出来*</div> </li> <li><a href="/article/1745084108549144576.htm" title="web前端javaScript笔记——(9)包装类和字符串" target="_blank">web前端javaScript笔记——(9)包装类和字符串</a> <span class="text-muted">Komorebi_9999</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>/*基本数据类型StringNumberBooleanNullUndefined引用数据类型Object在JS中为我们提供了三个包装类u,通过这三个包装类可以将基本数据类型转换为对象String()可以将基本数据类型字符串转换为String对象Number()可以将基本数据类型的数字转换为Number对象Boolean()可以将基本数据类型的boolean值转换为Boolean对象String()</div> </li> <li><a href="/article/1744714442794352640.htm" title="前端笔记(2)JavaScript面向对象" target="_blank">前端笔记(2)JavaScript面向对象</a> <span class="text-muted">sullay</span> <div>javaScript是不是面向对象语言?JavaScript(es6之前)有对象的概念,却没有类的概念,JavaScript对象可以任意添加属性,而java、c++等其他语言却不能。以至于有些人认为JavaScript并非是面向对象的语言,而是基于对象的语言。实际上JavaScript无疑是面向对象的语言,只不多例如java、c++等语言才用的是“类”的方式来描述对象,这也是最为成功的描述对象方式</div> </li> <li><a href="/article/108.htm" title="Nginx负载均衡" target="_blank">Nginx负载均衡</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</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> <div>Nginx负载均衡一些基础知识: nginx 的 upstream目前支持 4 种方式的分配 1)、轮询(默认)       每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2)、weight       指定轮询几率,weight和访问比率成正比</div> </li> <li><a href="/article/235.htm" title="RedHat 6.4 安装 rabbitmq" target="_blank">RedHat 6.4 安装 rabbitmq</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/redhat/1.htm">redhat</a> <div>在 linux 下安装软件就是折腾,首先是测试机不能上外网要找运维开通,开通后发现测试机的 yum 不能使用于是又要配置 yum 源,最后安装 rabbitmq 时也尝试了两种方法最后才安装成功 机器版本: [root@redhat1 rabbitmq]# lsb_release LSB Version: :base-4.0-amd64:base-4.0-noarch:core</div> </li> <li><a href="/article/362.htm" title="FilenameUtils工具类" target="_blank">FilenameUtils工具类</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/FilenameUtils/1.htm">FilenameUtils</a><a class="tag" taget="_blank" href="/search/common-io/1.htm">common-io</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2217081 一、概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。 </div> </li> <li><a href="/article/489.htm" title="xml文件解析SAX" target="_blank">xml文件解析SAX</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>xml文件解析:xml文件解析有四种方式, 1.DOM生成和解析XML文档(SAX是基于事件流的解析) 2.SAX生成和解析XML文档(基于XML文档树结构的解析) 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML 本文章用第一种方法进行解析,使用android常用的DefaultHandler import org.xml.sax.Attributes; </div> </li> <li><a href="/article/616.htm" title="通过定时任务执行mysql的定期删除和新建分区,此处是按日分区" target="_blank">通过定时任务执行mysql的定期删除和新建分区,此处是按日分区</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>使用python脚本作为命令脚本,linux的定时任务来每天定时执行 #!/usr/bin/python # -*- coding: utf8 -*- import pymysql import datetime import calendar #要分区的表 table_name = 'my_table' #连接数据库的信息 host,user,passwd,db = </div> </li> <li><a href="/article/743.htm" title="如何搭建数据湖架构?听听专家的意见" target="_blank">如何搭建数据湖架构?听听专家的意见</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>Edo Interactive在几年前遇到一个大问题:公司使用交易数据来帮助零售商和餐馆进行个性化促销,但其数据仓库没有足够时间去处理所有的信用卡和借记卡交易数据  “我们要花费27小时来处理每日的数据量,”Edo主管基础设施和信息系统的高级副总裁Tim Garnto说道:“所以在2013年,我们放弃了现有的基于PostgreSQL的关系型数据库系统,使用了Hadoop集群作为公司的数</div> </li> <li><a href="/article/870.htm" title="spring学习——控制反转与依赖注入" target="_blank">spring学习——控制反转与依赖注入</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>       控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。   </div> </li> <li><a href="/article/997.htm" title="用spool+unixshell生成文本文件的方法" target="_blank">用spool+unixshell生成文本文件的方法</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/xshell/1.htm">xshell</a> <div>例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:   set pages 50000;   set lines 200;   set trims on;   set heading off;   spool /oracle_backup/log/test/dept.lst;   select deptno||','||dname||','||loc </div> </li> <li><a href="/article/1124.htm" title="1、基础--名词解析(OOA/OOD/OOP)" target="_blank">1、基础--名词解析(OOA/OOD/OOP)</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">学习基础知识</a> <div>OOA:Object-Oriented Analysis(面向对象分析方法) 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。   OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)</div> </li> <li><a href="/article/1251.htm" title="浅谈java转成json编码格式技术" target="_blank">浅谈java转成json编码格式技术</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/json%E7%BC%96%E7%A0%81/1.htm">json编码</a><a class="tag" taget="_blank" href="/search/java%E8%BD%AC%E6%88%90json%E7%BC%96%E7%A0%81/1.htm">java转成json编码</a> <div>json编码;是一个轻量级的数据存储和传输的语言       在java中需要引入json相关的包,引包方式在工程的lib下就可以了   JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非   常适合于服务器与 JavaScript 之间的数据的交</div> </li> <li><a href="/article/1378.htm" title="web.xml之Spring配置(基于Spring+Struts+Ibatis)" target="_blank">web.xml之Spring配置(基于Spring+Struts+Ibatis)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/SSI/1.htm">SSI</a><a class="tag" taget="_blank" href="/search/spring%E9%85%8D%E7%BD%AE/1.htm">spring配置</a> <div>指定Spring配置文件位置 <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-dao-bean.xml,/WEB-INF/spring-resources.xml, /WEB-INF/</div> </li> <li><a href="/article/1505.htm" title="Installing SonarQube(Fail to download libraries from server)" target="_blank">Installing SonarQube(Fail to download libraries from server)</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/Sonar/1.htm">Sonar</a> <div>1.  Download and unzip the SonarQube distribution 2.  Starting the Web Server The default port is "9000" and the context path is "/". These values can be changed in &l</div> </li> <li><a href="/article/1632.htm" title="【MongoDB学习笔记十一】Mongo副本集基本的增删查" target="_blank">【MongoDB学习笔记十一】Mongo副本集基本的增删查</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>一、创建复本集   假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:   mongod --port 27017 --dbpath data1 --replSet rs0 mongod --port 27018 --dbpath data2 --replSet rs0 mongod --port 27019 -</div> </li> <li><a href="/article/1759.htm" title="Anychart图表系列二之执行Flash和HTML5渲染" target="_blank">Anychart图表系列二之执行Flash和HTML5渲染</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/Flash/1.htm">Flash</a> <div>今天介绍Anychart的Flash和HTML5渲染功能   HTML5 Anychart从6.0第一个版本起,已经逐渐开始支持各种图的HTML5渲染效果了,也就是说即使你没有安装Flash插件,只要浏览器支持HTML5,也能看到Anychart的图形(不过这些是需要做一些配置的)。 这里要提醒下大家,Anychart6.0版本对HTML5的支持还不算很成熟,目前还处于</div> </li> <li><a href="/article/1886.htm" title="Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa" target="_blank">Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/laravel/1.htm">laravel</a> <div>昨天在为了把laravel升级到最新的版本,突然之间就出现了如下错误: ErrorException thrown with message "Declaration of Illuminate\View\Engines\CompilerEngine::handleViewException() should be compatible with Illuminate\View\Eng</div> </li> <li><a href="/article/2013.htm" title="编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜" target="_blank">编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜</a> <span class="text-muted">bylijinnan</span> <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.Arrays; import java.util.Random; public class Nim { /**编程之美 NIM游戏分析 问题: 有N块石头和两个玩家A和B,玩家A先将石头随机分成若干堆,然后按照BABA...的顺序不断轮流取石头, 能将剩下的石头一次取光的玩家获胜,每次取石头时,每个玩家只能从若干堆石头中任选一堆,</div> </li> <li><a href="/article/2140.htm" title="lunce创建索引及简单查询" target="_blank">lunce创建索引及简单查询</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E6%9F%A5%E8%AF%A2/1.htm">查询</a><a class="tag" taget="_blank" href="/search/%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95/1.htm">创建索引</a><a class="tag" taget="_blank" href="/search/lunce/1.htm">lunce</a> <div>import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Docume</div> </li> <li><a href="/article/2267.htm" title="[IT与投资]坚持独立自主的研究核心技术" target="_blank">[IT与投资]坚持独立自主的研究核心技术</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/it/1.htm">it</a> <div>        和别人合作开发某项产品....如果互相之间的技术水平不同,那么这种合作很难进行,一般都会成为强者控制弱者的方法和手段.....        所以弱者,在遇到技术难题的时候,最好不要一开始就去寻求强者的帮助,因为在我们这颗星球上,生物都有一种控制其</div> </li> <li><a href="/article/2394.htm" title="flashback transaction闪回事务查询" target="_blank">flashback transaction闪回事务查询</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E9%97%AA%E5%9B%9E%E4%BA%8B%E5%8A%A1/1.htm">闪回事务</a> <div>   闪回事务查询有别于闪回查询的特点有以下3个: (1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。 (2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。 (3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“vers</div> </li> <li><a href="/article/2521.htm" title="Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件" target="_blank">Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件</a> <span class="text-muted">游其是你</span> <a class="tag" taget="_blank" href="/search/FilenameFilter/1.htm">FilenameFilter</a> <div>这是一个FilenameFilter类用法的例子,实现的列举出“c:\\folder“路径下所有以“.jpg”扩展名的文件。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 </div> </li> <li><a href="/article/2648.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> <div># include <stdio.h> int f(void) //括号中的void表示该函数不能接受数据,int表示返回的类型为int类型 { return 10; //向主调函数返回10 } void g(void) //函数名前面的void表示该函数没有返回值 { //return 10; //error 与第8行行首的void相矛盾 } in</div> </li> <li><a href="/article/2775.htm" title="今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl" target="_blank">今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a> <div>今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again   处理很简单,修改文件“/etc/yum.repos.d/epel.repo”, 将baseurl的注释取消, mirrorlist注释掉。即可。 &n</div> </li> <li><a href="/article/2902.htm" title="单例模式" target="_blank">单例模式</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a> <div>单例模式      懒汉式 public class RunMain { /** * 私有构造 */ private RunMain() { } /** * 内部类,用于占位,只有 */ private static class SingletonRunMain { priv</div> </li> <li><a href="/article/3029.htm" title="Spring Security(09)——Filter" target="_blank">Spring Security(09)——Filter</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a> <div>Filter 目录 1.1     Filter顺序 1.2     添加Filter到FilterChain 1.3     DelegatingFilterProxy 1.4     FilterChainProxy 1.5</div> </li> <li><a href="/article/3156.htm" title="公司项目NODEJS实践0.1" target="_blank">公司项目NODEJS实践0.1</a> <span class="text-muted">逐行分析JS源代码</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a> <div>  一、前言         前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。         网上有很多nod</div> </li> <li><a href="/article/3283.htm" title="java.lang.Math" target="_blank">java.lang.Math</a> <span class="text-muted">liuhaibo_ljf</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/lang/1.htm">lang</a> <div>System.out.println(Math.PI); System.out.println(Math.abs(1.2)); System.out.println(Math.abs(1.2)); System.out.println(Math.abs(1)); System.out.println(Math.abs(111111111)); System.out.println(Mat</div> </li> <li><a href="/article/3410.htm" title="linux下时间同步" target="_blank">linux下时间同步</a> <span class="text-muted">nonobaba</span> <a class="tag" taget="_blank" href="/search/ntp/1.htm">ntp</a> <div>今天在linux下做hbase集群的时候,发现hmaster启动成功了,但是用hbase命令进入shell的时候报了一个错误  PleaseHoldException: Master is initializing,查看了日志,大致意思是说master和slave时间不同步,没办法,只好找一种手动同步一下,后来发现一共部署了10来台机器,手动同步偏差又比较大,所以还是从网上找现成的解决方</div> </li> <li><a href="/article/3537.htm" title="ZooKeeper3.4.6的集群部署" target="_blank">ZooKeeper3.4.6的集群部署</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2/1.htm">部署</a> <div>ZooKeeper是Apache的一个开源项目,在分布式服务中应用比较广泛。它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、配置文件管理、同步锁、队列等。这里主要讲集群中ZooKeeper的部署。   1、准备工作 我们准备3台机器做ZooKeeper集群,分别在3台机器上创建ZooKeeper需要的目录。   数据存储目录</div> </li> <li><a href="/article/3664.htm" title="Java高效读取大文件" target="_blank">Java高效读取大文件</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>  读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:   Files.readLines(new File(path), Charsets.UTF_8);   FileUtils.readLines(new File(path));   这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致</div> </li> <li><a href="/article/3791.htm" title="微信支付api返回的xml转换为Map的方法" target="_blank">微信支付api返回的xml转换为Map的方法</a> <span class="text-muted">xu3508620</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/map/1.htm">map</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1api/1.htm">微信api</a> <div>举例如下: <xml>    <return_code><![CDATA[SUCCESS]]></return_code>    <return_msg><![CDATA[OK]]></return_msg>    <appid><</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>