浏览器对象详解
文章目录
- 浏览器对象详解
- 一、参考资料
- 二、认识浏览器运行态下的 js
- 1.问:是否了解浏览器的执行态(分层设计)?
- 2.BOM
- 1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)
- 拓展方向:
- 2.[History](https://developer.mozilla.org/zh-CN/docs/Web/API/History)
- 3.[navigator](https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator)
- 4.[screen](https://developer.mozilla.org/zh-CN/docs/Web/API/Screen)
- 三、浏览器事件
- 1.addEventListener 第三个参数
- 2.阻断事件传播
- 3.阻止默认行为
- 拓展方向
- 性能方向
- 兼容性方向
- 四、网络请求
- 1.XMLHttpRequest
- 2.fetch
- 3.Http 状态码和 Header
- 1.状态码
- [1|2|3]xx
- 4xx
- 5xx
- 2.字段
- 4.拓展方向
- 如何应对网络不稳定(波动)的情况?
- 如何处理并发请求?
- 往期精彩文章
浏览器对象详解
一、参考资料
- 浏览器对象模型
- 聊聊 H5 的 pushState 与 replaceState
- 用 Javascript 获取页面元素的位置
- js 获取操作元素位置
二、认识浏览器运行态下的 js
1.问:是否了解浏览器的执行态(分层设计)?
- ECMAScript - 基础逻辑、数据处理,js 语法块
- BOM - 浏览器本身的能力操作
- Browser Object Model(浏览器对象模型)
- 浏览器模型提供了独立于内容的、可以与浏览器窗口进行滑动的对象结构,就是浏览器提供的 API
- DOM - 浏览器文本的操作
2.BOM
1.location
提供当前窗口中的加载的文档有关的信息和一些导航功能。
既是 window 对象属性,也是 document 的对象属性
window.location === document.location; //true// https://www.zhihu.com/search?type=content&q=123location.href ='https://www.zhihu.com/search?type=content&q=123'.origin = // 完整的url'https://www.zhihu.com'.host = // 页面的标准域名'www.zhihu.com'.hash = // 服务器名称+端口 例如:‘www.zhihu.com:8080’'#hash'.pathname = // url中#号后面的哈希值'/search'.search = // url中[/]后面内容'?type=content&q=123'.protocol = // url中[?]后面内容'https:'.port = // 协议[http:]''; //端口号:[ 80 | 8080 | ... ]
方法:
- assign()
不会打开新窗口
,把请求 url 中的资源,加载到当前窗口- 会给浏览器的
History
中增加一条历史记录
- replace(url)
- 用 url 中的内容,替换掉当前的 location 资源
- 不会在浏览器的
History
中增加记录,意味着用户不能使用回退
按钮
- reload()
- 重新加载当前 url 的内容
- 当 reload(true)时,会
强制从服务器获取
所有内容 - 若没有参数,重新加载时,
可能从浏览器缓存
加载页面
拓展方向:
- location 本身 api 操作
- assign VS replace 的区别
- 解析 url 中的查询字符串,返回一个对象
- 思路:
- 可以通过
正则
的方式获取,或者通过字符串分割
的方式 - 通过
location.search
获取查询字符串内容,如果有[?]
就截取[?]
后面的内容 - 然后通过
[&]
进行分割成为['key=val1','key=val2']
的形式 - 通过
[=]
对数组进行分割,使用decodeURIComponent
对 key 和 val 进行解码,存放到对象中
- 路由相关: 跳转、参数、操作
- 页面能否
返回
(history) - 页面是否
刷新
(hash) - reload、assign、replace 参数等
- 页面能否
- URI or URL 的区别?
- URI
Uniform Resource Identifier - 统一资源标识符
- URL
Uniform Resource Locator - 统一资源定位符
- URI
2.History
history.state.length; // 当前页面的状态 // 返回当前 `会话` 中的 history 个数
方法:
- pushState(state, title, url)
- 给当前的 history 中添加一个状态
- 浏览器地址会改变,但是不会加载页面,本质上页面还是停留在原来的页面
- replaceState()
- 与 pushState 方法类似,但是
不会添加
一个新的 state 到 history 中,而是直接修改当前
state
- 与 pushState 方法类似,但是
相关联的方法
- window.onpopstate()
- 每当处于激活状态的历史记录条目发生变化时,
popstate
事件就会在对应 window 对象上触发 - 调用
history.pushState()
或者history.replaceState()
不会
触发 popstate 事件。 - popstate 事件只会在
浏览器
某些行为下触发
- 比如点击后退、前进按钮(或者在 JavaScript 中调用 history.back()、history.forward()、history.go()方法)
- 每当处于激活状态的历史记录条目发生变化时,
例子:
window.onpopstate = function (event) {alert('location: ' +document.location +', state: ' +JSON.stringify(event.state),);
};
//绑定事件处理函数.
history.pushState({ page: 1 }, 'title 1', '?page=1'); //添加并激活一个历史记录条目 http://example.com/example.html?page=1,条目索引为1
history.pushState({ page: 2 }, 'title 2', '?page=2'); //添加并激活一个历史记录条目 http://example.com/example.html?page=2,条目索引为2
history.replaceState({ page: 3 }, 'title 3', '?page=3'); //修改当前激活的历史记录条目 http://ex..?page=2 变为 http://ex..?page=3,条目索引为3
history.back(); // 弹出 "location: http://example.com/example.html?page=1, state: {"page":1}"
history.back(); // 弹出 "location: http://example.com/example.html, state: null
history.go(2); // 弹出 "location: http://example.com/example.html?page=3, state: {"page":3}
3.navigator
浏览器系统信息大集合
- clipboard
- 系统剪切板相关信息
- userAgent
- 当前用户的设备信息
- onLine
- 返回浏览器的在线状态
- serial
- 返回串口对象,Web Serial API 的入口点
- bluetooth
- 系统蓝牙相关
…
- 系统蓝牙相关
4.screen
用来表示浏览器窗口外部的显示器的信息等
window.screen.deviceXDPI/deviceYDPI 屏幕实际的水平 DPI、垂直 DPI
三、浏览器事件
浏览器事件模型主要分为三个阶段:
- 捕获阶段(IE)
- 事件由最外层元素(window),层层向内传递,直到最具体的元素
- 目标阶段
- 冒泡阶段(网景)
- 事件由最具体的元素(事件的触发者),层层向外传递(传递给父节点),直到 window 对象停止
1.addEventListener 第三个参数
el.addEventListener(event, function, useCapture)
// useCapture默认值false,也就是默认冒泡
// true为捕获阶段
2.阻断事件传播
- event.stopPropagation()
阻断
事件的传播- 但是无法阻止默认事件
- event.stopImmediatePropagation()
- 如果有多个
相同类型
的事件监听函数绑定到同一个
元素 - 当该类型的事件触发时,它们会按照被
添加的顺序
执行 - 如果其中某个监听函数执行了此方法,则当前元素
剩下
的监听函数将不会
被执行
- 如果有多个
3.阻止默认行为
- e.preventDefault()
- e.preventDefault()可以阻止事件的默认行为发生
- 默认行为是指:点击 a 标签就转跳到其他页面、拖拽一个图片到浏览器会自动打开、点击表单的提交按钮会提交表单等等,因为有的时候我们并不希望发生这些事情,所以需要阻止默认行为
拓展方向
性能方向
- 如:事件委托的运用,一个 ul 和多个 li,点击 li 时,改变背景颜色
{/*
<ul class="list"><li>1</li><li>2</li><li>3</li>
</ul>
*/
}
var list = document.querySelector('list');function onClick(e) {var e = e || window.event;if (e.target.tagName.toLowerCase() === 'li') {// 业务逻辑...e.target.style.backgroundColor = 'pink';}
}list.addEventListener('click', onClick, false);
兼容性方向
- 如:写一个兼容 IE 的事件绑定
先区别 IE 的不同之处
- 绑定事件的函数和传参不同: 使用
attachEvent
绑定,事件名要加on
- 解绑时使用的函数和参数不同: 使用
detachEvent
解绑 - 阻断时的不同:
event.cancelBubble = true
- 阻止默认行为的不同:
event.returnValue = false
class BindEvent {constructor(el) {this.el = el;}addEventListener(type, handler) {if (this.el.addEventListener) {this.el.addEventListener(type, handler, false);} else if (this.el.attachEvent) {this.el.attachEvent('on' + type, handler);} else {this.el['on' + type] = handler;}}removeEventListener(type, handler) {if (this.el.removeEventListener) {this.el.removeEventListener(type, handler, false);} else if (this.el.detachEvent) {this.el.detachEvent('on' + type, handler);} else {this.el['on' + type] = null;}}static stopPropagation() {if (e.stopPropagation) {e.stopPropagation();} else {e.cancelBubble = true;}}static preventDefault() {if (e.preventDefault) {e.preventDefault();} else {e.returnValue = false;}}
}
四、网络请求
1.XMLHttpRequest
- 属性
- responseText(服务端响应的文本数据)
- responseXML(服务点响应的 xml 或者 html 类型数据)
- status(响应 HTTP 状态)
- statusText(响应 HTTP 状态描述)
- readyState(发出请求的状态码)对应
onreadystatechange
事件- 0:创建成功,但是没有调用 open 方法
- 1:open 方法被调用
- 2:send 方法被调用
- 3:loading,下载中
- 4:下载操作完成
- timeout(超时时间,对应超时事件
ontimeout
,ontimeout 事件被弃用) - upload(上传进度)
- 方法
- open() 初始化请求(method, url, async),async 表示是否异步操作,默认 true
- send() 发送请求数据,get 请求时,send 可以不传或者 null
- abort() 中止已经发出的请求
- setRequestHeader() 设置请求头信息
- getRequestHeader() 获取指定响应头信息
- getAllResponseHeaders() 获取所有响应头信息
封装 XMLHttpRequest 请求
function ajax({ method = 'get', url = '', params = undefined }) {return new Promise((resolve, reject) => {let xhr = new XMLHttpRequest();if (method.toLowerCase() === 'get' && params !== undefined) {url = url + '?' + params;}xhr.open(method, url, true);xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status === 200) {resolve(xhr.responseText);} else {reject(xhr.status);}}};if (method.toLocaleLowerCase() === 'get') {xhr.send();} else {xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send(params);}xhr.onerror = (err) => reject(err);xhr.timeout = () => reject('timeout');// progress事件可以报告长时间运行的文件上传xhr.upload.onprogress = (p) => {console.log(Math.round((p.loaded / p.total) * 100) + '%');};});
}
2.fetch
- 方法:fetch(url,{}| init 对象 ),返回 Promise 对象,只支持异步
- 响应通过 response 对象获取:
fetch().then((response)=>{}).catch(()=>{})
- response 对象混入了 body,提供了 5 个方法,将 ReadableStream 转存到缓冲区的内存里,将缓冲区转换为 js 对象,通过 Promise 返回
- response.text() //转为 text
- response.json() //转为 json
- response.formData()
- response.arrayBuffer()
- response.blob()
不支持超时设置
- 但是可以使用
promise+setTimeout
进行控制
- 但是可以使用
- 默认
不携带cookies
,但是可以设置fetch(url, {credentials: 'include'});
- omit 不发送 cookie
- same-origin 同源发送 cookie(默认)
- include 都发送 cookie
- resolve 若发生在网络通信正常(404,500)也是 resolve
- .catch()也不会被执行。
- reject 只发生在网络通信异常
- 想要精确的判断 fetch 是否成功
- 需要包含 promise resolved 的情况,此时再判断 response.ok 是不是为 true
- 需要借用 AbortController 中止 fetch
// resolve若发生在网络通信正常(404,500)也是resolve
fetch('http://domain/service', {method: 'GET',
}).then((response) => {// 想要精确的判断 fetch是否成功// 需要包含 promise resolved 的情况,此时再判断 response.ok是不是为 trueif (response.ok) {return response.json();}throw new Error('Network response was not ok.');}).then((json) => console.log(json))// .catch()也不会被执行.catch((error) => console.error('error:', error));// ************************************
// 不支持直接设置超时, 可以用promise
function fetchTimeout(url, init, timeout = 3000) {return new Promise((resolve, reject) => {fetch(url, init).then(resolve).catch(reject);setTimeout(reject, timeout);});
}
// ************************************
// 中止fetch
// signal用于支持AbortController中断请求
const controller = new AbortController();
// AbortController接口表示一个控制器对象
// 允许你根据需要中止一个或多个 Web请求
fetch('http://domain/service', {method: 'GET',signal: controller.signal,
}).then((response) => response.json()).then((json) => console.log(json)).catch((error) => console.error('Error:', error));
controller.abort();
3.Http 状态码和 Header
1.状态码
100 信息性|200 成功|300 重定向|400 客户端错误|500 服务器错误
[1|2|3]xx
- 101 切换协议
- 200 Ok
- 301 永久重定向(设备会缓存)
- 302 临时重定向(以前是临时转移,已经不推荐使用了,建议使用 307)
- 307 临时重定向
- 如果是 POST/DELETE 过来的会继续使用
- 302 只会使用 get
- 304 (Not Modified)服务器文件未修改,协商缓存
- 308 永久重定向
4xx
- 400 客户端请求有语法错误,不能被服务器识别
- 403 服务器受到请求,但是拒绝提供服务,可能是跨域也可是权限不够
- 404 请求的资源不存在
- 405 请求的 method 不允许
5xx
- 500 服务器发生不可预期的错误
2.字段
- Content-Length: 发送给接收者给 Body 内容长度(字节)
- 一个 Byte 是 8bit
- utf-8 编码的字符是 1-4 个字节
- User-Agent:客户端特性的字符串
- Content-Type: 媒体类型
- Origin:描述请求来源地址
- Accept
- 建议服务端返回何种媒体类型
- */*表示所有类型(默认)
- text/html,application/json
- 建议服务端返回何种媒体类型
- Accept-Encoding
- 建议服务端发送什么编码(压缩算法)
- deflate,gzip;q=1.0,*;q=0.5
- Accept-Language: 建议服务端传递那种语言
- Referer
- 告诉服务端打开当前页面的上一张页面的 URL;
- 如果是 ajax 请求那么就告诉服务端发送请求的 URL 的什么
- 非浏览器环境有时候不发生 Referer(或者虚拟 Referer,通常是爬虫)
- 常用来做用户行为分析
- Connection
- 决定链接是否在当前事务完成后关闭
- http1.0 默认是 close
- http1.1 默认是 keep-alive
4.拓展方向
如何应对网络不稳定(波动)的情况?
- 失败了重发,指数补偿
const request = (url) => {let resolved = false;let t = 1;return new Promise((resolve, reject) => {// Promise.race([// fetch(url),// wait(100, () => fetch(url)),// wait(200, () => fetch(url)),// wait(400, () => fetch(url)),// wait(800, () => fetch(url)),// wait(1600, () => fetch(url)),// ])function doFetch() {if (resolved || t > 16) return;fetch(url).then((resp) => resp.text()).then((data) => {if (!resolved) {resolved = true;resolve(data);}});setTimeout(() => {doFetch();t *= 2;}, t * 100);}doFetch();});
};
如何处理并发请求?
- 若
相同
的请求,多次
发送,会照成带宽
的浪费 - 处理思路:做
缓存
- 因为请求具有
时效性
,所以不能做永久缓存
- 相同的请求在
一定的时间
内只发生一次
- 使用
w
保存请求信息,若同一时间发送多次相同对请求 - 使用
w[hash].resolves
保存 resolve 函数- 当请求函数
w[hash].func
发送成功,执行 resolves 中的函数,保证每次请求都有响应信息
- 当请求函数
- 使用
import fetch from 'node-fetch';
function hash(...args) {return args.join(',');
}
function window_it(fn, time = 50) {let w = {}; // 时间窗口let flag = false;return (...args) => {return new Promise((resolve, reject) => {if (!w[hash(args)]) {w[hash(args)] = {resolves: [],func: fn,args,};}if (!flag) {flag = true;setTimeout(() => {Object.keys(w).forEach((key) => {console.log(`run ${key}`);const { func, args, resolves } = w[key];func(...args).then((res) => res.text()).then((data) => {resolves.forEach((r) => {console.log(`resolve ${key}`);r(data);});flag = false;delete w[key];});});}, time);}w[hash(args)].resolves.push(resolve);});};
}const request = window_it(fetch, 20);
request('http://www.baidu.com').then((txt) => console.log(txt.length));
request('http://www.baidu.com').then((txt) => console.log(txt.length));
request('http://www.baidu.com').then((txt) => console.log(txt.length));request('http://www.zhihu.com').then((txt) => console.log(txt.length));
request('http://www.zhihu.com').then((txt) => console.log(txt.length));
request('http://www.zhihu.com').then((txt) => console.log(txt.length));
往期精彩文章
- leetcode-js刷题记录&数据结构
- docker下YApi部署教程-支持swagger数据导入
- 带你深入理解什么叫js闭包
- 使用Object.defineProperty进行数据劫持,实现响应式原理-剖析vue2.0
- 前端性能优化之rel=“prefetch“预/懒加载功能
- 前端唤起相机的方法H5+JS
相关文章:

浏览器对象详解
文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问:是否了解浏览器的执行态(分层设计)?2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向:2.[History](https…...
异步电路后端实现流程(cdc signOff 后端做什么)
一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路,后端会分析sta setup/hold,这里不在赘述。在该scenario下 异步电路是不会分析,也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置:将所…...
Linux网络编程实战介绍
文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...

C++概述 课堂笔记
函数的重载在C语言中函数名是唯一的,不可以重复定义,当我们利用函数执行,功能相似的函数,我们也不能使用同一个函数,比如说,求整型的函数,不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...

一文读懂SpringBoot整合Elasticsearch(一)
(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。) 一、前言 Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...
(数论)(枚举)(前缀和)1230. K倍区间
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 ~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水&…...

万字带你深入理解 Linux 虚拟内存管理(下)
接上文:万字带你深入理解 Linux 虚拟内存管理(上) 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍,现在我们已经熟悉了进程虚拟内存空间的布局,以及内核如何管理这些虚拟内存区域&…...
【iOS】—— JSONModel源码学习
JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客:【iOS】—— JSONMo…...

单片机怎么实现真正的多线程?
所谓多线程都是模拟的,本质都是单线程,因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换,看起来像同时执行的样子。据说最近有多核的单片机,不过成本应该会高很多。对于模拟的多线程,我知道的有两种…...

【LeetCode】剑指 Offer(23)
目录 题目:剑指 Offer 46. 把数字翻译成字符串 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 46. 把…...

[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 汽车威胁狩猎专栏长期更新,本篇最新内容请前往: …...

LinuxFTP文件传输服务和DNS域名解析服务
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
二叉搜索树原理及底层实现
二叉搜索树BST 概念 二叉搜索树又称二叉排序树,它可以是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都…...

python自动化办公(一)
本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数,常用前4个,除了file参数外,其他参数都有默认值。file指定了要打开的文件名称&a…...

LeetCode - 198 打家劫舍
目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 198. 打家劫舍 - 力扣(LeetCode) 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装…...

简单粗暴的分布式定时任务解决方案
分布式定时任务1.为什么需要定时任务?2.数据库实现分布式定时任务3.基于redis实现1.为什么需要定时任务? 因为有时候我们需要定时的执行一些操作,比如业务中产生的一些临时文件,临时文件不能立即删除,因为不清楚用户是…...
蓝桥杯第五天刷题
第一题:数的分解题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2和 4,一共有多少种不同的分解方法&…...

Java数组的定义和使用(万字详解)
目录 编辑 一. 数组的基本概念 1、什么是数组 2、数组的创建及初始化 1、数组的创建 2、数组的初始化 3、数组的使用 (1)数组中元素访问 (3)遍历数组 二、数组是引用类型 1、初始JVM的内存分布 2、基本类型变量与引用类…...

【SpringBoot】自定义Starter
🚩本文已收录至专栏:Spring家族学习之旅 👍希望您能有所收获 一.概述 在使用SpringBoot进行开发的时候,我们发现使用很多技术都是直接导入对应的starter,然后就实现了springboot整合对应技术,再加上一些简…...

【C陷阱与缺陷】----语法陷阱
💯💯💯 要理解一个C程序,必须理解这些程序是如何组成声明,表达式,语句的。虽然现在对C的语法定义很完善,几乎无懈可击,大门有时这些定义与人们的直觉相悖,或容易引起混淆…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...