从0开始学习JavaScript--JavaScript DOM操作与事件处理

在前端开发中,DOM(文档对象模型)是一个至关重要的概念,它为JavaScript提供了一种与HTML和XML文档交互的方法。本文将深入探讨DOM的概念与作用,以及JavaScript与DOM之间的密切关系。

DOM的概念与作用

DOM是什么?

DOM,全称为文档对象模型(Document Object Model),是一种表示和操作HTML、XML文档的接口。它将文档解析为一个由节点组成的树状结构,每个节点都代表文档中的一个元素、属性或文本。

DOM的作用是什么?

DOM的主要作用在于提供一种编程接口,使开发者可以通过JavaScript来操作网页的内容、结构和样式。通过DOM,我们可以动态地修改页面的元素、响应用户交互、创建新的元素等,实现页面的实时更新和交互性。

JavaScript与DOM的关系

JavaScript与DOM的关系密不可分,JavaScript通过DOM提供的接口来操作页面。以下是一些关键的连接点:

1. JavaScript是一门脚本语言:

JavaScript作为一门脚本语言,可以嵌入HTML文档中,并在浏览器中执行。它通过DOM来访问和操作文档的内容。

2. DOM作为JavaScript的接口:

DOM提供了一组接口,这些接口允许JavaScript通过文档的树状结构进行操作。通过这些接口,JavaScript可以选取元素、修改元素内容、添加或删除元素,以及响应用户的交互。

3. 动态更新页面:

JavaScript和DOM的结合使得我们能够在页面加载后动态地更新内容,而不需要刷新整个页面。这种动态性使得现代网页更加灵活和富有交互性。

DOM基础操作

在JavaScript中,DOM基础操作是前端开发中的关键部分。通过这些操作,我们能够选取特定的元素,操作元素的内容和属性,实现对页面的动态控制。

1 选取元素

在DOM中,选取元素是常见且基础的操作,有多种方式可以实现:

通过ID选取元素:

let elementById = document.getElementById("myElementId");

通过类名选取元素:

let elementsByClassName = document.getElementsByClassName("myClassName");

通过标签名选取元素:

let elementsByTagName = document.getElementsByTagName("div");

通过选择器选取元素(querySelector):

let elementBySelector = document.querySelector("#myElementId .myClassName");

2 操作元素内容

操作元素的内容是动态更新页面的重要一环,涉及到读取和修改文本内容以及读取和修改HTML内容:

读取和修改文本内容:

let element = document.getElementById("myElementId");

// 读取文本内容
let textContent = element.textContent;

// 修改文本内容
element.textContent = "New Text Content";

读取和修改HTML内容:

let element = document.getElementById("myElementId");

// 读取HTML内容
let innerHTML = element.innerHTML;

// 修改HTML内容
element.innerHTML = "<strong>New HTML Content</strong>";

3 操作元素属性

元素的属性操作涉及到获取和设置元素的属性:

获取元素属性:

let element = document.getElementById("myElementId");

// 获取元素属性
let attributeName = element.getAttribute("src");

设置元素属性:

let element = document.getElementById("myElementId");

// 设置元素属性
element.setAttribute("src", "new-source.jpg");

DOM节点操作

DOM节点操作是在JavaScript中进行动态页面构建和修改的重要环节。通过创建、删除、替换节点,我们能够实现对DOM树的精细控制。

1 创建新节点

创建新节点是构建动态页面的基础,主要包括创建元素节点、创建文本节点以及将新节点插入到DOM中:

创建元素节点:

// 创建一个新的段落元素
let newParagraph = document.createElement("p");

创建文本节点:

// 创建包含文本内容的文本节点
let newText = document.createTextNode("This is a new text node.");

插入新节点到DOM中:

// 将新段落元素添加到body中
document.body.appendChild(newParagraph);

// 将文本节点添加到新段落元素中
newParagraph.appendChild(newText);

2 删除节点

删除节点是在页面动态更新时常见的操作,主要包括删除元素节点和删除子节点:

删除元素节点:

// 获取要删除的元素
let elementToRemove = document.getElementById("elementId");

// 删除元素
elementToRemove.parentNode.removeChild(elementToRemove);

删除子节点:

// 获取要删除的父元素
let parentElement = document.getElementById("parentElementId");

// 删除第一个子节点
parentElement.removeChild(parentElement.firstChild);

3 替换节点

替换节点可以实现在DOM中进行动态的内容切换,主要包括替换元素节点和克隆节点:

替换元素节点:

// 创建一个新的div元素
let newDiv = document.createElement("div");

// 获取要替换的旧元素
let oldElement = document.getElementById("oldElementId");

// 替换元素
oldElement.parentNode.replaceChild(newDiv, oldElement);

克隆节点:

// 获取要克隆的节点
let originalNode = document.getElementById("originalNodeId");

// 克隆节点(参数为true表示深度克隆,包括所有子节点)
let clonedNode = originalNode.cloneNode(true);

事件处理

在前端开发中,事件处理是实现用户交互和页面响应的核心部分。本章将深入探讨事件的概念、常见事件类型、事件对象以及如何通过JavaScript进行事件监听和处理。

1 事件概述

常见事件类型:

在DOM中,有许多不同类型的事件,常见的包括点击事件(click)、鼠标悬停事件(mouseover)、表单提交事件(submit)等。每个事件都对应着用户在页面上的一种操作。

事件对象:

当事件发生时,浏览器会创建一个事件对象,其中包含有关事件的信息,例如触发事件的元素、鼠标位置等。通过事件对象,我们可以更灵活地处理和响应事件。

2 事件监听

使用addEventListener绑定事件:

let myElement = document.getElementById("myElementId");

// 添加点击事件监听器
myElement.addEventListener("click", function(event) {
  console.log("Element clicked!");
  console.log("Mouse coordinates: ", event.clientX, event.clientY);
});

事件冒泡与捕获:

事件在DOM中传播的过程分为冒泡阶段和捕获阶段。通过addEventListener的第三个参数,可以指定事件在捕获阶段(true)还是冒泡阶段(false,默认)被处理。

// 在捕获阶段处理事件
myElement.addEventListener("click", function(event) {
  console.log("Capture phase: Element clicked!");
}, true);

// 在冒泡阶段处理事件
myElement.addEventListener("click", function(event) {
  console.log("Bubble phase: Element clicked!");
});

3 事件处理函数

内联事件处理:

在HTML标签中直接添加事件处理函数:

<button onclick="myFunction()">Click me</button>

外部事件处理函数:

在JavaScript中定义事件处理函数,并在HTML或通过脚本绑定:

function myFunction() {
  console.log("Button clicked!");
}

let myButton = document.getElementById("myButtonId");
myButton.addEventListener("click", myFunction);

实例演练

在这一节中,我们将通过实际的例子演示如何动态创建交互性元素,并制作一个简单的交互性页面。我们将创建按钮和表单元素,然后使用按钮触发事件,以及处理表单提交事件。

1 动态创建交互性元素

创建按钮:

// 获取父元素
let container = document.getElementById("container");

// 创建按钮元素
let button = document.createElement("button");
button.textContent = "Click me";

// 将按钮添加到父元素中
container.appendChild(button);

创建表单元素:

// 获取父元素
let container = document.getElementById("container");

// 创建表单元素
let form = document.createElement("form");

// 创建输入框元素
let input = document.createElement("input");
input.type = "text";
input.placeholder = "Enter text";

// 创建提交按钮
let submitButton = document.createElement("button");
submitButton.type = "submit";
submitButton.textContent = "Submit";

// 将输入框和提交按钮添加到表单中
form.appendChild(input);
form.appendChild(submitButton);

// 将表单添加到父元素中
container.appendChild(form);

2 制作简单的交互性页面

通过按钮触发事件:

// 获取按钮元素
let button = document.querySelector("button");

// 添加点击事件监听器
button.addEventListener("click", function() {
  console.log("Button clicked!");
});

表单提交事件处理:

// 获取表单元素
let form = document.querySelector("form");

// 添加表单提交事件监听器
form.addEventListener("submit", function(event) {
  // 阻止表单默认提交行为
  event.preventDefault();

  // 获取输入框的值
  let inputValue = input.value;

  // 处理表单提交逻辑
  console.log("Form submitted with value: ", inputValue);
});

深入理解异步操作与事件循环

在前端开发中,异步操作与事件循环是处理用户交互、网络请求以及定时任务的关键概念。本章将深入探讨setTimeout与setInterval的使用,模拟异步操作,以及事件循环的工作原理。

1 setTimeout与setInterval的使用

setTimeout的使用:

// 延迟执行一段代码
setTimeout(function() {
  console.log("Delayed execution after 2000 milliseconds");
}, 2000);

setInterval的使用:

// 每隔一段时间执行一次代码
let counter = 0;
let intervalId = setInterval(function() {
  console.log("Interval execution: Count = " + counter);
  counter++;

  if (counter === 5) {
    clearInterval(intervalId); // 清除定时器
  }
}, 1000);

2 异步操作的模拟

在JavaScript中,异步操作常常涉及到回调函数、Promise对象和async/await。以下是一个简单的模拟异步操作的例子:

// 模拟异步操作,1秒后返回结果
function simulateAsyncOperation() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("Async operation completed");
    }, 1000);
  });
}

// 使用async/await调用异步操作
async function runAsyncOperation() {
  console.log("Start async operation");

  let result = await simulateAsyncOperation();

  console.log("Async operation result: ", result);
}

runAsyncOperation();

3 事件循环的工作原理

在JavaScript中,事件循环(Event Loop)是实现异步操作的核心机制。简单来说,事件循环不断地检查消息队列是否有待处理的任务,然后执行这些任务。

console.log("Start script");

// 宏任务1
setTimeout(function() {
  console.log("Timeout 1");
}, 0);

// 微任务1
Promise.resolve().then(function() {
  console.log("Promise 1");
});

// 微任务2
Promise.resolve().then(function() {
  console.log("Promise 2");
});

console.log("End script");

在这个例子中,宏任务包括setTimeout中的回调函数,微任务则是Promise中的回调函数。事件循环会先执行所有的微任务,然后再执行宏任务。这种机制确保了异步操作的顺序执行。

总结

在本文中,分享了JavaScript中DOM操作与事件处理的重要概念和实践方法。首先,了解了DOM的基础,包括选取元素、操作元素内容和属性,以及节点的创建、删除、替换等基础操作。通过这些操作,能够在JavaScript中实现对页面结构的灵活控制。

随后,深入研究了事件处理,包括事件的概念、常见事件类型、事件对象以及事件监听与处理函数的应用。通过实例演练,展示了如何动态创建交互性元素,并在页面中实现简单的交互逻辑,如按钮点击事件和表单提交事件的处理。

进一步地,深入理解了异步操作与事件循环的机制,包括setTimeout与setInterval的使用、模拟异步操作以及事件循环的工作原理。这些知识有助于处理页面中的异步需求,提高用户体验。

综合而言,本文为大家提供了一个全面的JavaScript前端开发入门指南,涵盖了DOM操作、事件处理、异步编程等核心概念。通过理解这些概念并在实际项目中应用,读者将能够构建出更具交互性和动态性的网页应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vite 启动默认只能访问localhost解决方法

事情的经过是因为我需要测试本地项目的接口,然后因为burp默认不抓取localhost,127.0.0.1 .而且我也不想去修改burp. 所以我通过本地IP地址访问项目, 发现项目无法访问。 默认启动 所以特此记录一下。 在本地项目的package.json 中需要运行的脚本后 添加 --host即可。 具体如下…

IIs部署发布vue项目测试环境

打开【控制面板 > 程序>启用或关闭Windows功能 】 1、安装IIS: 把这些勾选上&#xff0c;点击确定下载。 2、安装.net: 把这些勾选上&#xff0c;点击确定下载。 3、搜索IIs打开&#xff1a; 4、右击【网站>添加网站 】进行配置&#xff0c;点击确定。 4、右击[项目le…

DRF纯净版项目搭建和配置

一、安装模块和项目 1.安装模块 pip install django pip install djangorestframework pip install django-redis # 按需安装 2.开启项目和api (venv) PS D:\pythonProject\env_api> django-admin startproject drf . (venv) PS D:\pythonProject\env_api> python ma…

YOLOv8改进 | DAttention (DAT)注意力机制实现极限涨点

论文地址&#xff1a; DAT论文地址 官方地址&#xff1a;官方代码的地址 代码地址&#xff1a;文末有修改了官方代码BUG的代码块复制粘贴即可 一、本文介绍 本文给大家带来的是YOLOv8改进DAT(Vision Transformer with Deformable Attention)的教程&#xff0c;其发布于2022…

使用 Python进行量化交易:前向验证分析

运行环境&#xff1a;Google Colab 1. 利用 yfinance 下载数据 import yfinance as yfticker AAPL df yf.download(ticker) df下载苹果的股票数据 df df.loc[2018-01-01:].copy()dfdf[change_tomorrow] df[Adj Close].pct_change(-1) df.change_tomorrow df.change_tom…

YOLOv8中训练参数中文解释

预测函数&#xff1a; from ultralytics import YOLO# Load a model model YOLO(yolov8n.pt) # Train the model model.train(datarD:\yolov8\ultralytics-main\data1.yaml, workers0, epochs100, batch16) 可选参数&#xff1a;

el-table树形数据隐藏子选择框

0 效果 1 代码 type是table数据中用来区分一级和二级的标识 // 隐藏子合同选择框 cellNone(row) {if (row.row.type 3 || row.row.type 4) {return "checkNone";} }, <style lang"scss" scoped>::v-deep {.checkNone .el-checkbox__input {displa…

数据结构与算法设计分析——常用搜索算法

目录 一、穷举搜索二、图的遍历算法&#xff08;一&#xff09;深度优先搜索&#xff08;DFS&#xff09;&#xff08;二&#xff09;广度优先搜索&#xff08;BFS&#xff09; 三、回溯法&#xff08;一&#xff09;回溯法的定义&#xff08;二&#xff09;回溯法的应用 四、分…

轻量级 Java 日志组件

日志记录功能在开发中很常用&#xff0c;不仅可以记录程序运行的细节&#xff0c;方便调试&#xff0c;也可以记录用户的行为&#xff0c;是框架中不可或缺的组件。为最大程度复用现有的组件&#xff0c;我们就地取材使用了 JDK 自带的 JUL&#xff08;java.util.logging&#…

学习模拟简明教程【Learning to simulate】

深度神经网络是一项令人惊叹的技术。 有了足够的标记数据&#xff0c;他们可以学习为图像和声音等高维输入生成非常准确的分类器。 近年来&#xff0c;机器学习社区已经能够成功解决诸如对象分类、图像中对象检测和图像分割等问题。 上述声明中的加黑字体警告是有足够的标记数…

手把手教你用C语言写出“走迷宫”小游戏(能看懂文字就会自己敲系列)

目录 设计迷宫地图 设计主角——小球 完整代码 这次教大家编写一个简单的“走迷宫”小游戏&#xff0c;我们可以通过键盘上的‘W’、‘S’、‘A’、‘D’四个键来控制一个“小球”向上&#xff0c;下&#xff0c;左&#xff0c;右移动&#xff0c;目的就是让这个“小球”从起…

Python3语法总结-数据转换②

Python3语法总结-数据转换② Python3语法总结二.Python数据类型转换隐式类型转换显示类型转换 Python3语法总结 二.Python数据类型转换 有时候我们&#xff0c;需要对数据内置的类型进行转换&#xff0c;数据类型的转换。 Python 数据类型转换可以分为两种&#xff1a; 隐式类…

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列4

文章目录 原型网络进行分类的基本流程一、原始代码---计算欧氏距离&#xff0c;设计原型网络&#xff08;计算原型开始训练&#xff09;二、每一行代码的详细解释总结 原型网络进行分类的基本流程 利用原型网络进行分类&#xff0c;基本流程如下&#xff1a; 1.对于每一个样本…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(十):有损传输线在时域中的表现

如果高频衰减大于低频衰减&#xff0c;随着信号传输&#xff0c;上升时间将会增加。上升时间通常定义为边沿在最终值的 10% 到 90% 之间过渡的时间。这假设信号的边缘轮廓看起来有点高斯分布&#xff0c;中间是最快的斜率区域。对于该波形&#xff0c;10%−90% 的上升时间是有意…

MIB 6.1810实验Xv6 and Unix utilities(4)primes

难度: hard/moderate Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and the surrounding text. This idea is due to Doug McIlroy, inventor of Unix pipes. Your solution should be in …

让你的Mac体验更便捷,快速启动工具Application Wizard为你助力!

亲爱的Mac用户们&#xff0c;你是否经常感到在繁琐的软件启动过程中浪费了太多时间&#xff1f;你是否希望能够以更快的速度找到并启动你所需的应用程序&#xff1f;如果是的话&#xff0c;那么不要犹豫&#xff0c;让我们来介绍一款强大的软件快速启动工具——Application Wiz…

23年宁波职教中心CTF竞赛-决赛

Web 拳拳组合 进去页面之后查看源码&#xff0c;发现一段注释&#xff0c;写着小明喜欢10的幂次方&#xff0c;那就是10、100、1000、10000 返回页面&#xff0c;在点击红色叉叉的时候抓包&#xff0c;修改count的值为10、100、1000、10000 然后分别获得以下信息 ?count1…

Spring面试题:(八)Spring事务

Spring事务概述 Spring事务基于数据库&#xff0c;基于数据库的事务封装了统一的接口。 编程式事务和声明式事务。 声明式事务分为Xml声明式或者注解声明式 实现事务相关的三个类 事务管理器 事务定义 事务状态 XML声明式事务的使用方法 导入坐标配置目标类配置切面 导入…

JS判断是否存在某个元素(includes、indexOf、find、findeIndex、some)(every 数组内所有值是否相同)

方法一&#xff1a;array.includes(searcElement[,fromIndex]) 此方法判断数组中是否存在某个值&#xff0c;如果存在返回true&#xff0c;否则返回false。 searchElement&#xff1a;需要查找的元素&#xff0c;必选。fromIndex&#xff1a;可选&#xff0c;从该索引处开始查…

浏览器页面被恶意控制时的解决方法

解决360流氓软件控制浏览器页面 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、接受360安全卫士的好意&#xff08;尽量不要选&#xff09;二、拒绝360安全卫士的好意&#xff08;强烈推荐&#xff09;第…