内容接上回:JavaScript基础大总结(一)【必看】-优快云博客
DOM概述
DOM是HTML和XML文档的编程接口,提供了一种方式,使JavaScript能够访问和操作文档的元素、属性和内容。
选择DOM元素
-
getElementById():通过元素的ID选择元素。
let header = document.getElementById("header");
-
getElementsByClassName():通过元素的类名选择元素集合。
let boxes = document.getElementsByClassName("box");
-
getElementsByTagName():通过标签名选择元素集合。
let divs = document.getElementsByTagName("div");
-
querySelector():使用CSS选择器选择第一个匹配的元素。
let firstParagraph = document.querySelector("p");
-
querySelectorAll():使用CSS选择器选择所有匹配的元素集合。
let paragraphs = document.querySelectorAll("p");
修改DOM元素的样式
-
直接设置样式:
let element = document.getElementById("myElement"); element.style.color = "red"; element.style.fontSize = "16px";
-
修改CSS类:
element.classList.add("new-class"); element.classList.remove("old-class"); element.classList.toggle("active");
修改DOM元素的属性
-
设置或获取属性值:
let link = document.getElementById("myLink"); link.href = "https://www.example.com"; let currentHref = link.href;
-
属性操作:
let image = document.getElementById("myImage"); image.src = "new-image.jpg"; // 修改图片源 image.alt = "New image description"; // 修改图片描述
创建和删除DOM元素
-
创建新元素:
let newElement = document.createElement("div");
-
添加和删除类:
newElement.classList.add("my-class");
-
设置属性:
newElement.id = "newDiv";
-
添加文本内容:
newElement.textContent = "Hello, World!";
-
添加子元素:
let parentElement = document.getElementById("parent"); parentElement.appendChild(newElement);
-
删除元素:
let elementToRemove = document.getElementById("removeMe"); elementToRemove.parentNode.removeChild(elementToRemove);
事件监听
-
添加事件监听器:
element.addEventListener("click", function() { console.log("Element clicked!"); });
JavaScript事件处理
事件的基本概念
- 事件:用户操作或浏览器行为触发的事件。
- 事件类型:如
click
、mouseover
、keydown
等。 - 事件冒泡:事件从子元素向父元素传播的过程。
事件监听器
事件监听器用于指定当特定事件发生时应该执行的函数。
-
添加事件监听器
- 使用
addEventListener
方法添加事件监听器。element.addEventListener('click', function() { console.log('Button clicked!'); });
- 使用
-
移除事件监听器
- 使用
removeEventListener
方法移除事件监听器。element.removeEventListener('click', handleClick);
- 使用
-
事件处理属性
- 使用元素的
onclick
等属性添加事件监听器。<button onclick="handleClick()">Click me</button>
- 使用元素的
事件对象
每次事件被触发时,都会创建一个事件对象,它包含了事件的详细信息和方法。
-
事件对象的属性
type
:事件类型。target
:触发事件的元素。bubbles
:事件是否冒泡。
-
阻止事件传播
- 使用
event.stopPropagation()
阻止事件继续传播。function handleClick(event) { event.stopPropagation(); }
- 使用
-
阻止默认行为
- 使用
event.preventDefault()
阻止事件的默认行为。function handleLinkClick(event) { event.preventDefault(); console.log('Link clicked, but default action prevented.'); }
- 使用
-
事件委托
- 利用事件冒泡原理,通过父元素监听多个子元素的事件。
document.getElementById('parent').addEventListener('click', function(event) { if (event.target.tagName === 'A') { console.log('Link clicked:', event.target.href); } });
- 利用事件冒泡原理,通过父元素监听多个子元素的事件。
事件类型
- 鼠标事件:如
click
、dblclick
、mousedown
、mouseup
、mouseover
、mouseout
。 - 键盘事件:如
keydown
、keyup
、keypress
。 - 触摸事件:如
touchstart
、touchend
、touchmove
。 - 页面事件:如
load
、unload
、beforeunload
。 - 表单事件:如
submit
、reset
、change
、focus
、blur
。
JavaScript异步编程
异步编程的基本概念
- 同步和异步:同步操作会阻塞代码执行,而异步操作允许其他操作在等待结果时继续执行。
- 回调函数:在异步操作完成后执行的函数。
回调函数
- 使用场景:用于处理异步操作完成后的结果或错误。
- 问题:可能导致回调地狱(callback hell),代码难以阅读和维护。
function fetchData(callback) { setTimeout(() => { const data = { message: "Data loaded" }; callback(null, data); }, 1000); } fetchData((error, result) => { if (error) { console.error(error); } else { console.log(result.message); } });
Promise
- 定义:Promise是一个表示异步操作最终完成或失败的对象。
- 状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败)。
const fetchDataPromise = () => { return new Promise((resolve, reject) => { setTimeout(() => { const data = { message: "Data loaded" }; resolve(data); }, 1000); }); }; fetchDataPromise() .then((result) => console.log(result.message)) .catch((error) => console.error(error));
async/await
- async:用于声明一个异步函数,该函数内部可以使用await。
- await:用于等待一个Promise解决,暂停函数执行,直到Promise完成。
async function fetchDataAsync() { try { const result = await fetchDataPromise(); console.log(result.message); } catch (error) { console.error(error); } } fetchDataAsync();
错误处理
- Promise:使用
catch
方法捕获Promise链中的错误。 - async/await:使用
try...catch
结构捕获错误。
并发执行异步操作
- Promise.all:并行执行多个Promise,当所有Promise都成功解决时返回结果数组。
Promise.all([fetchDataPromise(), fetchDataPromise()]) .then(([result1, result2]) => { console.log(result1.message, result2.message); }); Promise.race([fetchDataPromise(), fetchDataPromise()]) .then((result) => console.log(result.message));
JavaScript错误处理与模块化
错误处理的重要性
- 预防程序崩溃:通过捕获和处理错误,避免程序因未处理的异常而崩溃。
- 提供反馈:向用户或开发者提供错误发生的上下文信息。
- 增强健壮性:使程序能够从错误中恢复并继续执行。
错误捕获与try...catch
结构
try
块:包含可能抛出错误的代码。catch
块:当try
块中的代码抛出错误时执行。finally
块:无论是否发生错误,都会执行的代码块。try { // 可能抛出错误的代码 const result = someRiskyOperation(); } catch (error) { // 处理错误 console.error("An error occurred:", error); } finally { // 清理工作,如关闭文件流或数据库连接 }
抛出错误:throw
语句
- 使用
throw
语句主动抛出错误,可以是Error
对象或任何值。function validateInput(input) { if (!input) { throw new Error("Input cannot be empty"); } }
错误对象
Error
构造函数用于创建错误对象,包含错误信息和堆栈跟踪。
ES6模块系统
- 模块化:将代码分割成独立、可重用的模块。
import
语句:从其他模块导入函数、对象或原始值。export
语句:从当前模块导出内容供其他模块使用。
创建模块
- 使用
export
导出模块的公共接口。// mathConstants.js export const PI = 3.14; export function add(x, y) { return x + y; }
- 使用
import
导入模块的内容。// app.js import { PI, add } from './mathConstants.js'; console.log(`The value of PI is ${PI}`); console.log(`The sum is ${add(1, 2)}`);
模块化的好处
- 解耦:模块之间相互独立,降低代码间的依赖。
- 可维护性:独立的模块易于维护和更新。
- 可重用性:模块可以在不同的项目中重用。
ES6及后续版本的新特性概览
-
箭头函数(Arrow Functions)
- 箭头函数提供了一种更简洁的定义函数的方法。
const sum = (a, b) => a + b;
- 箭头函数提供了一种更简洁的定义函数的方法。
-
模板字符串(Template Literals)
- 模板字符串允许在字符串中嵌入表达式,增强了字符串的表达能力。
const name = "Alice"; console.log(`Hello, ${name}!`);
- 模板字符串允许在字符串中嵌入表达式,增强了字符串的表达能力。
-
解构赋值(Destructuring Assignment)
- 解构赋值允许从数组或对象中提取数据并赋值给变量。
const [a, b] = [1, 2]; const { x, y } = { x: 10, y: 20 };
- 解构赋值允许从数组或对象中提取数据并赋值给变量。
-
默认参数值(Default Parameters)
- 函数参数可以指定默认值,提高函数的灵活性。
function greet(name, greeting = "Hello") { console.log(`${greeting}, ${name}!`); }
- 函数参数可以指定默认值,提高函数的灵活性。
-
展开运算符(Spread Operator)
- 展开运算符允许将数组或对象的元素展开或合并。
const numbers = [1, ...[2, 3, 4]]; const obj = { ...{ a: 1 }, ...{ b: 2 } };
- 展开运算符允许将数组或对象的元素展开或合并。
-
Promises
- Promises用于异步计算,提供了一种更好的异步编程模型。
const promise = new Promise((resolve, reject) => { setTimeout(() => resolve("Data"), 1000); }); promise.then(data => console.log(data));
- Promises用于异步计算,提供了一种更好的异步编程模型。
-
async/await
async
和await
使得异步代码的编写更接近同步代码的风格。async function fetchData() { try { const data = await fetchDataPromise(); console.log(data); } catch (error) { console.error(error); } }
-
类(Classes)
- 类的引入使得面向对象编程更加直观和简洁。
class Person { constructor(name) { this.name = name; } greet() { console.log(`Hello, my name is ${this.name}`); } }
- 类的引入使得面向对象编程更加直观和简洁。
-
模块(Modules)
- ES6模块系统提供了一种定义和使用模块的方式,支持
import
和export
。// mathUtils.js export const PI = 3.14; export function add(x, y) { return x + y; } // app.js import { PI, add } from './mathUtils.js';
- ES6模块系统提供了一种定义和使用模块的方式,支持
-
私有字段(Private Fields)
- 私有字段提供了一种定义类内部私有数据的方式。
class Person { #name; constructor(name) { this.#name = name; } get Name() { return this.#name; } }
- 私有字段提供了一种定义类内部私有数据的方式。
直接生成js代码
YDUIbuilder可通过拖拽构建,轻松生成HTML与CSS和JS代码。拖拽间,JS代码自然流淌,无需复杂手写。可视化编程与代码生成的完美结合,让每个创意都触手可及。YDUIbuilder,让编程不再是障碍,而是创造的翅膀。
开源下载地址:yduibuilder: 快速开发UI界面,原型设计即前端开发
JavaScript作为构建现代网页的核心语言,提供了丰富的功能和强大的能力。通过掌握JavaScript的基础知识,开发者可以创建交互性强、用户体验佳的网页应用。