带你彻底学会JS DOM技术之获取元素

简介: 1.DOM概述DOM对象DOM,全称是“Document Object Model(文档对象模型)”,它是由W3C定义的一个标准。在实际开发中,我们有时候需要实现这样的效果:鼠标移到元素上改变元素的颜色,或者动态添加新元素及删除元素等。这些效果就是通过DOM提供的方法来实现的。简单地说,DOM里面有很多方法,我们可以通过它提供的方法来操作一个页面中的某个元素,如改变这个元素的颜色、点击这个元素实现某些效果、直接把这个元素删除等。DOM结构DOM采用的是“树形结构”,用“树节点”的形式来表示页面中的每一个元素。我们先看下面的一个例子。


1.DOM概述


DOM对象


DOM,全称是“Document Object Model(文档对象模型)”,它是由W3C定义的一个标准。


在实际开发中,我们有时候需要实现这样的效果:鼠标移到元素上改变元素的颜色,或者动态添加新元素及删除元素等。这些效果就是通过DOM提供的方法来实现的。


简单地说,DOM里面有很多方法,我们可以通过它提供的方法来操作一个页面中的某个元素,如改变这个元素的颜色、点击这个元素实现某些效果、直接把这个元素删除等。


DOM结构


DOM采用的是“树形结构”,用“树节点”的形式来表示页面中的每一个元素。我们先看下面的一个例子。


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
<body>
    <h1>xxx</h1>
    <p>yyy</p>
    <p>zzz</p>
</body>
</html>


对于上面这个HTML文档,DOM会将其解析为如图所示的树形结构:


8b1b6eda8fec4907bd13b32fec317e75.png


我们在操作元素时,其实就是把这个元素看成一个对象,然后使用这个对象的属性和方法来进行相关操作😊


2.节点类型


在JavaScript中,节点分为很多种类型。DOM节点共有12种类型,但是常见的只有下面3种


元素节点。属性节点。文本节点。


3ada69c68061486abe283a6034caaebc.png


在JavaScript中,我们可以使用nodeType属性来判断一个节点的类型。不同节点的no


3836693dbab74282ba751fd70f5c35f3.png


deType属性值如下:


对于节点类型,我们需要注意以下几点内容:🍟


  • 一个元素就是一个节点,这个节点称为“元素节点”。
  • 属性节点和文本节点看起来像是元素节点的一部分,但实际上,它们是独立的节点,并不属于元素节点。
  • 只有元素节点才可以拥有子节点,属性节点和文本节点都无法拥有子节点。


3.获取元素


在JavaScript中,我们可以通过以下6种方式来获取指定元素:


getElementById()

getElementsByTagName()

getElementsByClassName()

querySelector()和querySelectorAll()

getElementsByName()

document.title和document.body


getElementById


在JavaScript中,如果想通过id来选中元素,我们可以使用getElementById()方法来实现


实例:


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>IMUSTCTF</title>
  <script src="js/index.js"></script>
</head>
<body>
  <div id="baddiv">KAKA</div>
</body>
</html>


// 在整个页面加载完成后执行的代码块
window.onload=function() {
  var oDiv = document.getElementById("baddiv");
  oDiv.style.color = "blue";
}


getElementById()获取的是一个DOM对象,我们在给变量命名的时候,习惯性地以英文“o”开头,以便跟其他变量区分开,这可以让我们一眼就看出这是一个DOM对象🍟


getElementsByTagName


在JavaScript中,如果想通过标签名来选中元素,我们可以使用getElementsByTagName()方法来实现


实例:


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>IMUSTCTF</title>
  <script src="js/index.js"></script>
</head>
<body>
  <ul id="list">
    <li>HTML</li>
    <li>CSS</li>
    <li>JS</li>
    <li>VUE</li>
  </ul>
</body>
</html>


window.onload=function() {
  var oUl = document.getElementById("list");
  var oLi = oUl.getElementsByTagName("li");
  oLi[2].style.color = "red";
}


7a19064b50784f89b9179a051872e946.png


首先使用getElementById()方法获取id为list的ul元素,然后使用getElementsByTagName()方法获取该ul元素下的所有li元素


oLi[0]表示获取第1个li元素,oLi[1]表示获取第2个li元素,……,以此类推


document.getElementsByTagName("li")获取的是“整个HTML页面”所有的li元素,而oUl.getElementsByTagName(“li”)获取的仅仅是“id为list的ul元素”下所有的li元素


getElementById()和getElementsByTagName()区别


getElementsByTagName()可以操作动态创建的DOM🙌


window.onload=function() {
  document.body.innerHTML="<input type='button' value='按钮' />";
  var oBtn = document.getElementsByTagName("input");
  oBtn[0].onclick = function() {
    alert(oBtn.length);
  }
}


点击按钮后会弹出一个网页对话框,显示1


db738a7e576a45eb9e1b514e635bec21.png


getElementById()不可以操作动态创建的DOM🎶


window.onload=function() {
  document.body.innerHTML="<input id='btn' type='button' value='按钮' />";
  var oBtn = document.getElementById("btn");
  oBtn.onclick = function() {
    alert(oBtn.length);
  }
}


此时将无法显示元素的个数:

9f4e6c6b2b4b46cba0c4d420a6ab0f53.png


getElementsByClassName


在JavaScript中,如果想通过class来选中元素,我们可以使用getElementsByClassName()方法来实现


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>IMUSTCTF</title>
  <script src="js/index.js"></script>
</head>
<body>
  <ul>
    <li>HTML</li>
    <li class="select">CSS</li>
    <li class="select">JS</li>
  </ul>
</body>
</html>


window.onload=function() {
  var oLi = document.getElementsByClassName("select");
  oLi[0].style.color = "red";
}


浏览器显示效果如下:


fae7da9875f4463ab82faabdf0771b63.png


getElementsByClassName()不能操作动态DOM😒


querySelector()和querySelectorAll()


JavaScript新增了两个方法:querySelector()和querySelectorAll(),这让我们可以使用CSS选择器的语法来获取所需要的元素


querySelector()表示选取满足选择条件的第1个元素,querySelectorAll()表示选取满足条件的所有元素


案例演示:


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>IMUSTCTF</title>
  <script src="js/index.js"></script>
</head>
<body>
  <ul>
    <li>HTML</li>
    <li class="select">CSS</li>
    <li class="select">JS</li>
  </ul>
</body>
</html>
window.onload=function() {
  var oLi = document.querySelectorAll(".select");
  oLi[1].style.color = "red";
}


3f3eca6656664be6aba2e271fedf350e.png


getElementsByName


对于表单元素来说,它有一个一般元素都没有的name属性。如果想要通过name属性来获取表单元素,我们可以使用getElementsByName()方法来实现

案例:


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>IMUSTCTF</title>
  <script src="js/index.js"></script>
</head>
<body>
  你最爱的语言:
  <label><input type="radio" name="lan" value="C++"></label>
  <label><input type="radio" name="lan" value="Go"></label>
  <label><input type="radio" name="lan" value="Java"></label>
</body>
</html>


window.onload=function() {
  var oInput = document.getElementsByName("lan");
  oInput[2].checked = true;
}


e8f61ea44b87430b8c6bb190e1718aa7.png


document.title和document.body


由于一个页面只有一个title元素和一个body元素,因此对于这两个元素的选取,JavaScript专门提供了两个非常方便的方法:document.title和document.body

例如:


window.onload=function() {
  document.title = "你好啊";
  document.body.innerHTML = "<div>我的世界</div>"
}



目录
相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
75 1
|
3月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
4天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
29 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
3月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
88 5
|
3月前
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
3月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
59 0
|
3月前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
60 1

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    47
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 3
    Node.js 中实现多任务下载的并发控制策略
    34
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    57