zoukankan      html  css  js  c++  java
  • JavaScript快速入门(六)——DOM

    概念扫盲

    DOM

    DOM是 Document Object Model(文档对象模型)的缩写,是W3C(万维网联盟)的标准。
    DOM 定义了访问 HTML 和 XML 文档的标准:
    “W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
    W3C DOM 标准被分为 3 个不同的部分:
    • 核心 DOM - 针对任何结构化文档的标准模型
    • XML DOM - 针对 XML 文档的标准模型
    • HTML DOM - 针对 HTML 文档的标准模型

    这篇文章主要讲HTML DOM

    HTML DOM

    HTML DOM 是:
    • HTML 的标准对象模型
    • HTML 的标准编程接口
    • W3C 标准
    HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
    换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

    JavaScript DOM

    前面讲过,DOM定义了访问HTML和XML文档的标准:“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
    注意粗体字部分,DOM是中立于平台和语言的接口,也就是任意平台、任意语言中,都有相应的DOM接口。但在我们这篇文章中,我们主要的还是采用浏览器平台、JavaScript语言中的DOM接口来做阐述,这也是目前使用最频繁的接口了。
    只是想提醒大家,不要以偏概全,认为只有JavaScript中的DOM才是真正的DOM。下文中,我们说的DOM接口也全部是JavaScript DOM和HTML DOM中的内容。
    学习这部分需要大家对HTML、CSS、JS有基础的认识和了解。
     

    DOM树

    简单的DOM树

    我们之前说过一句话,也希望大家记住这句话:“有嵌套的地方就有父子关系。”
    HTML中允许嵌套,并且允许多重嵌套,多种父子关系就形成了一棵树,我们叫它DOM树。
    我们先来看一份简单的HTML代码:
    <html>
    	<head>
    		<title>文档标题</title>
    	</head>
    	<body>
    		<a href="#">我的链接</a>
            <h1>我的标题</h1>
    	</body>
    </html>
    它的DOM树是这样的:
    HTML DOM Node Tree

    节点关系

    基本的节点关系有父子、同胞,衍生出来的有祖先—后代。父节点我们用parent表示,子节点用child,同胞用sibling。
    • 在节点树中,顶端节点被称为根(root)
    • 每个节点都有父节点、除了根(它没有父节点)
    • 一个节点可拥有任意数量的子
    • 同胞是拥有相同父节点的节点
    我们将刚才的DOM树截取掉一部分,
    DOM 节点关系
    这样就比较清楚了。

    节点类型

    文档的不同组成部分有不同的节点类型,共有12种,具体如下:
    节点类型值节点类型描述子节点
    1 Element 代表元素 Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference
    2 Attr 代表属性 Text, EntityReference
    3 Text 代表元素或属性中的文本内容。 None
    4 CDATASection 代表文档中的 CDATA 部分(不会由解析器解析的文本)。 None
    5 EntityReference 代表实体引用。 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
    6 Entity 代表实体。 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
    7 ProcessingInstruction 代表处理指令。 None
    8 Comment 代表注释。 None
    9 Document 代表整个文档(DOM 树的根节点)。 Element, ProcessingInstruction, Comment, DocumentType
    10 DocumentType 向为文档定义的实体提供接口 None
    11 DocumentFragment 代表轻量级的 Document 对象,能够容纳文档的某个部分 Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
    12 Notation 代表 DTD 中声明的符号。 None
    其中,常用的是类型有Element,Attr,Text,Document等几种。节点类型可以通过以下语句来获得:
    node.nodeType
    获取到的将是对应的节点类型值,注意这个值以字符串形式返回。
    不同的节点类型的nodeName 和nodeValue返回值如下:
    节点类型nodeName 返回nodeValue 返回
    1 Element 元素名 null
    2 Attr 属性名称 属性值
    3 Text #text 节点的内容
    4 CDATASection #cdata-section 节点的内容
    5 EntityReference 实体引用名称 null
    6 Entity 实体名称 null
    7 ProcessingInstruction target 节点的内容
    8 Comment #comment 注释文本
    9 Document #document null
    10 DocumentType 文档类型名称 null
    11 DocumentFragment #document 片段 null
    12 Notation 符号名称 null

    JavaScript DOM接口

    获取DOM node

    传统方法

    获取DOM节点的传统方法有三种,分别是getElementById, getElementsByTagName, getElementsByName。
    getElementById属于document对象的方法,传入参数为节点的id值,返回该id对应的节点。由于id是独一无二的,所以返回值只有一个节点。如果文档中有多个同名id,不同浏览器处理结果可能不同,例如谷歌浏览器是以最后一个为准。例如:
    <html>
        <head>
            <title>文档标题</title>
        </head>
        <body>
            <form action="get" id="target-form">
                <input type="text" name="target-input" value="123" />      
            </form>
        </body>
        <script type="text/javascript">
            var a = document.getElementById("target-form"); // form对应的节点
        </script>
    </html>
    切记不要丢了前面的document,否则会报错。
    getElementsByName和getElementById很相似,都是document对象里的方法,不同的是传入的参数为节点的name。由于文档中允许存在同个name值的节点,例如<input type="radio" />,又例如多个表单中的同名表单项。所以返回对象是一个nodelist,你也可以把它当成一个数组。
    我们还是用上面的例子,把js部分修改一下:
    var a = document.getElementsByName("target-input")[0]; // input对应的节点
    getElementsByTagName和前面两个分别有相同之处,又有不同之处。它不仅仅是document对象的方法,还是所有元素节点的方法。它传入的参数是标签名,返回的是nodelist,因为明显同个文档中可以有多个相同标签。
    <html>
        <head>
            <title>文档标题</title>
        </head>
        <body>
            <form action="get" id="target-form">
                <input type="text" name="target-input" value="123" />      
            </form>
        </body>
        <script type="text/javascript">
            var a = document.getElementById("target-form").getElementsByTagName("input")[0]; // input对应的节点
        </script>
    </html>
    可能有些人会问,我还看到了getElementsByClassName方法啊。其实,这方法只是部分浏览器产商定下的方法,很实用,但并非W3C标准里的方法,至少IE8及以下是不能用的。

    新的方法

    HTML5中,新支持了两个节点获取方法,那就是querySelector和querySelectorAll方法,两者都是document或元素节点的方法。它们的参数一样,都是字符串,且以CSS选择器的形式体现,不同的是,querySelector返回首次匹配的节点,而querySelectorAll返回nodeList,查找原则为深度优先和先序遍历。
    <html>
        <head>
            <title>文档标题</title>
        </head>
        <body>
            <form action="get" id="target-form">
                <input type="text" name="target-input" value="123" />
                <input type="text" name="target-input2" value="123" />
            </form>
        </body>
        <script type="text/javascript">
            var a = document.querySelector("#target-form").querySelectorAll("input"); // 包含两个input的数组
        </script>
    </html>

    获取及操纵属性值

    我们终究是要利用这些接口来做点什么的,例如,我们想获取上文那例子里面输入框的值。我们可以这么写:
    var a = document.getElementById("target-form").getElementsByTagName("input")[0].value;
    如果我们要设定输入框的值,也类似:
     document.getElementById("target-form").getElementsByTagName("input")[0].value = “12345”;
    但这样好像没什么用,我们换种用法,更使用一点。我们经常看到有一种效果,点击按钮,某个东西消失了,再点击,又出现了。我们来模拟一下:
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>文档标题</title>
        </head>
        <body>
            <p>点击按钮此句消失</p>
            <button id="btn">消失</button>
        </body>
        <script type="text/javascript">
            var btn = document.getElementById("btn"),
                p = document.getElementsByTagName("p")[0];
            btn.onclick = function() {
                if(p.style.display == "none") {
                    p.style.display = "";
                    this.innerText = "消失";
                } else {
                    p.style.display = "none";
                    this.innerText = "显示";
                }
            }
        </script>
    </html>
    在这里,我们操作的是元素节点p里面的属性节点style,修改其display属性,从而达到修改CSS的目的。

    DOM 事件

    在上例中我们看到了一个点击事件,这就是事件中的一种。关于DOM事件我们在另一篇文章中有详细讲到,详情请点击观看JavaScript事件
  • 相关阅读:
    第二题:坦克游戏1.0(方法:动态规划)
    第一题:小鼠迷宫问题(方法:广搜)
    我的世界之电脑mod小乌龟 —— 方位上的操作 lua函数集
    NOIP 2011 提高组 选择客栈(vijos 1737)(方法:队列,数学)
    codeforces_1040_A Python练习
    codeforces_466_C Python练习
    codeforces_158_B Python练习
    三.Python_scrapy的Item对象 学习笔记
    二.Pyhon_scrapy终端(scrapy shell)学习笔记
    一.Python_srcrapy的命令行工具 学习笔记(Command line tool)
  • 原文地址:https://www.cnblogs.com/smght/p/4369641.html
Copyright © 2011-2022 走看看