DOM可以做什么(三)

DOM节点信息

每个DOM节点都保存了关于该节点的一些信息,我们来看看如何访问这些信息。

nodeName、nodeValue和nodeType

同样,按照字面意思:nodeName表示节点名称,nodeValue表示节点值,nodeType则为节点类型。每个DOM节点都包含这些信息,我们可以很方便地通过JavaScript来访问这些属性。下面我们就来看一个使用这些属性的一个例子。

应用实例

HTML代码:

<div>
  <p id="test">test文字</p>
</div>


JavaScript代码

<script type="text/javascript">
function getName(){
        var x =document.getElementById("test");
        alert(x.nodeName);
}
function getValue(){
        var x =document.getElementById("test");
        alert(x.nodeValue);
}
function getType(){
        var x =document.getElementById("test");
        alert(x.nodeType);
}
</script>



实际效果:

test文字


getName()
getValue()
getType()


从例子中可以发现:一个p标签的nodeName是P,尽管在XHMTL中我们把段落写作小些的p,该属性仍然为大写字母。它的nodeValue是null,而并不是它所包含的文本,这是因为文本本身也是一个节点,而文本节点的nodeValue才是文字。

最后,nodeType是“1”。它的意思是元素节点(我们知道,p是一个HTML元素)。其它重要的DOM节点类型:

  • 2 —— 属性节点
  • 3 —— 文本节点
  • 8 —— 注释节点
======================================================================================================


DOM信息nodeType的应用

本文介绍了使用DOM节点的nodeType属性来过滤出特定类型节点的方法。并且举了一个统计文档内所有元素节点的实例。

使用DOM时一个很奇怪(也很恼人)的情况就是连代码中的换行都可能会被视为节点。以下面的HTML代码为例。

HTML代码

代码如下,我们可以清楚地看到div节点内只有一个段落。

<div id="test">
        <p>我是测试段落</p>
</div>
<div id="result">&nbsp;</di
v>

JavaScript代码

之后我们使用下面的JavaScript代码来显示id为test的div的子节点。首先,我们使用getElementById获得id为test的节点。之后使用childNodes获得它的子结点。最后在id为result的节点中显示这些子结点的节点名称和节点类型。

<script type="text/javascript">
function test(){
        var str = "";
        var nodes =document.getElementById("test").childNodes;
        for( var i = 0;i <nodes.length; i++){
               str += nodes[i].nodeName;
               str += ":";
               str += nodes[i].nodeType;
               str += "<br/>";
        }
        document.getElementById("result").innerHTML= str;
}
</script>

nodeType的应用

点击下面的按钮就可以看到您所使用的浏览器认为这个div有几个子结点。

test()

我是测试段落

 

在FireFox下,得到如下的结果:

#text:3

P:1

#text:3

在IE下,得到如下结果:

P:1

可见,在FireFox中,代码中的换行也被认为是一个类型为1,名字为#text的节点。但是通常我们对代码中的换行并不感兴趣。这时我们就可以使用nodeType来过滤掉这类不需要的元素。使用下面的JS代码就可以实现了。

for( var i = 0;i < nodes.length; i++){
        if(nodes[i].nodeType == 1){

        //代码,只有在节点为元素节点的时候才执行

        }
}

遍历文档所有的元素节点

下面我们在来看一段使用nodeType的JS代码。它的功能是遍历文档中所有的元素节点,并且统计元素节点的总数。当然我们以可以修改代码来对这些元素节点做任何操作。JavaScript代码如下:

<script type="text/javascript">
function countElements(node){
        var total = 0;
        if(node.nodeType == 1){ total +=1;}
        var children = node.childNodes;
        for(var i = 0;i <children.length; i++){
               total +=countElements(children[i]);
        }
        return total;
}
function test2(){
        var elementsCount =countElements(document);
        alert(elementsCount);
}
</script>

test2()

点击上面的按钮就可以看到这个网页的总元素节点数了



======================================================================================================

修改DOM——innerHTML

本节介绍使用innerHTML来访问以及修改HTML DOM的方法。

我们之前已经了解到一些查询DOM节点的函数,例如getElementByIdgetElementsByTagName。但是我们不仅可以访问DOM节点,更可以改变它们,甚至改变整个节点树的结构。下面我们就来看看改变DOM的最简单的方法——innerHTML。

innerHTML的意思就是“里面的HTML”,就像它的名字一样容易理解,使用它也是异常的简单。我们先来看一个例子。

访问innerHTML实例代码

<div id="test">
        <p>我是测试段落。</p>
</div>

效果如下:

我是测试段落。

test() ,点击这个按钮就可以显示出div的innerHTML,它调用的JS代码如下:

<script type="text/javascript">
function test(){
        alert(document.getElementById("test").innerHTML);
}
</script>

修改innerHTML实例代码

给元素的innerHTML赋值就可以改变元素的内容了,同样是上面的div,我们创建另外一段代码来改变它的内容:

<script type="text/javascript">
function testW(){
        var str = "<p>面目全非!¥%……&*()</p>";
        document.getElementById("test").innerHTML= str;
}
</script>

testW() ,点击这个按钮就可以执行上面的代码,将第一个例子中div的内容改变。

 

删除DOM节点——removeChild

本节介绍了如何使用removeChild从文档中删除DOM节点,举出一个简单例子的同时还简单介绍了该函数的返回值。

上一节我们看了如何使用innerHTML来修改DOM,而使用removeChild函数则可以删除文档中的指定节点。我们仍然使用一个例子来说明该函数的使用方法。

HTML代码

<div id="test">
        <p>我是将要被删除的节点</p>
</div>

实例JavaScript代码

<script type="text/javascript">
function remove(){
        var test =document.getElementById("test");
        var children = test.childNodes;
        for(i=0;i<children.length;i++){
               test.removeChild(children[i]);
        }
}
</script>

删除节点示例

我是将要被删除的节点

remove() ,点击这个按钮就会将上面div的子结点全部删除。

从上面的JS代码可以看到,使用removeChild的格式为:

父节点.removeChild(子结点)

removeChild的返回值

removeChild删除节点后会返回被删除节点的引用,这样当我们以后再想重新将它添加到文档中,或者是对它进行其它操作的时候就可以使用这个引用了。例如下面的代码段:

var removed = xxx.removeChild(xxxx);

则removed就是被删除的节点,可以在后面的代码中使用。

添加DOM节点

本节介绍使用标准的DOM方法向文档中添加节点,用到了createElement、createTextNode以及appendChild等方法。

前面我们通过innerHTML来改变文档的内容,当然也可以用它来添加节点。下面我们来看另外一种想文档中添加节点的方式——使用标准的DOM方法。

使用DOM方法修改文档比使用innerHTML要麻烦一些,我们先来看一段示例HTML代码:

<div id="test" style="border:1pxsolid"></div>

使用DOM方法添加一个段落节点的思路如下:

  1. 创建一个p节点
  2. 穿件一个文本节点,并且添加到p节点中
  3. 将p节点添加到div中

实例JavaScript代码

按照上面的思路我们得出如下的JS代码:

<script type="text/javascript">
function test(){
        var test =document.getElementById("test");
        var para = document.createElement("P");
        var text =document.createTextNode("要添加的文本");
        para.appendChild(text);
        test.appendChild(para);
}      
</script>

添加节点的效果

下面就是原来的div,由于没有内容,我们只能看到边框。

添加节点 ,点击这个按钮就可以运行上面的代码。可以看到上面的div里多出了我们创造的段落节点。

代码解释

首先,我们用到了var para =document.createElement("P");该语句创建了一个段落节点,但是它并不会马上出现在文档中。要创建其它节点,只需要吧传递给该函数的字符串参数修改一些即可,例如document.createElement("DIV")。

var text = document.createTextNode("要添加的文本");一句创建了一个文本节点。

para.appendChild(text);将text作为子结点添加到para这个段落节点上。很容易看出,appendChild的调用语法如下:父节点.appendChild.(子结点)。

最后一句test.appendChild(para);则将段落节点para添加到test这个div节点上,由于test节点原来就是文档的一部分,这一句会造成文档的更新,也就是我们会看到段落文字被添加到了div节点里。









<think>好的,我现在需要向用户解释DOM是什么。用户之前已经询问过DOM型XSS,现在他们想更基础地了解DOM本身。首先,我得确定用户对DOM的了解程度,可能他们刚接触前端开发或安全概念,所以需要用简单易懂的语言,避免技术术语过多。 首先,我应该从DOM的定义开始。DOM代表文档对象模型,是浏览器将网页转换为对象结构的方式,这样JavaScript可以与之交互。可能需要用比喻来解释,比如把网页比作树,每个标签是树的节点,这样用户更容易理解结构。 接下来,需要说明DOM的作用。为什么需要DOM?因为它允许动态修改页面内容、结构和样式,实现交互效果。比如点击按钮改变文字,都是通过操作DOM完成的。这时候可以举一个简单的例子,比如用JavaScript改变元素的文本内容。 然后,应该解释DOM的结构,比如树状结构,包含文档、元素、属性、文本等节点。可能需要画个示意图,但文字描述也要清晰。例如,HTML中的每个标签对应DOM中的一个节点,嵌套关系形成父子节点。 还要提到DOMHTML的区别。HTML是静态的代码,而DOM是浏览器解析后生成的动态对象,可以被修改。用户可能混淆这两者,需要明确区分。 另外,用户之前问过DOM型XSS,所以可以稍微关联一下,说明DOM操作不当可能导致安全问题,但这里主要介绍DOM本身,安全部分可以简要提及。 需要确保语言口语化,避免过于学术化。检查是否有术语需要进一步解释,比如节点、API等。可能用“构建成树的结构”代替“树状结构”更易懂。 最后,总结DOM的重要性,在前端开发中的作用,以及为什么理解DOM对编写交互式网页和避免安全问题很关键。可能还要提到开发者工具中的元素检查器就是查看DOM的实时状态,增加实用性。 现在组织这些点,按逻辑顺序排列,确保每个部分自然过渡,并举例说明。检查是否有错误或遗漏,比如是否覆盖了DOM的关键特性,是否用用户能理解的例子,比如动态修改内容。确保回答结构清晰,分点明确,帮助用户逐步理解DOM的概念。</think>### **DOM 详解:网页的“可编程接口”** **一句话理解**: DOM(Document Object Model,文档对象模型)是浏览器将网页转换为**结构化对象**的表示方式,允许开发者用 JavaScript 动态操控页面内容、样式和交互。 --- ### **一、DOM 的本质** #### **1. 网页的“树形结构说明书”** - **类比**:将 HTML 代码想象成一本建筑图纸,DOM 就是根据这份图纸在浏览器中“盖房子”后的维模型。 - **核心作用**:把静态的 HTML 标签(如 `<div>`、`<p>`)转换为浏览器可理解的**对象**,形成树状结构(节点树)。 #### **2. 动态操控的关键** - **修改能力**:通过 JavaScript 增删改查 DOM 节点,实现页面动态更新(如点击按钮弹出提示、实时刷新数据)。 - **示例**: ```javascript // 点击按钮时修改文字内容 document.getElementById("myButton").onclick = function() { document.getElementById("text").innerHTML = "内容已更新!"; }; ``` --- ### **二、DOM 的结构解析** #### **1. 节点(Node)的类型** | **节点类型** | 示例 | |--------------------|--------------------------| | 文档节点(Document)| 整个网页的入口(根节点) | | 元素节点(Element)| `<div>`, `<p>`, `<a>` | | 属性节点(Attribute)| `href`, `class`, `id` | | 文本节点(Text) | 标签内的纯文字内容 | #### **2. 树状层级关系** 以简单 HTML 为例: ```html <html> <head> <title>网页标题</title> </head> <body> <h1>你好,DOM!</h1> <p>这是一个段落</p> </body> </html> ``` 对应的 DOM 树结构: ``` Document └── html ├── head │ └── title │ └── "网页标题"(文本节点) └── body ├── h1 │ └── "你好,DOM!"(文本节点) └── p └── "这是一个段落"(文本节点) ``` --- ### **DOMHTML 的区别** | **对比项** | HTML | DOM | |----------------|-------------------------------|-------------------------------| | **本质** | 静态文本代码 | 动态内存对象模型 | | **修改方式** | 手动编辑文件 | JavaScript 实时操作 | | **实时性** | 刷新页面后生效 | 即时生效(无需刷新) | | **错误处理** | 浏览器自动修正语法错误 | 操作错误直接导致脚本异常 | **示例**: 若 HTML 中写 `<div>未闭合`,浏览器会自动补全为 `<div>未闭合</div>`,但 DOM 操作时若未正确闭合标签,JavaScript 会报错。 --- ### **四、DOM 的核心操作 API** #### **1. 查询元素** ```javascript // 通过 ID 获取 const element = document.getElementById("header"); // 通过 CSS 选择器获取(首个匹配项) const element = document.querySelector(".menu-item"); // 获取所有匹配项 const list = document.querySelectorAll("button"); ``` #### **2. 修改内容与属性** ```javascript // 修改文本内容(自动转义HTML标签,安全) element.textContent = "<strong>新文本</strong>"; // 修改HTML内容(危险!可能引发XSS) element.innerHTML = "<strong>加粗文本</strong>"; // 修改属性 element.setAttribute("href", "https://example.com"); ``` #### **3. 动态增删节点** ```javascript // 创建新元素 const newDiv = document.createElement("div"); newDiv.textContent = "我是新来的!"; // 添加到页面末尾 document.body.appendChild(newDiv); // 删除节点 const oldElement = document.getElementById("old"); oldElement.parentNode.removeChild(oldElement); ``` --- ### **五、DOM 的重要性** 1. **交互基石**:所有网页动态效果(如表单验证、动画、数据加载)都依赖 DOM 操作。 2. **跨平台兼容**:不同浏览器根据统一 DOM 标准渲染页面,确保一致性(尽管实现细节可能有差异)。 3. **开发者工具依赖**:浏览器调试工具中的“元素检查器”实际是查看 DOM 的实时状态,而非原始 HTML。 --- ### **六、生活化类比** - **HTML** 像乐高积木的说明书(静态步骤)。 - **DOM** 是按说明书拼好的乐高模型,你可以随时拆掉一块积木(删除节点)、换个颜色(修改样式)或加个新部件(插入节点)。 - **JavaScript** 就是你的双手,通过 DOM 操作“改造”这个模型。 理解 DOM,就掌握了网页动态交互的“遥控器”! 🎮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值