js操作DOM入门

简介: 一、什么是DOM?    什么叫DOM,DOM是文档对象模型(Document Object Model,是基于浏览器编程(在本教程中,可以说就是DHTML编程)的一套API接口,W3C出台的推荐标准,每个浏览器都有一些细微的差别,其中以Mozilla的浏览器最与标准接近。
一、什么是DOM? 

   什么叫DOM,DOM是文档对象模型(Document Object Model,是基于浏览器编程(在本教程中,可以说就是DHTML编程)的一套API接口,W3C出台的推荐标准,每个浏览器都有一些细微的差别,其中以Mozilla的浏览器最与标准接近。单纯的Javascript要结合DOM才能做DHTML编程,才能做出漂亮的效果、应用于WEB。这点几乎与其它的语言无异,正如C/C++需要库支持是一样的道理。否则就是单纯的在语法上做研究了。

    因此,必须要对DOM有一定的认识,才能把Javascript应用于WEB,或你的RIA应用当中,因为DHTML本质上就是操作DOM树。 

   以后的编程当中,希望你能够把DHTML.chm这本手册也拿上,如果你需要兼容gecko,把gecko的DOM手册也带上。因为API太多,想不起来的接口还可以查这本手册。 如果你要测试浏览器是否是支持DOM的,简单的一句就可以判断 
  
<script> 
    var isSupportDOM = !!document.getElementById; //两个取反,这已经在上节中说过了,意思是强制转型 
     alert("你的浏览器 " +(isSupportDOM?"":"不")+ "支持 DOM!"); 
</script> 

二、DOM树 
要注意:DOM树的根统一为文档根—document,DOM既然是树状结构,那么他们自然有如下的几种关系: 
根结点(document) 
  父结点(parentNode) 
    子结点(childNodes) 
     兄弟结点 兄弟结点 
      (sibling) (sibling) 
例子: 
假设网页的HTML如下 
程序代码 
<html> 
 <head> 
   <title>never-online's website</title> 
 </head> 
 <body> 
    <div>tutorial of DHTML and javascript programming</div> 
 </body> 
</html> 

我们参照树的概念,画出该HTML文档结构的DOM树: 
          html 
       body head 
        div     title 
         文本    文本 
从上面的图示可以看出 
html有两个子结点,而html就是这两个子节点的父结点 
head有节点title,title下有一个文本节点 
body下有节点div,div下有一个文本节点

三、操作DOM树 
开篇已经说过,DHTML本质就是操作DOM树。如何操作它呢? 
假设我要改变上面HTML文档中div结点的文本,如何做? 
程序代码 
<html> 
<head> 
<title>never-online's website</title> 
<script> 
  function changedivText (strText) { 
    var nodeRoot = document; //这个是根结点 
    var nodeHTML = nodeRoot.childNodes[0]; //这个是html结点 
    var nodeBody = nodeHTML.childNodes[1]; //body结点 
    var nodeDiv = nodeBody.childNodes[0]; //DIV结点 
    var nodeText = nodeDiv.childNodes[0];//文本结点' 
    nodeText.data = strText; //文本节点有data属性,我们可以改变这个属性,也就成功的操作了DOM树中的一个结点了 

</script> 
</head> 
<body> 
<div>tutorial of DHTML and javascript programming</div> 
 <input onclick="changedivText('change?')" type="button" value="change"/> 
</body> 
</html> 


从上面的示例可以看出,我们可以用上面的这种方法操作DOM树上的任一节点。(注:1. 跨域除外,跨域通常是在操作frame上,简单的说,就是两个frame不属于同一域名。2.上面的操作为了演示,采用的方法是从根结点一直到文本结点的遍历,在DOM方法上,有更简洁的方法,这些以后会有更多示例加以说明,下文中也会有介绍)

四、DOM节点。 
   细心些的朋友也许发现了,在上面写的HTML代码时用<>与</>包函起来的就是一个结点,事实上是这样的吗?答案是否定的。下面就是说说节点类型,否则在有的时候是会犯错误的。比如,你把上面的代码放到Mozilla firefox的浏览器里运行一下,就会知道了。 
DOM中的结点类型比较多,这里写一些在HTML文档中(注:XML也是DOM树结构)常见的几种结点类型。 
1、DOCUMENT_NODE 
(document)文档根结点类型,该枚举型的值是9. 

2、ELEMENT_NODE 
(element)元素结点类型,该枚举型的值是1。上文中的html, body, div这些结点都是属于该类型。 

3、TEXT_NODE 
(text)文本结点类型,该枚举型的值是3。上文中的文本,如:tutorial of DHTML and javascript programming就是属于该类型。 
(注:一个空格也就可能是一个文本结点) 
通常更需要注意的是文本结点,有可能一个回车,一个空格都是文本结点。这一点以后会碰到,当然,我们也有办法处理,这里先不要急,以后也会说到的。 

五、DOM常用的API 
这些常用的API是要记下来的,当然在非IE的浏览器里也会有效,是符合w3c的。这些API在以后的编程中会常常用到。正如每个编程平台所提供的API一样,常用必须记下来,节省时间从而提高编程效率。只写几个最常用的,其它的API会在以后的示例中写出。由浅而深,从易到难嘛。

1、获取ELEMENT_NODE,元素节点 
1)、方法:document.getElementById(元素的Id),返回值为元素的节点引用。可以假想一下这个API的原理:象我们上面所做的是遍历每个节点(从根到我们所需结点),这个API,也可以想成是从根遍历,查询每个结点(空白结点和空结点除外),并获取该结点的id是否为指定的ID,如果是的话,就返回这个结点(注:在JS中,数组和对象是引用类型),如果没有就返回空。我们可以写写这个代码,帮助我们理解document.getElementById。下面是一个简单遍历BODY中元素的示例。 

<html> 
 <head> 
  <title>never-online's website</title> 
   <script> 

 function myGetElementById (id) { 
      var nodeRoot = document; //这个是根结点 
      var nodeHTML = nodeRoot.childNodes[0]; //这个是html结点 
      var nodeBody = nodeHTML.childNodes[1]; //body结点 
      var bodyChild = nodeBody.childNodes; //body的孩子 
      for (var i=0; i< bodyChild.length; i++) { //简单的遍历(指body的孩子下的深度为1) 
        if (bodyChild[i].id==id) return bodyChild[i]; 
      }; 
      return null; 
    } 
    function TestGetElementById (id) { 
      var node = myGetElementById(id); 
      if (node!=null) { 
        alert("找到结点 "+id+"!"); 
        alert(node.childNodes[0].data); 
      } else { 
        alert("没有找到结点 "+id+"."); 
      } 
    } 

</script> 
</head> 
<body> 
<div id="aTestNode"></div> 
<div id="textNode">tutorial of DHTML and javascript programming</div> 
<input onclick="TestGetElementById('textNode')" type="button" value="change"/> 
</body> 
</html> 


2)、属性:object.innerHTML,返回值:一个节点内的HTML值。该属性为可写属性。它虽然不是获取结点,但经常与获取结点相结合,所以我把它放在获取结点这一类,它的属性就类似于是纯文本节点属性中的data。以document.getElementById和object.innerHTML这两个API为例,

我们就可以把上面所写的代码简化一下了,示例如下: 

<html> 
<head> 
<title>never-online's website</title> 
<script> 
  function changedivText (strText) { 
    var node = document.getElementById("textNode"); 
    node.innerHTML = strText; 
  } 
</script> 
</head> 
<body> 
<div id="textNode">tutorial of DHTML and javascript programming</div> 
<input onclick="changedivText('change?')" type="button" value="change"/> 
</body> 
</html> 


3)、方法:object.getElementsByTagName(标签的名字),返回一个集合,该集合的把有元素都是有指定标签的元素。访问集合里的元素,可以用下标来访问。语法里的object,是指document(根)或者是一个ELEMENT_NODE。这个的原理示例我就不写了,可以作为一个作业,大家可以写写。这里写一些具体应用。如上例,我们还可以这样写。
<html> 
<head> 
<title>never-online's website</title> 
<script> 
 function changedivText (strText) { 
    var node = document.getElementsByTagName("DIV"); 
    node[0].innerHTML = strText; 

</script> 
</head> 
<body> 
<div>tutorial of DHTML and javascript programming</div> 
<input onclick="changedivText('change?')" type="button" value="change"/> 
</body> 
</html> 


再取一个例子,注意,BODY下的结点深度为2。
<html> 
<head> 
<title>never-online's website</title> 
<script> 
  function changedivText (strText) { 
    var node = document.getElementById("nodeTest"); 
    var myNode = node.getElementsByTagName("DIV"); 
    myNode[0].innerHTML = strText; 

</script> 
</head> 
<body> 
  <div id="nodeTest"> 
   <div>tutorial of DHTML and javascript programming</div> 
     <input onclick="changedivText('change?')" type="button" value="change"/> 
  </div> 
</body> 
</html> 


2、动态创建与插入结点 
1)、创建结点对象。document.createElement(tagname),tagname指的是一个标签,比如一个DIV,就是document.createElement("DIV"),

它返回的是这个结点的引用。 
2)、在body的尾部插入结点用document.body.appendChild(object),为了容易理解,下面这个示例,我用了IE专有的属性

object.outerHTML,得到一个该元素的HTML标签内容(包括自身),这样会更容易看到效果。
<html> 
<head> 
<title>never-online's website</title> 
<script> 
   function insertNode (strText) { 
     alert("插入元素前的body HTML: " +document.body.outerHTML); 
     var node = document.createElement("DIV"); 
     node.innerHTML = strText; 
      document.body.appendChild(node); 
      alert("插入元素后的body HTML: " +document.body.outerHTML); 

</script> 
</head> 
<body> 
 <div>tutorial of DHTML and javascript programming</div> 
 <input onclick="insertNode('change?')" type="button" value="change"/> 
</body> 
</html> 

3)、在元素处插入结点。object.insertBefore(oNewNode [, oChildNode]),oNewNode为一个我们创建的结点,oChildNode是可选的,为 object下的一个子节点。同样的,为了看到效果,我也用了outerHTML。示例 

<html> 
<head> 
<title>never-online's website</title> 
<script> 
function insertNode (strText) { 
   alert("插入元素前的body HTML: " +document.body.outerHTML); 
    var node = document.createElement("DIV"); 
    var myNode = document.getElementById("textNode"); 
    node.innerHTML = strText; 
     document.body.insertBefore(node,myNode); 
   alert("插入元素后的body HTML: " +document.body.outerHTML); 

</script> 
</head> 
<body> 
<div id="textNode">tutorial of DHTML and javascript programming</div> 
<input onclick="insertNode('change?')" type="button" value="change"/> 
</body> 
</html> 

3、移除结点。 
1) object.parentNode.removeChild(oChildNode),这个就是语法,下面看示例。

<html> 
<head> 
<title>never-online's website</title> 
<script> 
  function insertNode (strText) { 
    alert("插入元素前的body HTML: " +document.body.outerHTML); 
    var node = document.createElement("DIV"); 
    var myNode = document.getElementById("textNode"); 
    node.innerHTML = strText; 
    document.body.insertBefore(node,myNode); 
    alert("插入元素后的body HTML: " +document.body.outerHTML); 


   function removeCreateNode() { 
     alert("移除元素前的body HTML: " +document.body.outerHTML); 
     var node = document.getElementById("textNode"); 
     node.parentNode.removeChild(node); 
     alert("移除元素前的body HTML: " +document.body.outerHTML); 

</script> 
</head> 
<body> 
<div id="textNode">tutorial of DHTML and javascript programming</div> 
<input onclick="insertNode('change?')" type="button" value="insert"/> 
<input onclick="removeCreateNode()" type="button" value="remove"/> 
</body> 
</html>

parentNode和parentElement功能一样,childNodes和children功能一样。但是parentNode和childNodes是符合W3C标准的,可以说比较通用。而另外两个只是IE支持,不是标准,Firefox就不支持 
  
目录
相关文章
|
2月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
2月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
440 2
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
31 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
79 10
|
1月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
2月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
72 4
|
2月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战