深入理解 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 等属性,它允许:

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

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

  • 提供更多配置选项

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的进程信号 -- 信号产生,信号保存,信号捕捉,硬件中断,内核态和用户态,可重入函数,volatile,SIGCHLD

目录 1. 认识信号 1.1 信号的定义和基本结论 1.1.1 查看信号 1.2 技术应用角度的信号 1.2.1 一个样例 1.2.2 系统调用 signal 函数 1.3 信号的处理 2. 信号的产生 2.1 通过终端按键产生信号 2.1.1 基本操作 2.1.2 理解操作系统如何得知键盘信号 2.1.3 初步理解信号…

知识库中嵌入模型(Embedding Models)与重排序模型(Re-ranking Models)推荐工具与库

一、引言 在当今信息爆炸的时代&#xff0c;企业和组织面对海量数据时&#xff0c;如何快速、准确地检索和利用知识成为一项关键技术。知识库作为信息管理和知识发现的核心平台&#xff0c;已经广泛应用于搜索引擎、问答系统、智能客服、推荐系统等领域。然而&#xff0c;传统…

C++调用Python

Python安装 地址&#xff1a; python官网 可以根据需要下载对应的版本。 调用python python测试脚本 # my_script.py import sys import jsondef calculate(a, b):return a * b 10 # 示例计算逻辑if __name__ "__main__":# 从命令行参数读取 JSON 字符串try…

Linux 中查看文件大小方法

目录 方法一&#xff1a;ls -l 输出的第五列方法二&#xff1a;du 命令的输出信息方法三&#xff1a;stat -c %s 的输出 方法一&#xff1a;ls -l 输出的第五列 ls 是列出指定目录下文件列表的命令&#xff0c;通过 -l 选项可以显示文件的属性信息&#xff0c;第五列显示的就是…

初识Qt(一)

本文部分ppt、视频截图原链接&#xff1a;萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频 1. Qt是什么&#xff1f; Qt是一个跨平台的C应用程序开发框架&#xff0c;它既为图形用户界面(GUI)程序开发提供了强大支持&#xff0c;也能用于开发非GUI的控制台程序、服务端…

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…

《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》

简介&#xff1a; “本文为AI开发者揭秘如何在阿里云2核2G轻量级ECS服务器上&#xff0c;通过Ubuntu系统与Ollama框架实现Deepseek模型的高效部署。无需昂贵硬件&#xff0c;手把手教程涵盖环境配置、资源优化及避坑指南&#xff0c;助力初学者用极低成本在云端跑通行业领先的大…

DexGrasp Anything:具有物理-觉察的普遍机器人灵巧抓取

25年3月来自上海科技大学的论文“DexGrasp Anything: Towards Universal Robotic Dexterous Grasping with Physics Awareness”。 能够抓取任何物体的灵巧手&#xff0c;对于通用具身智能机器人的开发至关重要。然而&#xff0c;由于灵巧手的自由度高&#xff0c;物体种类繁多…

COMPASS:通过残差强化学习和技能合成实现跨具身移动策略

25年2月来自 Nvidia、UC Berkeley 和 UT Austin 的论文“COMPASS: Cross-embOdiment Mobility Policy via ResiduAl RL and Skill Synthesis”。 随着机器人越来越多地部署在不同的应用领域&#xff0c;可泛化的跨具身移动策略变得越来越重要。虽然经典的移动栈已被证明在特定…

win10下python脚本运行缺失ccache的问题处理

问题 python脚本运行时&#xff0c;会提醒参考 https://github.com/ccache/ccache/blob/master/doc/INSTALL.md 处理缺失ccache的问题。 下载编译 下载ccache主干版本&#xff0c; 例如 https://github.com/ccache/ccache/archive/refs/heads/master.zip 按照说明编译 mkd…

跨语言语言模型预训练

摘要 最近的研究表明&#xff0c;生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中&#xff0c;我们将这一方法扩展到多种语言&#xff0c;并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型&#xff08;XLM&#xff09;的方法&#xff1a;一种…

3月28号

今天写了一些算法题: P1866 编号 题目描述 太郎有 N 只兔子&#xff0c;现在为了方便识别它们&#xff0c;太郎要给他们编号。兔子们向太郎表达了它们对号码的喜好&#xff0c;每个兔子 i 想要一个整数&#xff0c;介于 1 和 Mi​ 之间&#xff08;可以为 1 或 Mi​&#xf…

数据结构与算法:2,冒泡排序

以从小到大排序为例&#xff1a; 冒泡排序步骤&#xff1a; 1&#xff0c;从左到右(或从右到左)对比相邻两个数&#xff0c;左边的数 大于 右边的数 则交换位置 2,重复第一个步骤 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​…

从春招“AI热潮”看科技变革中的就业新趋势

随着2025年春招市场的火热进行&#xff0c;人工智能&#xff08;AI&#xff09;相关岗位成为求职市场上的“香饽饽”&#xff0c;引发了社会各界的广泛关注。这一现象背后&#xff0c;不仅反映了AI技术的快速发展&#xff0c;更揭示了科技变革对就业市场带来的深远影响。从春招…

人工智能之数学基础:矩阵的相似变换

本文重点 矩阵的相似变换是线性代数中一个至关重要的概念,它揭示了矩阵之间的一种特殊关系,并通过可逆矩阵将一个矩阵转化为另一个相似矩阵,同时保持矩阵的某些本质特征不变。在机器学习领域,矩阵的相似变换发挥着不可或缺的作用,广泛应用于数据降维、聚类分析、分类推荐…

docker torcherve打包mar包并部署模型

使用Docker打包深度网络模型mar包到服务端 参考链接&#xff1a;Docker torchserve 部署模型流程——以WSL部署YOLO-FaceV2为例_class myhandler(basehandler): def initialize(self,-CSDN博客 1、docker拉取环境镜像命令 docker images出现此提示为没有权限取执行命令&…

JAVA实现动态IP黑名单过滤

一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 通过 IP 封禁&#xff0c;可以有效拉黑攻击者&#xff0c;防止资源被滥用&#xff0c;保障合法用户…

RocketMQ可视化工具使用 - Dashboard(保姆级教程)

1、github拉取代码&#xff0c;地址&#xff1a; https://github.com/apache/rocketmq-dashboard 2、指定Program arguments&#xff0c;本地启动工程 勾上这个Program arguments&#xff0c;会出现多一个对应的框 写入参数 --server.port1280 --rocketmq.config.namesrvAddr…

湖南(源点咨询)市场调研 商业综合体定位调研分享(上篇)

​ 该项目位于某新一线城市的城市副中心区域&#xff0c;系一个正在发展中的中央居住区&#xff0c;项目本身是一个涵盖社区综合服务中心、商业、文体活动中心、卫生服务、社区养老等多功能复合的公共配套项目&#xff0c;本次调研主要针对其商业&#xff08;及其他可商用的&a…

硬件测试工装设计不合理的补救措施

硬件测试工装设计不合理的补救措施主要包括重新评估设计需求、优化工装结构、强化工装校准与验证。其中&#xff0c;优化工装结构尤其重要&#xff0c;通过结构优化能够有效解决因设计不合理导致的测试准确性下降和可靠性不足的问题。根据工程实践数据&#xff0c;经过优化结构…