探索JavaScript前端开发:开启交互之门的神奇钥匙(二)
目录
引言
四、事件处理
4.1 事件类型
4.2 事件监听器
五、实战案例:打造简易待办事项列表
5.1 HTML 结构搭建
5.2 JavaScript 功能实现
六、进阶拓展:异步编程与 Ajax
6.1 异步编程概念
6.2 Ajax 原理与使用
七、前沿框架:Vue.js 入门窥探
7.1 Vue.js 简介
7.2 基础使用示例
八、总结与展望
引言
在当今数字化时代,互联网已然成为人们生活不可或缺的一部分,而网页作为互联网的主要载体,其用户体验的优劣直接关乎着信息的有效传递与用户的留存。JavaScript,这门在前端开发领域占据核心地位的编程语言,犹如一位神奇的魔法师,为静态的网页注入灵动的生命力,使之蜕变成为交互性强、功能丰富的精彩世界。
四、事件处理
4.1 事件类型
在 JavaScript 的前端开发领域,事件处理犹如一座桥梁,紧密连接着用户与网页之间的交互。它能够精准捕捉用户在页面上的各类操作,诸如鼠标的轻轻点击、键盘的敲击输入、表单的提交确认等,并迅速触发相应的 JavaScript 代码来执行特定功能,为用户带来流畅且自然的交互体验。
鼠标事件堪称交互中的 “主力军”,涵盖了诸多常见类型。click 事件,作为最为常用的一种,当用户在某个元素上执行单击鼠标左键的操作时,便会如同触动了机关一般被触发,就像在网页上点击一个按钮提交表单,或是打开一个链接跳转页面。与之紧密相关的 dblclick 事件,则要求用户在极短时间内连续双击鼠标左键,常用于实现一些快速操作指令,比如在图片编辑场景下,双击图片快速进入编辑模式。mouseover 与 mouseenter 事件均在鼠标指针移至元素上方时触发,细微差别在于,mouseover 在鼠标经过元素及其子元素时都会触发,而 mouseenter 仅当鼠标初次进入元素自身范围时才触发,二者适用于不同的交互细节需求,如导航菜单的展开,mouseover 能让子菜单在鼠标滑过主菜单及子项时都灵活响应,mouseenter 则可确保仅在精准指向主菜单时才触发展开动作,避免误触。mouseout 与 mouseleave 事件则相反,对应鼠标离开元素的操作,其触发规则与上述类似,常用于收起菜单、隐藏提示信息等场景。mousedown 与 mouseup 事件分别对应鼠标按钮按下与松开的瞬间,这两个事件常与 mousemove 配合,用于实现诸如拖拽元素、绘制图形等复杂交互,像在一些图形设计软件的网页版中,用户按下鼠标并移动来绘制线条,松开鼠标完成绘制。
键盘事件同样不可或缺,keydown 事件在用户按下键盘上任意键的瞬间被触发,无论是字母、数字、符号还是功能键,它都能敏锐捕捉,通过监听此事件,开发者可实时获取用户的按键输入,常用于文本输入实时校验、快捷键响应等场景。例如在一些在线文档编辑页面,输入文字时实时检查拼写错误,或是按下 Ctrl + S 组合键触发保存操作。keyup 事件紧随 keydown 之后,在按键松开时触发,与 keydown 配合可精准判断用户完整的按键动作,确保交互逻辑的准确性。需注意的是,曾经的 keypress 事件在按下字符键时触发,但已逐渐被 keydown 取代,因其在处理功能键等方面存在局限。
表单事件聚焦于表单元素的交互处理。submit 事件在用户点击表单的提交按钮,或是在表单内按下回车键(前提是表单设置允许)时触发,此时通常会进行表单数据的校验与提交操作,如登录表单验证用户名和密码是否符合格式要求、是否非空等,若校验通过则向服务器发送数据。change 事件则针对表单元素状态的改变,当单选框、复选框被选中或取消选中,下拉列表选择了不同选项,文本框或 textarea 元素内容改变且失去焦点时,都会触发该事件,常用于实时更新相关联的显示内容或执行额外校验,比如电商购物选择商品规格后,实时更新商品总价;在文本框输入完信息,失去焦点时检查格式是否正确。input 事件与 change 类似,不过它更加 “实时”,只要表单元素的值发生变化,便会立即触发,对于实时反馈用户输入极为有用,如搜索框实时显示输入的关键词联想结果。
不妨以一个简单实例来深入理解事件驱动机制。在网页上有一个按钮,当用户点击它时,弹出一个提示框显示 “按钮被点击了”:
<button id="myButton">点击我</button>
<script>document.getElementById('myButton').addEventListener('click', function() {alert('按钮被点击了');});
</script>
在此例中,按钮是事件源,click 是事件类型,而函数 function() { alert('按钮被点击了'); } 便是事件处理程序。当用户执行点击操作这一 “导火索” 时,便迅速激活事件处理程序,进而弹出提示框,完成一次流畅的交互。
4.2 事件监听器
在 JavaScript 前端开发中,事件监听器是实现高效、灵活事件处理的关键所在。它宛如一位忠诚且机智的 “守护者”,时刻监听着特定 DOM 元素上的各种事件,一旦捕捉到目标事件的发生,便会立即触发与之绑定的相应函数,执行预设的交互逻辑。
addEventListener 方法无疑是其中的 “核心利器”,它以一种极为灵活且强大的方式,将事件与处理函数紧密关联起来。其语法结构如下:
target.addEventListener(type, listener, useCapture);
其中,target 代表目标 DOM 元素,通过诸如 document.getElementById、querySelector 等方法精准获取;type 即为要监听的事件类型,如前文提及的 click、keydown、submit 等;listener 则是对应的事件处理函数,它可以是具名函数,也可以是匿名函数,这个函数承载着当事件触发时需要执行的具体代码逻辑;useCapture 是一个可选参数,用于指定事件冒泡或捕获阶段,默认为 false,即处于冒泡阶段,后续会详细讲解冒泡与捕获机制。
以一个为按钮添加点击监听器的实例来深入剖析:
<button id="actionButton">执行操作</button>
<script>const button = document.getElementById('actionButton');button.addEventListener('click', function() {console.log('按钮被点击,即将执行重要操作...');// 此处可添加具体业务逻辑代码,如发送AJAX请求、更新页面数据等});
</script>
在上述代码中,首先通过 document.getElementById 精准定位到 id 为 'actionButton' 的按钮元素,将其赋值给 button 变量。接着,使用 addEventListener 方法为该按钮监听 'click' 事件,当用户点击按钮时,匿名函数内的代码便会立即执行,控制台输出相应提示信息,并且可依需求在此处拓展更为复杂的业务逻辑,如向服务器提交表单数据、动态更新页面 UI 等。
与传统的内联事件处理属性相比,addEventListener 具有显著优势。传统的内联方式,如在 HTML 标签内直接使用 onclick="function ()",虽然简单直接,但却将 JavaScript 代码与 HTML 结构紧密耦合在一起,使得代码的维护性与可扩展性大打折扣。一旦业务逻辑复杂起来,需要修改或新增功能,在 HTML 标签内嵌入的大量代码将变得混乱不堪,难以管理。而 addEventListener 将事件绑定逻辑统一放置在 JavaScript 脚本中,实现了 HTML 结构与 JavaScript 行为的分离,遵循了良好的代码解耦原则,使得代码结构更加清晰、易于维护与拓展。
在实际应用场景中,比如一个网页表单包含多个按钮,分别用于提交表单、重置表单、保存草稿等不同操作,便可利用 addEventListener 为每个按钮绑定各自专属的点击处理函数:
<form id="myForm"><input type="text" placeholder="请输入内容"><button id="submitButton">提交</button><button id="resetButton">重置</button><button id="saveButton">保存草稿</button>
</form>
<script>const submitBtn = document.getElementById('submitButton');const resetBtn = document.getElementById('resetButton');const saveBtn = document.getElementById('saveButton');submitBtn.addEventListener('click', function() {// 执行表单提交逻辑,如校验数据、发送请求console.log('表单提交中...');});resetBtn.addEventListener('click', function() {// 重置表单数据,恢复初始状态console.log('表单已重置');});saveBtn.addEventListener('click', function() {// 保存草稿逻辑,如将数据暂存本地console.log('草稿已保存');});
</script>
如此一来,各个按钮各司其职,通过独立的事件监听器实现了多样化的交互响应,极大提升了用户体验与代码的灵活性。
五、实战案例:打造简易待办事项列表
5.1 HTML 结构搭建
在着手构建简易待办事项列表时,精心搭建 HTML 结构是基础且关键的第一步。它犹如搭建房屋的骨架,为后续功能的添砖加瓦提供稳固支撑。以下是一段基础的 HTML 代码示例:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>简易待办事项列表</title><link rel="stylesheet" href="styles.css">
</head><body><h1>待办事项列表</h1><div id="todo-app"><input type="text" id="new-todo" placeholder="添加新任务..."><button id="add-todo">添加</button><ul id="todo-list"></ul></div><script src="script.js"></script>
</body></html>
在这段代码中,<h1> 标签醒目地展示了应用的标题,让用户一眼便能知晓此页面的用途。<div id="todo-app"> 作为核心容器,将整个待办事项的操作区域进行了整合,使之在页面布局上更为规整。其中,<input type="text" id="new-todo"> 是用户输入待办任务的入口,placeholder 属性友好地提示用户应在此处输入内容;<button id="add-todo"> 则是触发添加任务动作的按钮,简洁直观。而 <ul id="todo-list"> 如同一个空白的任务收纳盒,后续通过 JavaScript 动态生成的任务列表项(<li> 元素)都将被有序地放置其中,为用户呈现清晰的任务清单。合理且简洁的 HTML 结构设计,不仅提升了代码的可读性,更为后续 JavaScript 功能的实现铺就了顺畅之路。
5.2 JavaScript 功能实现
有了 HTML 结构作为基石,接下来借助 JavaScript 赋予待办事项列表鲜活的交互能力。以下是实现添加任务、删除任务以及标记任务完成功能的 JavaScript 代码示例,并附有详细注释:
// 等待页面DOM加载完成后再执行后续代码,确保DOM元素已存在
document.addEventListener('DOMContentLoaded', function () {const todoInput = document.getElementById('new-todo');const addButton = document.getElementById('add-todo');const todoList = document.getElementById('todo-list');// 为添加按钮添加点击事件监听器addButton.addEventListener('click', function () {const taskText = todoInput.value.trim();if (taskText!== '') {// 创建新的列表项元素const listItem = document.createElement('li');listItem.textContent = taskText;// 创建删除按钮const deleteButton = document.createElement('button');deleteButton.textContent = '删除';// 为删除按钮添加点击事件监听器,点击时移除对应的列表项deleteButton.addEventListener('click', function () {todoList.removeChild(listItem);});// 将删除按钮添加到列表项中listItem.appendChild(deleteButton);// 将新的列表项添加到待办事项列表todoList.appendChild(listItem);// 清空输入框,以便用户输入下一个任务todoInput.value = '';}});// 为待办事项列表添加点击事件监听器,用于标记任务完成todoList.addEventListener('click', function (e) {if (e.target.tagName === 'LI') {e.target.classList.toggle('completed');}});
});
在上述代码中,首先使用 document.addEventListener('DOMContentLoaded', function () {...}) 确保整个 HTML 页面的 DOM 结构加载完毕后,才开始执行后续的 JavaScript 代码。这一步骤至关重要,因为若过早执行,可能会因 DOM 元素未完全加载而导致无法获取到相应元素,引发错误。
接着,通过 document.getElementById 精准获取到输入框、添加按钮以及待办事项列表的 DOM 元素引用,并分别存储在 todoInput、addButton 和 todoList 变量中,方便后续操作。
当用户在输入框输入任务文本并点击添加按钮时,addButton.addEventListener('click', function () {...}) 中的代码被触发。首先,获取输入框中的文本并去除首尾空格,若文本不为空,则开启创建新任务列表项的流程。使用 document.createElement('li') 生成一个新的 <li> 元素,并将输入的任务文本赋值给它的 textContent 属性,使其显示在页面上。同时,创建一个用于删除任务的按钮,同样为其添加点击事件监听器,当点击删除按钮时,执行 todoList.removeChild(listItem),直接从 DOM 树中移除对应的列表项,实现任务删除功能。最后,将新创建的列表项添加到待办事项列表中,并清空输入框,等待用户输入下一个任务。
为了实现标记任务完成的功能,利用 todoList.addEventListener('click', function (e) {...}) 为整个待办事项列表添加点击事件监听器。当用户点击列表中的某个任务项(<li> 元素)时,通过判断 e.target.tagName === 'LI',确认点击的是任务项本身,随后使用 e.target.classList.toggle('completed'),动态切换任务项的 completed 类名。在 CSS 样式表中,可预先定义 .completed 类的样式,如添加删除线、改变字体颜色等,以此直观地呈现任务的完成状态,为用户提供清晰的视觉反馈,让待办事项管理更加便捷高效。
六、进阶拓展:异步编程与 Ajax
6.1 异步编程概念
在 JavaScript 的编程世界里,同步与异步犹如两条截然不同的执行路径,深刻影响着程序的运行逻辑与用户体验。
同步编程,恰似一位按部就班的 “执行者”,每一行代码都必须严格遵循顺序依次执行,犹如工厂流水线上的一道道工序,前一个任务未完成,后续任务只能默默等待。以读取本地文件为例,若使用同步方式,程序会在发出读取指令后,如同被定格一般,死死 “卡住”,直至文件完整读取并返回结果,才肯继续执行下一行代码。这种 “死等” 模式,在处理耗时较短的任务时,或许尚可接受;但一旦遭遇如大规模数据读取、复杂网络请求等耗时漫长的操作,问题便会接踵而至。整个程序仿佛陷入泥沼,界面冻结,用户的任何操作都得不到即时响应,极大地损害了用户体验。
而异步编程,则像是一位高效的 “多面手”,当遇到诸如网络请求、文件读取这类耗时操作时,它不会傻傻等待,而是迅速开启新的任务分支,将后续代码的执行权交予主线程,让程序得以继续流畅运行。以网页加载图片为例,当浏览器发起图片加载请求后,并不会停滞不前,而是立即着手处理其他页面元素的渲染、脚本的执行等任务。待图片数据从服务器慢悠悠地传输回来,再由专门的回调函数或异步处理机制,将图片巧妙地安置到对应的位置。如此一来,用户便能在图片加载的间隙,正常进行页面滚动、点击链接等操作,页面始终保持着鲜活的响应能力,极大提升了交互的流畅性。
再看一个从服务器获取数据来更新页面内容的场景。在同步模式下,页面会在数据请求发出后陷入僵局,直到数据完整抵达,才一次性更新页面,这期间用户面对的是毫无变化的 “白板”,极易产生焦虑与不耐烦。而采用异步编程,数据请求悄然在后台运作,主线程继续渲染页面骨架、设置基础样式,待数据到手,再通过 DOM 操作逐步、动态地填充内容,用户看到的是一个逐步鲜活起来的页面,交互体验天差地别。异步编程的核心优势,就在于巧妙地利用等待时间,让程序的各个部分并行推进,避免因个别耗时操作拖垮整个系统的响应速度,为用户带来丝滑流畅的浏览与操作体验。
6.2 Ajax 原理与使用
Ajax(Asynchronous JavaScript and XML),作为前端开发领域的一项关键技术,犹如一座隐形的桥梁,无缝连接着前端页面与后端服务器,实现了数据的异步交互与页面的局部更新,为用户带来流畅、高效的浏览体验。
其核心原理依托于 XMLHttpRequest 对象(在现代浏览器中,也常使用更为简洁的 Fetch API),这一对象恰似一位 “幕后信使”,能够在不刷新整个页面的前提下,悄然向服务器发送 HTTP 请求,并机智地接收、处理服务器返回的数据。以一个常见的网页场景为例,当用户在搜索框输入关键词,期望实时获取搜索建议时,Ajax 便开始大展身手。
使用 XMLHttpRequest 对象发起请求,代码大致如下:
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api/search?q=' + encodeURIComponent(keyword), true);
xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {const response = JSON.parse(xhr.responseText);// 处理搜索建议数据,如更新下拉列表展示}
};
xhr.send();
这里,首先创建了 XMLHttpRequest 实例,通过 open 方法精心配置请求的类型(GET)、目标 URL(包含搜索关键词)以及异步模式(true)。接着,为 onreadystatechange 事件绑定回调函数,宛如设置了一个敏锐的 “瞭望哨”,时刻紧盯请求状态的变化。当 readyState 达到 4(意味着请求已完成,数据接收完毕)且状态码为 200(表示请求成功)时,便迅速对返回的 JSON 数据进行解析,并依据数据内容更新页面的搜索建议区域,整个过程页面纹丝不动,用户却能实时获取反馈。
Fetch API 则以一种更加现代化、简洁的语法实现类似功能:
fetch('https://example.com/api/search?q=' + encodeURIComponent(keyword)).then(response => response.json()).then(data => {// 处理搜索建议数据}).catch(error => {console.error('搜索请求出错:', error);});
Fetch API 采用链式调用的 Promise 风格,通过 then 方法依次处理请求成功后的响应解析、数据处理步骤,若途中出现错误,catch 方法便能精准捕获并处理,让异步数据交互的代码逻辑更加清晰、易读。
不妨再看一个完整的示例,从服务器获取待办事项列表数据并实时更新页面展示:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax待办事项示例</title><style>#todo-list {list-style-type: none;padding: 0;}#todo-list li {border: 1px solid #ccc;margin: 5px;padding: 5px;}</style>
</head><body><h1>待办事项列表</h1><ul id="todo-list"></ul><script>document.addEventListener('DOMContentLoaded', function () {const todoList = document.getElementById('todo-list');// 使用Fetch API获取待办事项数据fetch('https://example.com/api/todos').then(response => response.json()).then(todos => {todos.forEach(todo => {const listItem = document.createElement('li');listItem.textContent = todo.task;todoList.appendChild(listItem);});}).catch(error => {console.error('获取待办事项出错:', error);});});</script>
</body></html>
在上述代码中,页面加载完成后,通过 Fetch API 向指定服务器接口发送请求,成功获取数据后,循环遍历待办事项数组,动态创建 DOM 元素并添加到页面列表中,瞬间为用户呈现出最新的待办任务清单,全程无刷新,交互体验流畅自然。Ajax 技术的应用,让网页告别了频繁整页刷新的笨拙,实现了数据与页面展示的精妙同步,极大提升了用户体验与应用的响应效率。
七、前沿框架:Vue.js 入门窥探
7.1 Vue.js 简介
在当今蓬勃发展的前端开发领域,Vue.js 宛如一颗璀璨夺目的新星,以其卓越的特性迅速赢得了广大开发者的青睐,成为构建现代用户界面的得力工具。
Vue.js 最为突出的优势之一便是其精妙绝伦的响应式数据绑定机制。传统的 JavaScript 开发模式下,当数据发生变化时,开发者需手动编写冗长繁杂的代码来精准定位并更新对应的 DOM 元素,这一过程极易出错且效率低下,犹如在错综复杂的迷宫中艰难寻路。而 Vue.js 通过其内部强大的响应式系统,能够自动 “感知” 数据的细微变化,宛如一位时刻警觉的守护者,一旦数据有所异动,便立即高效且智能地更新与之关联的 DOM 内容,确保视图与数据始终保持高度一致,实现无缝同步。
组件化开发则是 Vue.js 的另一大 “杀手锏”。它倡导将复杂的用户界面拆解为一个个独立、可复用的小型组件,恰似将一座宏伟的大厦拆分为众多标准化的积木模块。每个组件都拥有自己独立的 HTML 模板、JavaScript 逻辑以及 CSS 样式,它们既能在不同场景下被重复调用,又能依据需求灵活组合,极大地提升了开发效率与代码的可维护性。例如,在构建一个大型电商网站时,头部导航栏、商品列表、购物车等功能模块均可封装为独立组件,开发团队可并行推进各组件的开发,后续若需优化某个组件,也只需聚焦于该组件内部代码,避免牵一发而动全身,让项目开发与维护变得井井有条。
对比原生 JavaScript 开发,Vue.js 的高效性体现得淋漓尽致。以构建一个具有动态数据展示与交互功能的页面为例,原生 JavaScript 需要耗费大量精力处理 DOM 操作、事件绑定以及数据更新的复杂逻辑,代码往往冗长且晦涩难懂,如同杂乱无章的线缆交织在一起;而 Vue.js 凭借简洁优雅的模板语法、高效的数据绑定以及组件化架构,能够以更少的代码量、更清晰的逻辑结构实现同样甚至更为强大的功能,宛如一位技艺精湛的魔法师,用简洁的咒语变出绚丽的魔法,让开发者从繁琐的底层操作中解脱出来,将更多精力投入到业务逻辑与用户体验的优化上,快速打造出高性能、交互性强的优质网页应用。
7.2 基础使用示例
下面通过一个简单的计数器示例,来初步领略 Vue.js 的魅力与便捷。
首先,引入 Vue.js 库。可以通过在 HTML 页面的<head>标签内使用<script>标签引入 CDN 链接,如下:
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
接着,在 HTML 的<body>标签内创建一个 DOM 元素作为 Vue 实例的挂载点,例如:
<div id="app"></div>
然后,编写 JavaScript 代码创建 Vue 实例并进行数据绑定:
var app = new Vue({el: '#app',data: {count: 0}
});
这里,el属性指定了 Vue 实例挂载的 DOM 元素选择器,data对象则包含了应用所需的数据,此处仅有一个count属性,初始值为 0。
在 HTML 中,使用 Vue.js 的模板语法将数据绑定到 DOM 元素上:
<div id="app"><p>当前计数:{{ count }}</p><button @click="count++">点击增加</button>
</div>
在上述代码中,双大括号{ { count }}便是 Vue.js 的文本插值语法,它能够实时将count的数据渲染到 DOM 中,让用户直观看到当前计数。而@click="count++"则是 Vue.js 的事件绑定语法,它监听按钮的点击事件,每次点击时,count的值便会自动加 1,由于 Vue.js 的响应式特性,与之绑定的 DOM 内容也会瞬间更新,完美展现数据双向绑定的效果。
不妨设想一下,如果使用原生 JavaScript 来实现相同功能,需要手动获取 DOM 元素、监听按钮点击事件、更新数据并操作 DOM 来修改显示文本,代码复杂度大幅提升,且易出现诸如事件绑定错误、DOM 更新不及时等问题。而 Vue.js 通过简洁的语法糖,将复杂的交互逻辑封装得优雅而高效,让开发者能轻松构建动态交互界面,开启便捷开发之旅。
八、总结与展望
至此,我们已一同穿越了 JavaScript 前端开发的核心地带,领略了其从基础语法、DOM 操作、事件处理,到实战应用、异步编程以及前沿框架 Vue.js 入门的独特魅力。在这个过程中,我们明晰了变量与数据类型的精妙差异,熟练掌握了条件循环语句与函数的灵活运用,学会了运用 DOM 操作精准掌控网页元素,巧用事件处理搭建起用户与网页交互的坚实桥梁,通过实战打造出实用的待办事项列表,深入理解异步编程提升页面性能,并初探 Vue.js 感受现代框架的高效便捷。
然而,JavaScript 的世界广袤无垠,始终处于蓬勃发展之中。新的特性、框架、工具如繁星般不断涌现。作为前端开发者,持续学习是我们前行的不二法则。需时刻关注 ECMAScript 的最新标准,探索如 React、Angular 等其他前沿框架的独特优势,深入钻研 WebAssembly、PWA 等新兴技术,将其巧妙融入项目,创造更为精彩卓越的用户交互体验。愿大家在 JavaScript 前端开发的征程中,不断探索、砥砺奋进,书写属于自己的精彩篇章,让互联网世界因我们的代码而绽放更加绚烂的光彩。
相关文章:
探索JavaScript前端开发:开启交互之门的神奇钥匙(二)
目录 引言 四、事件处理 4.1 事件类型 4.2 事件监听器 五、实战案例:打造简易待办事项列表 5.1 HTML 结构搭建 5.2 JavaScript 功能实现 六、进阶拓展:异步编程与 Ajax 6.1 异步编程概念 6.2 Ajax 原理与使用 七、前沿框架:Vue.js …...
什么是网络爬虫?Python爬虫到底怎么学?
最近我在研究 Python 网络爬虫,发现这玩意儿真是有趣,干脆和大家聊聊我的心得吧!咱们都知道,网络上的信息多得就像大海里的水,而网络爬虫就像一个勤劳的小矿工,能帮我们从这片浩瀚的信息海洋中挖掘出需要的…...
React 中hooks之 React.memo 和 useMemo用法总结
1. React.memo 基础 React.memo 是一个高阶组件(HOC),用于优化函数组件的性能,通过记忆组件渲染结果来避免不必要的重新渲染。 1.1 基本用法 const MemoizedComponent React.memo(function MyComponent(props) {/* 渲染逻辑 *…...
springboot基于微信小程序的手机银行系统
Spring Boot基于微信小程序的手机银行系统是一种结合现代Web技术和移动应用优势的创新金融服务平台。 一、系统背景与意义 随着信息技术的快速发展和用户对便捷金融服务需求的日益增长,传统手机银行系统的人工管理方法已逐渐显露出效率低下、安全性低以及信息传输…...
Kafka后台启动命令
#保存日志 nohup ./kafka-server-start.sh ../config/server.properties > /path/to/logfile.log 2>&1 &#不保存日志 nohup ./kafka-server-start.sh ../config/server.properties >/dev/null 2>&1 & nohup: 是一个Unix/Linux命令,用于…...
面试题目1
文章目录 C语言函数调用详细过程C语言中const与C中const的区别关系运算符有哪些互斥锁与读写锁的区别gcc的编译过程 C语言函数调用详细过程 调用函数:当程序执行到函数调用语句时,会将当前函数的返回地址、参数列表等信息压入栈中,然后跳转到…...
Android AutoMotive --CarService
1、AAOS概述 Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统,它是基于现有Android系统的基础上增加了新特性,最主要的就是增加了CarService(汽车服务)模块。我们很容易把Android AutoMotive和Android Auto搞混&…...
CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅
CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅 🌟 默语,是一位在技术分享与社区建设中坚持深耕的博客作者。今年,我有幸再次入围成为 CSDN 博客之星TOP300 的一员,这既是对过往努力的肯定,也是对未来探…...
【Vim Masterclass 笔记24】S10L43 + L44:同步练习10 —— 基于 Vim 缓冲区的各类基础操作练习(含点评课)
文章目录 S10L43 Exercise 12 - Vim Buffers1 训练目标2 操作指令2.1. 打开 buf* 文件2.2. 查看缓冲区 View the buffers2.3. 切换缓冲区 Switch buffers2.4. 同时编辑多个缓冲区 Edit multiple buffers at once2.5. 缓冲区的增删操作 Add and delete buffers2.6. 练习 Vim 内置…...
python如何使得pdf加水印后的大小尽可能小
在 Python 中为 PDF 添加水印并尽可能减少文件大小,可以采取以下优化策略: 1. 使用合适的库 常用的 PDF 处理库: PyMuPDF(fitz):高效且优化的 PDF 处理reportlab pdfrw:可实现水印合并&#…...
Leetcode 3429. Paint House IV
Leetcode 3429. Paint House IV 1. 解题思路2. 代码实现 题目链接:3429. Paint House IV 1. 解题思路 这一题解法上就是一个动态规划的思路,由于题目有两个限制条件,即相邻不可以同色,以及前后同位置不可以同色,因此…...
ASP.NET Core 实战:JWT 身份验证
一、引言 在当今数字化时代,Web 应用的安全性至关重要。ASP.NET Core 作为一种广泛应用的开发框架,为开发者提供了强大的工具来构建安全可靠的应用程序。而 JWT(JSON Web Token)身份验证则是保障应用安全的关键环节之一。 JWT 身…...
【学习笔记15】如何在非root服务器中,安装属于自己的redis
一、下载安装包 官网下载黑马程序员给的安装包(redis-6.2.6) 二、将安装包上传至服务器 我将安装包上传在我的文件夹/home/XXX,指定路径中/src/local/redis/,绝对路径为/home/XXX/src/local/redis/解压安装包 XXXomega:~$ cd …...
基于深度学习的微出血自动检测及解剖尺度定位|文献速递-视觉大模型医疗图像应用
Title 题目 Toward automated detection of microbleeds with anatomical scale localization using deep learning 基于深度学习的微出血自动检测及解剖尺度定位 01 文献速递介绍 基于深度学习的脑微出血(CMBs)检测与解剖定位 脑微出血ÿ…...
Couchbase UI: Dashboard
以下是 Couchbase UI Dashboard 页面详细介绍,包括页面布局和功能说明,帮助你更好地理解和使用。 1. 首页(Overview) 功能:提供集群的整体健康状态和性能摘要 集群状态 节点健康状况:绿色(正…...
Python
1 变量 1.1 定义 变量:为快速定义目标,将数据在内存占据的存储空间分配的一个名称。 定义:变量名 数据值 作用:临时存储数据 message "hello" print(message)#输出:hello message "hello Pytho…...
一个软件分发和下载的网站源码,带多套模板
PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP,带下载统计,带多套模板,带图文教程 代码下载:百度网盘...
war包 | Docker部署flowable-ui
文章目录 引言I war包部署flowable-ui下载war包配置Tomcat访问 flowable-uiII Docker启动flowable-ui并修改配置Docker启动flowable-ui修改配置访问Flowable UI界面。III 知识扩展加速源docker run -i -t -d 参数引言 Flowable 支持 BPMN 2.0 行业标准,同时提供了一些 Flowab…...
07_游戏加载窗口
隐藏动态提示窗口 创建空节点 命名为 LoadingWnd 意为加载窗口 并设置全屏 在子级下创建Image作为加载背景 也设置成全屏 将以下资源放进Art文件夹中 设置好精灵模式后拖拽至 Image的Source Image框选 创建文本作为提示内容 增加描边组件OutLine可以美化字体 创建Image作为加载…...
proxyman抓包Java中feign请求以及断点请求响应内容修改或流转到本地
proxyman抓包Java中feign请求以及断点请求响应内容修改或流转到本地 配置流程第一步: 借助arthas配置请求代理第二步: 借助proxyman配置远程映射第三步: 借助SwitchHosts配置hosts域名最后: 借助ssh的LocalForward功能, 打通网络(这步网络不通才需要) 最近在修bug的过程中, 因为…...
PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明
1、基本介绍 torchinfo是一个为PyTorch用户量身定做的开源工具,其核心功能之一是summary函数。这个函数旨在简化模型的开发与调试流程,让模型架构一目了然。通过torchinfo的summary函数,用户可以快速获取模型的详细结构和统计信息࿰…...
centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐
环境:centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…...
MongoDB 备份与恢复综述
目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库,它使用文档存储数据,支持丰富的查询语言和索引…...
Apache Hive3定位表并更改其位置
Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…...
Flutter项目和鸿蒙平台的通信
Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候, Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…...
5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)
目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…...
嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础
嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译? 4.为什么要交叉编译? 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…...
thinkphp8在使用apidoc时, 4层的接口会有问题 解决办法
thinkphp8 4层的接口会有问题, 比如这样的接口 /adminapi/notice/announcements/lists, 应该换成 /adminapi/notice.announcements/lists 这样才行, 有没有人处理过? 实际上在官网的帮助里有描述 自动生成的url不对? | Apidoc // config/apidoc.php //... auto_url…...
【jmeter】下载及使用教程【mac】
1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本,下载以 .dmg 结尾的安装包,注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…...
C# ASP.NET MVC项目内使用ApiController
1.在App_Start文件夹新建WebApiConfig.cs文件,建立webApi路由的注册方法。 using System.Web.Http;namespace PrivilegeManager {public class WebApiConfig{public static void Register(HttpConfiguration config){config.MapHttpAttributeRoutes();config.Route…...
Langchain+FastApi+Vue前后端Ai对话(超详细)
一、引入 首先可以先看下作者的文章 FastApi相关文章:创建最简单FastApi的项目Vue相关文章:最简单的aixos二次封装Langchain相关文章:如何使用LangSmith跟踪deepseek模型 二、后端搭建 1 项目文件结构 routers:存放api接口se…...
【电脑无法通过鼠标和键盘唤醒应该怎么办】
【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):...
OpenCV相机标定与3D重建(65)对图像点进行去畸变处理函数undistortPoints()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从观测到的点坐标计算理想点坐标。 该函数类似于 undistort 和 initUndistortRectifyMap,但它操作的是稀疏点集而不是光栅图像。此外…...
Logo语言的函数实现
Logo语言的函数实现 引言 Logo语言是一种教育性编程语言,最初由西摩尔派普特(Seymour Papert)在1960年代开发。它以“海龟图形”(Turtle Graphics)而闻名,通过简单的命令控制一只“海龟”在屏幕上绘制图形…...
前沿技术对比:大模型技术为什么发展远快于区块链技术,中英对照解释
文章目录 前言1、技术复杂性与成熟度 / Technical Complexity and Maturity2.、应用场景与行业需求 / Application Scenarios and Industry Demand3、监管与法律问题 / Regulatory and Legal Issues4、去中心化与网络效应 / Decentralization and Network Effects5、能源消耗与…...
Java设计模式 九 桥接模式 (Bridge Pattern)
桥接模式 (Bridge Pattern) 桥接模式是一种结构型设计模式,它的核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合而不是继承的方式来扩展功能,从而减少类之间的耦合度。 1. 模式结构 桥接模式的结构包括以下角色&…...
stm8s单片机(二)外部中断实验
中断优先级 stm8的中断优先级不是固定不变的,stm8的中断分为硬件优先级与软件优先级;当多个中断发生时,cpu会先响应软件优先级高的中断,若软件优先级相同会先响应硬件优先级高的; 其中软件优先级有四个 /*** brief …...
计算机网络 (53)互联网使用的安全协议
一、SSL/TLS协议 概述: SSL(Secure Sockets Layer)安全套接层和TLS(Transport Layer Security)传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发,广泛应用于基于万维网的各种网络…...
数学基础 --线性代数之理解矩阵乘法
理解矩阵乘法的解析 矩阵乘法(Matrix Multiplication)是线性代数中的核心操作之一。在数学、几何和工程实际中,它不仅是一种代数运算规则,还承载着丰富的几何和映射意义。本文将从多个角度深入解析矩阵乘法,帮助读者理…...
数学规划问题2 .有代码(非线性规划模型,最大最小化模型,多目标规划模型)
非线性规划模型 FIrst:转化为标准型 在matlab中求非线性规划的函数 练习题: 典型例题: 最大最小化模型 核心思想: matlab的模型求解 经典例题: 多目标规划模型 基本概念 求解思路: 模型构建步骤 经典例题: 非线性规划模型 非线性规划(Nonl…...
jax 和 jaxlib 的 cuda 版本安装
笔者花费时间才在 Ubuntu 20.04 适配上 jax 和 jaxlib 的 cuda 版本安装,以及 chex 版本。 版本展示 本人版本展示 jax0.4.27 ,jaxlib0.4.27cuda12.cudnn89,chex0.1.86。 安装过程 cuda 以及环境变量配置过程 首先安装cuda12.4和cudnn8.9&…...
Spring Boot MyBatis Plus 版本兼容问题(记录)
Spring Boot & MyBatis Plus 版本兼容问题(Invalid value type for attribute factoryBeanObjectType: java.lang.String) 问题描述问题排查1. 检查 MapperScan 的路径2. 项目中没有配置 FactoryBean3. 检查 Spring 和 MyBatis Plus 版本兼容性 解决…...
Ubuntu如何安装redis服务?
环境: Ubuntu22.04 WSL2 问题描述: 如何安装redis服务? 解决方案: 1.在 Linux 上(如 Ubuntu/Debian)安装 1.通过包管理工具安装 Redis 服务器: sudo apt update sudo apt install redis…...
FFmpeg 头文件完美翻译之 libavcodec 模块
前言 众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内…...
设计模式的艺术-单一职责原则
1.基础知识 是最简单的面向对象设计原则,它用于控制类的粒度大小。 一个类只负责一个功能领域中的相应职责。 单一职责原则的核心思想是:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法&…...
MySQL主从配置
一、 主从原理 MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。主从同步的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执行这些日志中的操作。 二、主…...
【Unity3D实现雨下在窗户上的效果】
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、原理👉三、使用步骤3-1、shader代码纹理映射数学运算和函数的运用特效算法的实现高效的性能优化👉壁纸分享👉总结👉前言 想要好看的效果肯定是要用shader实现啦,为什么呢? 因为Shade…...
k8s资源预留
k8s资源预留 https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources/ vim /var/lib/kubelet/config.yamlenforceNodeAllocatable: - pods kubeReserved: # 配置 kube 资源预留cpu: 500mmemory: 1Giephemeral-storage: 1Gi systemReserved: #…...
云计算与物联网技术的融合应用(在工业、农业、家居、医疗、环境、城市等整理较全)
摘要 为生产领域带来更加全面和深入的变革。通过云计算平台对物联网数据进行处理和分析,企业可以实现对生产过程的更加精细化的管理和控制。 1. 智能生产调度 通过云计算和物联网技术的融合应用,企业可以实现对生产线上各个环节的实时监控和数据分析。…...
【深度学习】2.视觉问题与得分函数
计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大,像素点越亮。 最后的3表示三个颜色通道,常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…...