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

news2024/11/26 8:55:17

在前端开发中,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操作、事件处理、异步编程等核心概念。通过理解这些概念并在实际项目中应用,读者将能够构建出更具交互性和动态性的网页应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【接口自动化测试】Postman(一) 介绍和安装

一.Postman介绍 Postman是一款非常流行的接口调试工具&#xff0c;它使用简单&#xff0c;而且功能也很强大。不仅测试人员会使用&#xff0c;开发人员也会 经常使用。 主要特点 1. 简单易用的图形用户界面 2. 可以保存接口请求的历史记录 3. 使用测试集Collections可以更…

编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载

编程的简单实例&#xff0c;编程零基础入门教程&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&…

websocket学习笔记【springboot+websocket聊天室demo】

文章目录 WebSocket是什么&#xff1f;为什么需要WebSocket?WebSocket和Http连接的区别WebSocket的工作原理基本交互过程&#xff1a; Java中的WebSocket支持WebSocket的优势springboot websocket themlef 一个聊天室demopom.xmlWebSocketConfigChatControllerWebController…

__builtin_expect(x,0)

As opposed to the C code, above we can see bar case precedes foo case. Since foo case is unlikely, and instructions of bar are pushed to the pipeline, thrashing the pipeline is unlikely. This is a good exploitation of a modern CPU

RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤

文章目录 一、嵌入式AI的学习步骤1.1、入门Linux1.2、入门AI 二、瑞芯微嵌入式AI2.1、瑞芯微的嵌入式AI关键词2.2、AI模型部署流程 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2; 本篇将给大家介绍什么是嵌入式AI。 一、嵌入…

debian 修改镜像源为阿里云【详细步骤】

文章目录 修改步骤第 1 步:安装 vim 软件第 2 步:备份源第 3 步:修改为阿里云镜像参考👉 背景:在 Docker 中安装了 jenkins 容器。查看系统,发现是 debian 11(bullseye)。 👉 目标:修改 debian bullseye 的镜像为阿里云镜像,加速软件安装。 修改步骤 第 1 步:…

Debian/Ubuntu 安装 NodeJS【详细步骤】

文章目录 NodeSource 简介Debian/Ubuntu 安装 NodeJS第 1 步:进入 jenkins 容器第 2 步:下载和导入 NodeSource第 3 步:创建 deb 仓库第 4 步:安装 NodeJS第 5 步:卸载NodeJS参考👉 背景:在 Docker 中安装了 Jenkins,Jenkins 镜像为 Debian 11 bullseye。 👉 目标:…

【工具流】WSL2安装

一些废话 最近看到了PKU出品的cs自学指南&#xff0c;想要跟着里面的自学路径学国外的优质课程&#xff0c;无奈大多数pre教程里面都是直接Linux环境下的操作&#xff0c;并且我在CSwiki看到了那个熟悉的上学期学了一点的missing-semester课。 上学期自学missing-semester的时候…

【Ubuntu】Windows访问Ubuntu时“需要认证”界面卡住

情况描述 基本情况 本地电脑&#xff1a;Microsoft Windows [版本 10.0.19045.3570] 远程电脑&#xff1a;Ubuntu 20.04.6 LTS 远程电脑安装辅助远程工具&#xff1a;xrdp 0.9.12 问题描述&#xff1a;认证页面输入密码&#xff0c;点击认证以后认证按钮不可点击&#xff0c;无…

MR外包团队:MR、XR混合现实技术应用于游戏、培训,心理咨询、教育成为一种创新的各行业MR、XR形式!

随着VR、AR、XR、MR混合现实等技术逐渐应用于游戏开发、心理咨询、培训、教育各个领域&#xff0c;为教育、培训、心理咨询等行业带来了全新的可能性。MR、XR游戏开发、心理咨询是利用虚拟现实技术模拟真实场景&#xff0c;让学生身临其境地参与学习和体验&#xff0c;从而提高…

深入探索 Django Channels

概要 随着 Web 应用的发展&#xff0c;实时功能如即时消息、实时通知等变得越来越重要。Django Channels 是 Django 的一个扩展&#xff0c;它使得在 Django 中构建实时功能变得可能。本文将深入探讨 Django Channels 的核心概念、架构以及如何实现一个实时应用。 1. Django C…

VN5620以太网测试——DoIP配置

文章目录 前言一、DoIP简介二、Vector Hardware Configuration三、Diagnostics/ISO TP Configuration四、Diagnostic Console五、添加Ethernet Packet Builder前言 CANoe(CAN open environment)VN5620 :是一个紧凑而强大的接口,用于以太网网络的分析、仿真、测试和验证。 V…

uniapp 实现微信小程序手机号一键登录

app 和 h5 手机号一键登录&#xff0c;参考文档&#xff1a;uni-app官网 以下是uniapp 实现微信小程序手机号一键登录 1、布局 <template><view class"mainContent"><image class"closeImg" click"onCloseClick"src"quic…

LeetCode(17)罗马数字转整数【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 13. 罗马数字转整数 1.题目 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

LeetCode【560】和为k的子数组

题目&#xff1a; 思路&#xff1a; 转化为前缀和问题&#xff0c;和为k&#xff0c;即为&#xff1a;前缀和差值为k的情况统计&#xff1b; 为什么要转化为前缀和呢&#xff1f;因为和为k的子数组可能有n个元素&#xff0c;但是前缀和差值为k&#xff0c;只有两个元素&#…

AdaBoost 算法:理解、实现和掌握 AdaBoost

一、介绍 Boosting 是一种集成建模技术&#xff0c;由 Freund 和 Schapire 于 1997 年首次提出。从那时起&#xff0c;Boosting 就成为解决二元分类问题的流行技术。这些算法通过将大量弱学习器转换为强学习器来提高预测能力 。 Boosting 算法背后的原理是&#xff0c;我们首先…

设计模式(4)-行为型模式

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…

spark与scala的对应版本查看

仓库地址 https://mvnrepository.com/artifact/org.apache.spark/spark-core 总结 spark3.0 以后&#xff0c;不再支持 scala2.11spark3.0 以后&#xff0c;只能用 scala2.12以上

【吞噬星空】罗峰成功抵达虬龙星,宇宙超级富二代登场,不容错过

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料《吞噬星空》93集&#xff0c;在虬龙星港口&#xff0c;当罗峰的飞船一进入&#xff0c;牵引信号就立刻响起&#xff0c;像一道无形的指引线&#xff0c;将他飞船牵引至指定的停靠区域。罗峰踏出飞船…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知&#xff0c;我们在之前介绍过 Nginx Proxy Manager&#xff08;以下简称 NPM) 这个反向代理的神器&#xff0c;对于一些 Docker 搭建的 Web 项目&#xff0c;NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站&#xff0c;小伙伴们可能不知道怎么用 NP…