【JavaScript】DOM和事件简介和文档加载流程以及DOM查询(上)案例(附源码)

简介: 文章目录什么是DOM?节点(Node)查找节点什么是事件?事件绑定在html节点中绑定在js中绑定常见的html事件文档的加载给window绑定onload事件DOM查询innerHTML 属性获取元素节点案例一案例二

什么是DOM?

JS中通过DOM来对HTML文档进行操作。只要理解了DOM就可以随心所欲的操作WEB页面。

DOM,全称Document Object Model文档对象模型。


文档

文档表示的就是整个的HTML网页文档对象

对象

表示将网页中的每一个部分都转换为了一个对象。

模型

使用模型来表示对象之间的关系,这样方便我们获取对象。

DOM中的模型如图所示,我们只需要知道某一个节点即可找到任意其他节点。


image.png

节点(Node)

节点,是构成我们网页的最基本的组成部分,网页中的每一个部分都可以称为是一个节点。比如: html标签、属性、文本、注释、整个文档等都是一个节点。虽然都是节点,但是实际上他们的具体类型是不同的。比如∶标签我们称为元素节点、属性称为属性节点、文本称为文本节点、文档称为文档节点。节点的类型不同,属性和方法也都不尽相同。


文档节点:整个HTML文档

元素节点:HTML文档中的HTML标签

属性节点:元素的属性

文本节点:HTML标签中的文本内容

image.png

查找节点

浏览器已经为我们提供文档节点对象,这个对象是window属性可以在页面中直接使用,文档节点代表的是整个网页。即document

例子:

给按钮一个id属性

<button id="bt1">按钮</button>

通过id查找按钮

document.getElementById('bt1');

什么是事件?

事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。JavaScript 与HTML之间的交互是通过事件实现的。对于Web应用来说,有下面这些代表性的事件:


点击某个元素

将鼠标移动至某个元素上方

按下键盘上某个键,等等。

事件绑定

在html节点中绑定

我们可以在事件对应的属性中设置一些js代码,这样当事件被触发时,这些代码将会执行。

<button id="bt1" onclick="alert('点我干啥?')">按钮</button>

这种写法我们称为结构和行为据合,不方便维护,不推荐使用。

在js中绑定

可以为按钮的对应事件绑定处理函数的形式来响应事件这样当事件被触发时,其对应的函数将会被调用。

<button id="bt1">按钮</button>
//通过文档对象查找按钮节点
var bt = document.getElementById('bt1');
//绑定单击事件
bt.onclick = function(){
   alert('点我干嘛?')
}

image.png

image.png

更多html事件请看此文档说明!


文档的加载

在上面的例子中将script标签写在按钮页面下部是为了让页面加载好之后在执行js代码。

浏览器在加载一个页面时,是按照自上向下的顺序加载的,读取到一行就运行一行,如果将script标签写到页面的上边,在代码执行时,页面还没有加载。因此就无法执行相应事件。


那么当我们想吧js代码写在上方时,又怎样来实现同样的效果呢?


给window绑定onload事件

onload事件会在整个页面加载完成后执行


该事件对应的响应函数将会在页面加载完成之后执行,这样可以确保我们的代码执行时所有的DOM对象已经加载完毕

实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            var even = document.getElementById('bt1');
            even.onclick = function(){
                alert('点我干嘛??')
            }
        }
    </script>
</head>
<body>
    <button id="bt1">按钮</button>
</body>
</html>

DOM查询

innerHTML 属性

获取元素内容最简单的方法是使用 innerHTML 属性。

innerHTML属性可用于获取或替换 HTML 元素的内容。

innerHTML属性可用于获取或改变任何 HTML 元素,包括 <html> 和 <body>。

获取元素节点

通过document对象调用

getElementByld()

通过id属性获取一个元素节点对象

getElementsByTagName()

使用该方法获取元素时返回的是一个类数组对象。

通过标签名获取一组元素节点对象

getElementsByName()

使用该方法获取元素时返回的也是一个类数组对象。

通过name属性获取一组元素节点对象

注意:在获取input标签中的值时,因为没有结束标签,因此不能使用innerHTML来获取标签内容,需通过属性名来获取,即元素.属性名

例子:元素.id ,元素.name,元素.value

注意:class属性不能采用这种方式,读取class属性时需要使用元素.className

案例一

eecc700faa0b4784a32939986e50b800.gif

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            //为id=bt1的按钮绑定事件调用函数
            document.getElementById('bt1').onclick = function(){
                //获取id为li1的节点
                var li1 = document.getElementById('li1');
                alert(li1.innerHTML);
            }
            //为id=bt2的按钮绑定事件调用函数
            document.getElementById('bt2').onclick = function(){
                //获取所有li
                var lis = document.getElementsByTagName('li');
                for(var i = 0;i<lis.length;i++){
                    alert(lis[i].innerHTML)
                }
            }
            //为id=bt3的按钮绑定事件调用函数
            document.getElementById('bt3').onclick = function(){
                //获取name=gender的节点
                var genders = document.getElementsByName('gender')
                for(var i = 0;i<genders.length;i++){
                    alert(genders[i].value)
                }
            }
        }
    </script>
    <style>
        .d1{
            display: inline-block;
            margin-left: 100px;
            margin-top: 100px;
            background-color: lightblue;
        }
        .d1>ol>li{
            display: inline-block;
            background-color: antiquewhite;
        }
        .d2{
            display:inline-block;
            position:absolute;
            margin-left: 50px;
            margin-top: 100px;
        }
        .d2>button{
            display: block;
        }
    </style>
</head>
<body>
    <div class="d1">
        <p>端游列表</p>
        <ol>
            <li id="li1">英雄联盟</li>
            <li>QQ飞车</li>
            <li>魔兽争霸</li>
            <li>地下城</li>
        </ol>
        <p>手游列表</p>
        <ol>
            <li>原神</li>
            <li>王者荣耀</li>
            <li>qq飞车手游</li>
        </ol>
        <span>性别:</span>
        男<input type="radio" name="gender" value="男">
        女<input type="radio" name="gender" value="女">
    </div>
    <div class="d2">
        <button id="bt1">获取id为li1的节点 </button>
        <button id="bt2">获取所有li</button>
        <button id="bt3">获取name=gender所有节点</button>
    </div>
</body>
</html>

案例二

05a9251a9e1647d2a0e2d5d6a9e1dcda.gif

源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        var imgArr = ["../img/1.jpg" ,"../img/2.jpg" ,"../img/3.jpg" ,"../img/4.jpg" ,"../img/5.jpg"]
        var index = 0;
        window.onload = function(){
        //给上一张按钮绑定单击事件
        document.getElementById('bt1').onclick = function(){
            //获取img节点
            var img1 = document.getElementsByTagName('img')[0];
            index --;
            if(index < 0){
                index = imgArr.length-1;
            }
            img1.src = imgArr[index];
            //获取p标签节点
            var p = document.getElementById('info');
            p.innerHTML = '总共'+imgArr.length+'张图片,当前第'+(index+1)+'张'
        }
        //给下一张按钮绑定单击事件
        document.getElementById('bt2').onclick = function(){
            //获取img节点
            var img2 = document.getElementsByTagName('img')[0];
            index ++;
            if(index > imgArr.length-1){
                index = 0;
            }
            img2.src = imgArr[index];
            //获取p标签节点
            var p = document.getElementById('info');
            p.innerHTML = '总共'+imgArr.length+'张图片,当前第'+(index+1)+'张'
        }
        }
    </script>
    <style>
        *{
            margin: 0%;
            padding: 0%;
        }
        #d1{
            padding: 10px;
            margin: 50px auto;
            width: 500px;
            background-color: wheat;
            text-align: center;
        }
        img{
            width: 500px;
            height: 300px;
        }
    </style>
</head>
<body>
    <div id="d1">
        <p id="info">总共5张图片,当前第1张</p>
        <img src="../img/1.jpg" alt="原神图片">
        <button id="bt1">上一张</button>
        <button id="bt2">下一张</button>
    </div>
</body>
</html>

里我们实现了dom查询的一个小案例,下期继续更新DOM查询,欢迎订阅本专栏,持续更新中…


相关文章
|
Linux Anolis
性能优化特性之:EXT4 Fast Commit
本文介绍了倚天实例上进行IO优化的特性:Fast Commit,并对其优化原理、使用方法进行了详细阐述
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
12月前
|
人工智能 自然语言处理 API
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
Mathtutor on Groq 是一款基于 Groq 架构的 AI 数学辅导工具,支持语音输入数学问题,实时计算并渲染解题过程,适用于代数、微积分等领域的学习和教学辅助。
834 5
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
|
监控 负载均衡 网络协议
OSPF在大型网络中的应用:高效路由与可扩展性
OSPF在大型网络中的应用:高效路由与可扩展性
812 1
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
663 0
|
API PHP 数据库
PHP中的异常处理机制深度解析与最佳实践####
本文深入探讨了PHP中异常处理机制的核心概念、工作原理及其在现代Web开发中的应用。通过剖析try-catch结构、自定义异常类及异常的继承体系,揭示了如何高效地捕获、处理并管理运行时错误,以提升应用的稳定性和用户体验。文章还结合实例,分享了在实际项目中实施异常处理的最佳实践,帮助开发者构建更加健壮的PHP应用程序。 ####
|
缓存 NoSQL 中间件
应对数据库不断膨胀的数据:缓存和队列中间件
【6月更文挑战第5天】该文探讨了优化数据库使用以提升应用系统性能的策略。文中建议利用Redis缓存和MQ消息队列作为辅助工具,以进一步优化性能和减少资源消耗。
490 2
应对数据库不断膨胀的数据:缓存和队列中间件
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
530 0
|
存储 分布式计算 DataWorks
DataWorks产品使用合集之如何引用第三方库
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
存储 网络协议 安全
详解TCP报文格式以及TCP相关特性
详解TCP报文格式以及TCP相关特性
859 2