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

浏览器对象详解

文章目录

  • 浏览器对象详解
    • 一、参考资料
    • 二、认识浏览器运行态下的 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 | ... ]

方法:

  1. assign()
    1. 不会打开新窗口,把请求 url 中的资源,加载到当前窗口
    2. 会给浏览器的History中增加一条历史记录
  2. replace(url)
    1. 用 url 中的内容,替换掉当前的 location 资源
    2. 不会在浏览器的History中增加记录,意味着用户不能使用回退按钮
  3. reload()
    1. 重新加载当前 url 的内容
    2. 当 reload(true)时,会强制从服务器获取所有内容
    3. 若没有参数,重新加载时,可能从浏览器缓存加载页面
拓展方向:
  • 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 - 统一资源定位符

2.History

history.state.length; // 当前页面的状态 // 返回当前 `会话` 中的 history 个数

方法:

  • pushState(state, title, url)
    • 给当前的 history 中添加一个状态
    • 浏览器地址会改变,但是不会加载页面,本质上页面还是停留在原来的页面
  • replaceState()
    • 与 pushState 方法类似,但是不会添加一个新的 state 到 history 中,而是直接修改当前state

相关联的方法

  • 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 永久重定向
    3xx
4xx
  • 400 客户端请求有语法错误,不能被服务器识别
  • 403 服务器受到请求,但是拒绝提供服务,可能是跨域也可是权限不够
  • 404 请求的资源不存在
  • 405 请求的 method 不允许
    4xx
5xx
  • 500 服务器发生不可预期的错误
    5xx

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.问&#xff1a;是否了解浏览器的执行态&#xff08;分层设计&#xff09;&#xff1f;2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向&#xff1a;2.[History](https…...

异步电路后端实现流程(cdc signOff 后端做什么)

一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路&#xff0c;后端会分析sta setup/hold&#xff0c;这里不在赘述。在该scenario下 异步电路是不会分析&#xff0c;也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置&#xff1a;将所…...

Linux网络编程实战介绍

文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...

C++概述 课堂笔记

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

一文读懂SpringBoot整合Elasticsearch(一)

&#xff08;本篇文章主要介绍Spring Boot如何整合Elasticsearch&#xff0c;包括基本配置、数据操作、搜索功能等方面。&#xff09; 一、前言 Elasticsearch是一款全文搜索引擎&#xff0c;可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...

(数论)(枚举)(前缀和)1230. K倍区间

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 &#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&…...

万字带你深入理解 Linux 虚拟内存管理(下)

接上文&#xff1a;万字带你深入理解 Linux 虚拟内存管理&#xff08;上&#xff09; 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍&#xff0c;现在我们已经熟悉了进程虚拟内存空间的布局&#xff0c;以及内核如何管理这些虚拟内存区域&…...

【iOS】—— JSONModel源码学习

JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客&#xff1a;【iOS】—— JSONMo…...

单片机怎么实现真正的多线程?

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

【LeetCode】剑指 Offer(23)

目录 题目&#xff1a;剑指 Offer 46. 把数字翻译成字符串 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 46. 把…...

[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 汽车威胁狩猎专栏长期更新&#xff0c;本篇最新内容请前往&#xff1a; …...

LinuxFTP文件传输服务和DNS域名解析服务

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

二叉搜索树原理及底层实现

二叉搜索树BST 概念 二叉搜索树又称二叉排序树&#xff0c;它可以是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a;若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值&#xff1b;若它的右子树不为空&#xff0c;则右子树上所有节点的值都…...

python自动化办公(一)

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

LeetCode - 198 打家劫舍

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

简单粗暴的分布式定时任务解决方案

分布式定时任务1.为什么需要定时任务&#xff1f;2.数据库实现分布式定时任务3.基于redis实现1.为什么需要定时任务&#xff1f; 因为有时候我们需要定时的执行一些操作&#xff0c;比如业务中产生的一些临时文件&#xff0c;临时文件不能立即删除&#xff0c;因为不清楚用户是…...

蓝桥杯第五天刷题

第一题&#xff1a;数的分解题目描述本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。把 2019 分解成 3 个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包含数字 2和 4&#xff0c;一共有多少种不同的分解方法&…...

Java数组的定义和使用(万字详解)

目录 ​编辑 一. 数组的基本概念 1、什么是数组 2、数组的创建及初始化 1、数组的创建 2、数组的初始化 3、数组的使用 &#xff08;1&#xff09;数组中元素访问 &#xff08;3&#xff09;遍历数组 二、数组是引用类型 1、初始JVM的内存分布 2、基本类型变量与引用类…...

【SpringBoot】自定义Starter

&#x1f6a9;本文已收录至专栏&#xff1a;Spring家族学习之旅 &#x1f44d;希望您能有所收获 一.概述 在使用SpringBoot进行开发的时候&#xff0c;我们发现使用很多技术都是直接导入对应的starter&#xff0c;然后就实现了springboot整合对应技术&#xff0c;再加上一些简…...

【C陷阱与缺陷】----语法陷阱

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

虹科分享| 关于TrueNAS十问十答

上一篇文章我们向您介绍了虹科新品HK-TrueNAS企业存储&#xff0c;很多小伙伴会疑问到底什么是NAS存储&#xff0c;之前常用的磁盘、磁带属于什么存储架构&#xff0c;NAS存储好在哪里&#xff0c;什么时候使用NAS&#xff1f;今天我们整理了关于TrueNAS的十问十答&#xff0c;…...

Https 笔记

HTTP TLS TLS 的前身是 SSL 非对称加密的核心&#xff1a; 两个密钥&#xff08;公私&#xff09; https 需要第三方CA&#xff08;证书授权中心&#xff09;申请SSL证书以确定其真实性 证书种包含了特定的公钥和私钥 密钥交换 自己将私钥上锁后发给对方对方也上锁 在还回来…...

【Python+requests+unittest+excel】实现接口自动化测试框架

一、框架结构&#xff1a; 工程目录 二、Case文件设计 三、基础包 base 3.1 封装get/post请求&#xff08;runmethon.py&#xff09; 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if heade…...

MySQL终端的使用及其数据类型的使用

什么是数据库&#xff1f;数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。我们也可以将数据存储在文件中&#xff0c…...

长视频终局:一场考验资金储备的消耗战

赢者通吃&#xff0c;似乎已成为各行各业的常识&#xff0c;但事实真的是这样吗&#xff1f;20世纪70年代&#xff0c;石油价格高涨&#xff0c;在墨西哥湾油田拍卖中高价拍得油田的企业&#xff0c;要么亏损&#xff0c;要么收入低于预期&#xff0c;但仍然有无数企业在高价竞…...

javaEE初阶 — CSS 常用的属性

文章目录CSS 常用的属性1 字体属性1.1 设置字体家族 font-family1.2 设置字体大小 font-size1.3 设置字体粗细 font-weight1.4 文字倾斜 font-style2 文本属性2.1 文本颜色2.2 文本对齐2.3 文本装饰2.4 文本缩进2.5 行高3 背景属性3.1 背景颜色3.2 背景图片3.3 背景位置3.4 背景…...

【面试题】如何取消 script 标签发出的请求

大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库问题之前在业务上有这样一个场景&#xff0c;通过 script 标签动态引入了一个外部资源&#xff0c;具体方式是这样的const script document.…...

蓝桥杯嵌入式(G4系列):RTC时钟

前言&#xff1a; 关于RTC时钟的HAL库配置我也是第一次&#xff0c;之前都是用库函数的写法&#xff0c;这里写下这篇博客来记录一下自己的学习过程。 STM32Cubemx配置&#xff1a; 首先点击左侧的Timers的RTC&#xff0c;勾选以下选项 进入时钟树配置 进入时间设置&#xff0…...

Linux——进程间通信1

目录 进程间通信目的 进程间通信标准 管道 匿名管道 管道实现进程间通信 管道的特点 进程池 ProcessPool.cc Task.hpp 习题 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件…...

循环语句——“Python”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是Python中的循环语句呀&#xff0c;分为while循环和for循环&#xff0c;下面&#xff0c;让我们进入循环语句的世界吧 循环语句 while循环 for循环 continue和break 循环语句小结 人生重开模拟器 设置初始属性 设置性别…...

武进网站建设信息/信息流优化师是什么

2019独角兽企业重金招聘Python工程师标准>>> 1) 同时运行多个应用 Android 终于正式地支持分屏模式&#xff0c;通过分屏模式可以同时打开两个应用&#xff0c;这个功能在平板上使用起来特别方便&#xff0c;当然在手机上也支持这个功能。 点击概览按钮(方形)打开多…...

企业邮箱查找/莆田百度seo公司

今天来实现以下大众点评客户端的横向listview二级列表&#xff0c;先看一下样式。 这种横向的listview二级列表在手机软件上还不太常见&#xff0c;但是使用过平板的都应该知道&#xff0c;在平板上市比较常见的。可能是因为平板屏幕比较大&#xff0c;而且也能展现更多的内容。…...

精品网站建/广州优化疫情防控举措

本节书摘来自异步社区《面向对象设计实践指南&#xff1a;Ruby语言描述》一书中的第1章&#xff0c;第1.2节设计工具&#xff0c;作者【美】Sandi Metz&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 设计工具面向对象设计实践指南&#xff1a;Ruby语言…...

管理咨询师证书含金量/微信seo什么意思

据《法制日报》报道&#xff0c;日前国内第一影视剧视频网站乐视网正式与苹果公司对薄公堂&#xff0c;前者将就苹果在线商店&#xff08;App Store&#xff09;非法提供《画皮》等影视剧的盗版行为提起诉讼。据了解&#xff0c;该诉讼行为是因为苹果在线商店未经乐视网授权许可…...

网站怎么做优化/怎样建立自己网站

CGI CGI即通用网关接口(Common Gateway Interface)&#xff0c;是外部应用程序&#xff08;CGI程序&#xff09;与Web服务器之间的接口标准&#xff0c;是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序&#xff0c;并将它们的输出发送给Web浏览器…...

永州祁阳网站建设/新开网店自己如何推广

问题描述&#xff1a;在linux shell中如何处理tail -n 10 access.log这样的命令行选项&#xff1f;在bash中&#xff0c;可以用以下三种方式来处理命令行参数&#xff0c;每种方式都有自己的应用场景。1&#xff0c;直接处理&#xff0c;依次对$1,$2,...,$n进行解析&#xff0c…...