当前位置: 首页 > article >正文

深入理解 dispatchEvent:前端事件触发的艺术

dispatchEvent 是 DOM 元素的一个方法,用于手动触发/派发一个事件。这个方法允许开发者以编程方式触发事件,而不是等待用户交互或浏览器自动触发。

1.基本概念 ★ 基础

  1. 作用dispatchEvent 用于在指定的 DOM 节点上触发一个事件

  2. 使用场景

    • 模拟用户操作(如点击、输入等)

    • 创建和触发自定义事件

    • 在特定条件下触发已有事件

2.使用方法

2.1. 触发内置事件  ★重点

// 获取元素
const button = document.getElementById('myButton');// 创建事件
const clickEvent = new Event('click');// 触发事件
button.dispatchEvent(clickEvent);

2.2. 创建自定义事件 ★重点

// 创建自定义事件
const customEvent = new CustomEvent('myEvent', {detail: { message: 'Hello World' },bubbles: true,    // 事件是否冒泡cancelable: true  // 事件能否被取消
});// 添加事件监听
document.addEventListener('myEvent', (e) => {console.log(e.detail.message); // 输出: Hello World
});// 触发事件
document.dispatchEvent(customEvent);

2.2关于创建自定义事件拓展:new CustomEvent 详解  ★重点

new CustomEvent() 是 JavaScript 中用于创建自定义事件的构造函数,它允许开发者定义和触发完全自定义的事件,而不仅限于浏览器内置的事件类型(如 click、mouseover 等);

基本意义

CustomEvent 的主要意义在于:

  • 扩展事件系统:创建浏览器原生不支持的事件类型;

  • 传递自定义数据:通过事件对象携带任意数据;

  • 实现组件通信:在复杂应用中作为组件间的消息传递机制;

  • 构建事件驱动架构:实现松耦合的代码结构;

基本语法

const event = new CustomEvent(type, options);

参数说明

1. type (必需)  ★重点

  • 字符串,表示事件名称

  • 自定义事件名应该避免使用浏览器已有的标准事件名

  • 惯例使用小写字母和连字符(如 'user-login'

2. options (可选) ★重点

一个包含以下属性的配置对象:

属性

类型

默认值

描述

detail

Any

null

携带的自定义数据

bubbles

Boolean

false

事件是否冒泡

cancelable

Boolean

false

事件能否被取消

composed

Boolean

false

事件是否能穿过Shadow DOM边界

核心作用

1. 携带自定义数据 (detail)

// 创建携带数据的自定义事件
const dataEvent = new CustomEvent('data-loaded', {detail: {success: true,data: [1, 2, 3],timestamp: Date.now()}
});// 监听事件
document.addEventListener('data-loaded', (e) => {console.log(e.detail); // 访问自定义数据
});// 触发事件
document.dispatchEvent(dataEvent);

2. 控制事件传播行为

// 创建会冒泡且可取消的事件
const customEvent = new CustomEvent('custom-action', {bubbles: true,    // 允许事件冒泡cancelable: true  // 允许事件被取消
});element.addEventListener('custom-action', (e) => {e.preventDefault(); // 可以取消事件console.log('事件被取消了');
});element.dispatchEvent(customEvent);

3. 实现组件/模块间通信

// 组件A - 发布事件
function loginSuccess(user) {const event = new CustomEvent('app-login', {detail: { user },bubbles: true});document.dispatchEvent(event);
}// 组件B - 订阅事件
document.addEventListener('app-login', (e) => {updateUserProfile(e.detail.user);
});

4.与普通 Event 的区别 ★重要

特性

Event

CustomEvent

自定义数据

❌ 不支持

✅ 通过 detail 支持

默认行为

有默认行为

无默认行为

事件类型

标准事件类型

任意自定义类型

使用场景

模拟标准事件

创建全新事件系统

2.3. 触发带有数据的事件

// 创建带有数据的事件
const dataEvent = new CustomEvent('dataLoaded', {detail: {data: [1, 2, 3],status: 'success'}
});// 监听事件
document.addEventListener('dataLoaded', (e) => {console.log('Received data:', e.detail.data);
});// 触发事件
document.dispatchEvent(dataEvent);

3.实际应用示例

示例1:基本点击事件触发

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>基本点击事件触发示例</title><style>button {padding: 10px 20px;font-size: 16px;cursor: pointer;}</style>
</head>
<body><h1>基本点击事件触发示例</h1><button id="myButton">点击我</button><button id="triggerButton">程序触发上面的按钮点击</button><script>// 获取DOM元素const myButton = document.getElementById('myButton');const triggerButton = document.getElementById('triggerButton');// 为第一个按钮添加点击事件监听myButton.addEventListener('click', function() {alert('按钮被点击了!' + (event.isTrusted ? ' (用户真实点击)' : ' (程序触发)'));});// 为第二个按钮添加点击事件,用于触发第一个按钮的点击triggerButton.addEventListener('click', function() {// 创建一个点击事件对象const clickEvent = new MouseEvent('click', {bubbles: true,    // 事件是否冒泡cancelable: true // 事件能否被取消});// 触发第一个按钮的点击事件myButton.dispatchEvent(clickEvent);console.log('已通过程序触发按钮点击事件');});</script>
</body>
</html>

示例2:自定义事件带数据传递

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>自定义事件带数据传递示例</title><style>#output {margin-top: 20px;padding: 15px;border: 1px solid #ccc;background-color: #f9f9f9;min-height: 50px;}</style>
</head>
<body><h1>自定义事件带数据传递示例</h1><button id="triggerCustomEvent">触发自定义事件</button><div id="output">事件信息将显示在这里...</div><script>// 获取DOM元素const triggerBtn = document.getElementById('triggerCustomEvent');const outputDiv = document.getElementById('output');// 监听自定义事件document.addEventListener('userLogin', function(event) {outputDiv.innerHTML = `<p>自定义事件被触发了!</p><p>时间: ${new Date(event.detail.timestamp).toLocaleString()}</p><p>用户: ${event.detail.username}</p><p>年龄: ${event.detail.age}</p>`;});// 触发自定义事件triggerBtn.addEventListener('click', function() {// 创建自定义事件对象,携带详细数据const userLoginEvent = new CustomEvent('userLogin', {detail: {username: '张三',age: 28,timestamp: Date.now()},bubbles: true,cancelable: true});// 触发自定义事件document.dispatchEvent(userLoginEvent);console.log('已触发自定义事件 userLogin');});</script>
</body>
</html>

示例3:表单验证后触发事件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>表单验证后触发事件示例</title><style>form {max-width: 400px;margin: 20px auto;padding: 20px;border: 1px solid #ddd;border-radius: 5px;}input {display: block;width: 100%;margin: 10px 0;padding: 8px;}button {padding: 10px 15px;background-color: #4CAF50;color: white;border: none;cursor: pointer;}.error {color: red;font-size: 14px;}#result {margin-top: 20px;padding: 10px;border: 1px solid #4CAF50;display: none;}</style>
</head>
<body><h1>表单验证后触发事件示例</h1><form id="userForm"><label for="username">用户名:</label><input type="text" id="username" required minlength="3"><span id="usernameError" class="error"></span><label for="email">邮箱:</label><input type="email" id="email" required><span id="emailError" class="error"></span><button type="submit">提交</button></form><div id="result"></div><script>// 获取DOM元素const form = document.getElementById('userForm');const usernameInput = document.getElementById('username');const emailInput = document.getElementById('email');const usernameError = document.getElementById('usernameError');const emailError = document.getElementById('emailError');const resultDiv = document.getElementById('result');// 监听表单提交事件form.addEventListener('submit', function(event) {event.preventDefault(); // 阻止表单默认提交行为// 验证表单if (validateForm()) {// 表单验证通过,触发自定义事件const formSuccessEvent = new CustomEvent('formSuccess', {detail: {username: usernameInput.value,email: emailInput.value,timestamp: new Date().toLocaleString()},bubbles: true});form.dispatchEvent(formSuccessEvent);}});// 监听自定义表单成功事件form.addEventListener('formSuccess', function(event) {resultDiv.style.display = 'block';resultDiv.innerHTML = `<h3>表单提交成功!</h3><p>用户名: ${event.detail.username}</p><p>邮箱: ${event.detail.email}</p><p>提交时间: ${event.detail.timestamp}</p>`;console.log('表单数据:', event.detail);});// 表单验证函数function validateForm() {let isValid = true;// 验证用户名if (usernameInput.value.length < 3) {usernameError.textContent = '用户名至少需要3个字符';isValid = false;} else {usernameError.textContent = '';}// 验证邮箱if (!emailInput.value.includes('@')) {emailError.textContent = '请输入有效的邮箱地址';isValid = false;} else {emailError.textContent = '';}return isValid;}</script>
</body>
</html>

示例4:事件冒泡与控制

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>事件冒泡与控制示例</title><style>#container {padding: 30px;background-color: #f0f0f0;border: 2px solid #333;}#innerBox {padding: 20px;background-color: #e0e0e0;border: 2px solid #666;margin-top: 15px;}button {padding: 10px 15px;margin: 5px;}#eventLog {margin-top: 20px;padding: 10px;border: 1px solid #ccc;background-color: #f9f9f9;min-height: 100px;}</style>
</head>
<body><h1>事件冒泡与控制示例</h1><div id="container">容器元素<div id="innerBox">内部元素<button id="bubbleBtn">触发冒泡事件</button><button id="noBubbleBtn">触发不冒泡事件</button></div></div><div id="eventLog">事件日志将显示在这里...</div><script>// 获取DOM元素const container = document.getElementById('container');const innerBox = document.getElementById('innerBox');const bubbleBtn = document.getElementById('bubbleBtn');const noBubbleBtn = document.getElementById('noBubbleBtn');const eventLog = document.getElementById('eventLog');// 添加日志函数function addLog(message) {eventLog.innerHTML += `<p>${new Date().toLocaleTimeString()}: ${message}</p>`;eventLog.scrollTop = eventLog.scrollHeight;}// 为容器和内部元素添加事件监听(捕获阶段)container.addEventListener('click', function() {addLog('容器元素捕获阶段触发');}, true);// 为容器和内部元素添加事件监听(冒泡阶段)container.addEventListener('click', function() {addLog('容器元素冒泡阶段触发');});innerBox.addEventListener('click', function() {addLog('内部元素冒泡阶段触发');});// 触发冒泡事件bubbleBtn.addEventListener('click', function() {addLog('--- 准备触发冒泡事件 ---');// 创建会冒泡的事件const bubbleEvent = new Event('click', {bubbles: true});// 从按钮触发事件this.dispatchEvent(bubbleEvent);});// 触发不冒泡事件noBubbleBtn.addEventListener('click', function() {addLog('--- 准备触发不冒泡事件 ---');// 创建不会冒泡的事件const noBubbleEvent = new Event('click', {bubbles: false});// 从按钮触发事件this.dispatchEvent(noBubbleEvent);});</script>
</body>
</html>

4.dispatchEvent 使用注意事项

  1. 事件冒泡:默认情况下,手动触发的事件不会冒泡,除非在创建事件时设置 bubbles: true

  2. 默认行为:有些事件的默认行为不会被触发(如表单提交),即使手动派发了事件

  3. 兼容性:现代浏览器都支持,但在非常旧的浏览器中可能需要 polyfill

  4. 性能:过度使用可能导致代码难以维护,应谨慎使用

5.dispatchEvent 与直接调用 DOM 元素方法(如 click())的区别 

5.1 主要区别

特性element.click()element.dispatchEvent()
触发方式简写方法通用事件触发方法
事件对象自动创建基本事件对象可以完全自定义事件对象
默认行为通常会触发元素的默认行为默认不触发默认行为(除非特别配置)
兼容性部分元素可能不支持(如某些表单元素)适用于所有元素和所有事件类型
自定义数据无法附加自定义数据可以通过 detail 属性附加自定义数据
事件冒泡/捕获通常是默认行为可以精确控制(通过 bubbles 和 cancelable 参数)

5.2 详细解释

1. 默认行为触发

// 使用 click() - 会触发默认行为(如表单提交、链接跳转)
const link = document.getElementById('myLink');
link.click(); // 会实际跳转页面// 使用 dispatchEvent - 默认不触发默认行为
const clickEvent = new Event('click');
link.dispatchEvent(clickEvent); // 不会跳转页面

2. 自定义事件能力

dispatchEvent 允许创建完全自定义的事件:

// 创建带自定义数据的事件
const customEvent = new CustomEvent('myEvent', {detail: { message: 'Hello' },bubbles: true
});element.dispatchEvent(customEvent);// 而 element.click() 只能触发简单的点击事件,无法自定义

3. 事件传播控制

// 可以精确控制事件是否冒泡
const nonBubblingEvent = new Event('click', { bubbles: false });
element.dispatchEvent(nonBubblingEvent); // 不会冒泡// click() 方法触发的事件总是会冒泡

4. 适用元素范围

// 对于某些元素,click() 可能无效
const div = document.querySelector('div');
div.click(); // 在某些浏览器/环境下可能不会触发事件监听器// 但 dispatchEvent 总是有效
div.dispatchEvent(new Event('click')); // 总会触发事件监听器

5.3 实际应用建议

  • 使用 element.click() 当

    • 只需要简单模拟用户点击

    • 希望触发元素的默认行为

    • 代码简洁性更重要时

  • 使用 dispatchEvent 当

    • 需要自定义事件或附加数据

    • 需要精确控制事件传播(冒泡/捕获)

    • 不希望触发默认行为

    • 处理非标准事件或自定义事件

    • 需要确保在所有浏览器中一致行为

5.4 示例对比 

// 场景1:简单模拟点击 - 两者都可以
button.click();
// 等同于
button.dispatchEvent(new Event('click'));// 场景2:需要阻止默认行为
// 使用 dispatchEvent 可以更明确
const evt = new Event('click');
button.dispatchEvent(evt);
if(evt.defaultPrevented) {console.log('默认行为被阻止了');
}// 场景3:自定义事件 - 只能使用 dispatchEvent
const customEvt = new CustomEvent('build', { detail: { time: Date.now() } });
element.dispatchEvent(customEvt);

总结:click() 是特定于点击事件的快捷方式, dispatchEvent 是更通用、更强大的事件触发机制,适用于所有类型的事件和更复杂的场景。

6.addEventListener 方法补充  ★ 基础

addEventListener 是 DOM 元素上用于监听事件的核心方法,比传统的 onclick 等属性更强大灵活;

6.1 基本语法

target.addEventListener(type, listener, options);
// 或
target.addEventListener(type, listener, useCapture);

6.2 参数说明

1. type (必需)

  • 类型: 字符串

  • 作用: 指定要监听的事件类型

  • 示例:

    'click', 'mouseover', 'keydown', 'custom-event'

2. listener (必需)

  • 类型: 函数

  • 作用: 事件触发时执行的回调函数

  • 参数: 接收一个 Event 对象

  • 示例:

    function handleClick(event) {console.log('元素被点击了', event.target);
    }

3. 第三个参数 (可选)

可以是以下两种形式之一:

形式一: options 对象

属性

类型

默认值

描述

capture

Boolean

false

是否在捕获阶段触发

once

Boolean

false

是否只触发一次后自动移除

passive

Boolean

false

是否永远不会调用 preventDefault()

signal

AbortSignal

-

关联的 AbortSignal 用于移除监听

形式二: useCapture 布尔值

  • 作用: 简化版的 capture 选项

  • 示例:

    // 只在捕获阶段触发
    element.addEventListener('click', handler, true);

6.3 使用示例 

1.基本点击事件

const button = document.getElementById('myButton');button.addEventListener('click', function(event) {console.log('按钮被点击了', event);
});

2.带选项的监听

// 只触发一次的事件
element.addEventListener('mouseenter', () => {console.log('鼠标只进入这一次');
}, { once: true });// 被动事件(优化滚动性能)
window.addEventListener('scroll', () => {console.log('滚动中...');
}, { passive: true });

3.使用 AbortSignal 控制

const controller = new AbortController();element.addEventListener('click', () => {console.log('点击事件');
}, { signal: controller.signal });// 移除所有通过此signal注册的监听器
controller.abort();

6.4 事件对象 (Event) 常用属性 ★ 基础·重要

回调函数接收的 event 对象包含:

属性/方法描述
target触发事件的元素
currentTarget当前处理事件的元素
type事件类型
preventDefault()阻止默认行为
stopPropagation()停止事件传播
stopImmediatePropagation()立即停止事件传播

6.5 移除事件监听  ★ 基础·重要

function handleClick() {console.log('点击');
}// 添加监听
element.addEventListener('click', handleClick);// 移除监听(必须使用相同的函数引用)
element.removeEventListener('click', handleClick);

注意事项  ★ 基础·重要

  1. 函数引用一致性:移除监听时必须使用添加时的同一函数引用 

  2. 匿名函数问题:匿名函数无法被移除

  3. 性能优化:对高频事件(如scroll)使用 passive: true

  4. 内存泄漏:及时移除不再需要的监听器

  5. 事件委托:利用冒泡机制在父元素上监听子元素事件

6.6 高级用法

1.事件委托

// 在父元素上监听所有子元素的点击
document.getElementById('list').addEventListener('click', (event) => {if (event.target.matches('li.item')) {console.log('点击了项目', event.target);}
});

2.多个事件共享处理器

function handleEvent(event) {switch(event.type) {case 'click':console.log('点击');break;case 'mouseover':console.log('鼠标悬停');break;}
}element.addEventListener('click', handleEvent);
element.addEventListener('mouseover', handleEvent);

addEventListener 是现代Web开发中事件处理的标准方式,相比直接设置 onclick 等属性,它允许:

  • 同一个事件添加多个处理器

  • 更精确地控制事件触发阶段

  • 提供更多配置选项

  • 更好地管理事件生命周期

相关文章:

深入理解 dispatchEvent:前端事件触发的艺术

dispatchEvent 是 DOM 元素的一个方法&#xff0c;用于手动触发/派发一个事件。这个方法允许开发者以编程方式触发事件&#xff0c;而不是等待用户交互或浏览器自动触发。 1.基本概念 ★ 基础 作用&#xff1a;dispatchEvent 用于在指定的 DOM 节点上触发一个事件 使用场景&a…...

linux和windows是采用何种机制保存密码的?

传统Linux的不足&#xff1a; 1&#xff09;存在特权用户root 任何人只要得到root的权限&#xff0c;对于整个系统都可以为所欲为。这一点Windows也一样。 &#xff12;)对于文件的访问权划分不够细 在linux系统里&#xff0c;对于文件的操作&#xff0c;只有「所有者」…...

matlab打开两个工程

1、问题描述 写代码时&#xff0c;需要实时参考别人的代码&#xff0c;需要同时打开2个模型&#xff0c;当模型在同一个工程内时&#xff0c;这是可以直接打开的&#xff0c;如图所示 2、解决方案 再打开一个MATLAB主窗口 这个时候就可以同时打开多个模型了 3、正确的打开方…...

Unity中的MaterialPropertyBlock的作用和 Material 的区别

MaterialPropertyBlock 是 Unity 提供的一个用于动态修改材质属性的轻量级工具&#xff0c;核心作用是避免材质实例化&#xff08;Material Instantiation&#xff09;&#xff0c;从而优化性能。以下是它的关键特性和使用方法&#xff1a; 1. 核心作用 避免材质实例化 直接修改…...

Python与文件——保存文件

1.以下关于Python二维数据的描述中,错误的是()。 A、CSV文件的每一行是一维数据,可以用列表、元组表示。 B、从CSV文件获得数据内容后,可以用replace()来去掉每行最后的换行符。 C、若一个列表变量里的元素都是字符串类型,则可以用join()合成字符串。 D、列表中保存的二维数据,…...

HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析

注&#xff1a;适用版本&#xff08;Harmony OS NEXT / 5.0 / API 12 &#xff09; 一、效果展示 二、技术栈 HarmonyOS ArkUI框架 使用AppStorage实现跨组件状态管理&#xff0c;PersistentStorage持久化存储用户偏好。 系统配置常量 ConfigurationConstant.Color…...

60V单通道高精度线性恒流LED驱动器防60V反接SOD123封装

产品描述: PC561A 系列产品是用于产生单通道、高精度恒流源&#xff08; Constant Current Regulator&#xff0c; CCR&#xff09; 的LED 驱动芯片&#xff0c;为各类 LED 照明应用提供高性价比恒流方案。PC561A 采用晶体管自偏置技术&#xff0c;可在超宽工作电压范围内维持…...

学习threejs,使用Sprite精灵、SpriteMaterial精灵材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Sprite1.1.1 ☘️代码…...

网络相关的知识总结1

1.设备可以通过以太网电缆&#xff08;如双绞线&#xff09;连接到交换机的端口&#xff0c;交换机也通过以太网电缆连接到路由器。但是如果距离过远&#xff0c;比如跨国路由器如何连接&#xff1f; 1.专用通信线路&#xff08;如 MPLS、光纤专线&#xff09;&#xff1a;租用…...

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…...

本地AI大模型部署革命:Ollama部署和API调试教程

Ollama&#xff1a;你的私人AI助手 还在为云端AI服务的高昂费用和隐私问题而烦恼吗&#xff1f;Ollama横空出世&#xff0c;它是一款专为本地环境打造的大模型部署神器&#xff0c;让你轻松在自己的设备上运行各种强大的AI模型。无论你是开发者还是普通用户&#xff0c;Ollama…...

centos7 linux VMware虚拟机新添加的网卡,能看到网卡名称,但是看不到网卡的配置文件

问题现象&#xff1a;VMware虚拟机新添加的网卡&#xff0c;能看到网卡&#xff0c;但是看不到网卡的配置文件 解决方案&#xff1a; nmcli connection show nmcli connection add con-name ens36 ifname ens36 type ethernet #创建一个网卡连接配置文件&#xff0c;这里con…...

SRT协议

SRT&#xff08;Secure Reliable Transport&#xff09;是一种开源的视频传输协议&#xff0c;专为高丢包、高延迟网络环境设计&#xff0c;结合了UDP的低延迟和TCP的可靠性&#xff0c;广泛应用于直播、远程制作、视频会议等场景。 定位&#xff1a;SRT协议的官方C/C实现库&am…...

K8S学习之基础五十一:k8s部署jenkins

k8s部署jenkins 创建nfs共享目录&#xff0c; mkdir -p /data/v2 echo /data/v2 *(rw,no_root_squash) > /etc/exports exportfs -arv创建pv、pvc vi pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: jenkins-k8s-pv spec:capacity:storage: 1GiaccessMod…...

在 Mermaid 流程图里“驯服”quot;的魔法指南!!!

&#x1f409; 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时&#xff0c;是不是经常遇到想秀一波 &quot; 却被它“反杀”的情况&#xff1f;&#x1f3af; 今天就来教大家如何在这头代码野兽的嘴里&#xff0c;抢回我们的双引号实体编码&#…...

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…...

欧几里得距离(Euclidean Distance)公式

欧几里得距离公式 欧几里得距离&#xff08;Euclidean Distance&#xff09;是计算两点之间直线距离的一种方法。它是最常见的距离度量方式之一&#xff0c;广泛应用于数学、物理、机器学习、计算机视觉等领域。 公式定义 1. 二维空间 在二维平面上&#xff0c;假设有两个点…...

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…...

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗&#xff1f;这是一个很多人一开始就放弃的主题&#xff0c;但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么&#xff1f; “Promise”是异步编程中的一个基本概念&#xff0c;特别是在J…...

【软件工程】习题及答案

目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1&#xff0e;关于引起软件危机的原因&#xff…...

git push的时候出现无法访问的解决

fatal: 无法访问 https://github.com/...&#xff1a;gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码&#xff0c;为了解决每次push都要登录github这个问题&#xff0c;采用ssh密钥的方式认证&#xff0c;可以免去每次都输入…...

《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》

优化后文章结构&#xff1a; 1. 前言 强调锁屏通知布局的重要性及分析目的&#xff0c;引出后续源码分析的必要性。 2. 核心类解析 KeyguardViewMediator&#xff1a;锁屏核心逻辑控制&#xff0c;处理亮屏/息屏事件分发。 PhoneWindowManager&#xff1a;系统输入事件&…...

为什么大模型在 OCR 任务上表现不佳?

编者按&#xff1a; 你是否曾经用最先进的大语言模型处理企业文档&#xff0c;却发现它把财务报表中的“$1,234.56”读成了“123456”&#xff1f;或者在处理医疗记录时&#xff0c;将“0.5mg”误读为“5mg”&#xff1f;对于依赖数据准确性的运营和采购团队来说&#xff0c;这…...

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机&#xff08;SW1、SW2、SW3&#xff09;个人电脑&#xff08;PC1、PC2、PC3、PC4、PC5、PC6&#xff09;路由器&#xff08;R1…...

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…...

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML&#xff1a;使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中&#xff0c;我们经常需要将 Word 文档转换为 HTML&#xff0c;用于…...

Android 设备实现 adb connect 连接的步骤

1. 检查设备的开发者选项 确保平板设备已开启开发者模式&#xff0c;并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络&#xff0c;确认设备的 IP 地址是否正确。 通过 ping 命令测试&#xff1a; ping 192.168.3.243. 通过USB线进行初…...

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…...

离散的数据及参数适合用什么算法做模型

离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…...

VMware 安装 Ubuntu 实战分享

VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件&#xff0c;广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu&#xff0c;并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统&#xff1a;Windo…...