HTML5【新特性总结】
HTML5【新特性总结】
HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。
这些新特性都有兼容性问题,基本是 IE9+ 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性。
- 语义元素(Semantic Elements):
<article>,<section>,<nav>,<aside>,<header>,<footer>等元素,提供了更多的网页结构信息,使内容更加语义化。
- 视频和音频支持:
<video>和<audio>元素,允许直接在浏览器中嵌入视频和音频,支持多种格式如MP4, WebM等。
- 画布元素(Canvas):
<canvas>元素,用于绘制图形、制作动画、创建游戏等,可以通过JavaScript脚本控制。
- 地理定位(Geolocation):
- 通过
navigator.geolocationAPI,允许网页访问用户的地理位置信息。
- 通过
- 本地存储(Local Storage 和 Session Storage):
- 提供无须数据库的本地存储,Local Storage 存储持久数据,而 Session Storage 存储会话数据。
- Web Workers:
- Web Workers 允许主线程以外的后台线程执行JavaScript,用于处理复杂计算,避免阻塞用户界面。
- WebSocket:
- WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
- 表单改进:
- 新的表单元素
<datalist>、<output>,新的input类型如email,url,number等,以及自定义表单控件的样式。
- 新的表单元素
- 拖放API(Drag and Drop):
- 允许用户将元素从一个地方拖放到另一个地方,而无需依赖任何插件。
- 离线应用和缓存:
- 利用
applicationCacheAPI,可以使网页和资源在没有网络的情况下也能被访问。
- 利用
一、HTML5 新增的语义化标签
<header>:头部标签<nav>:导航标签<article>:内容标签<section>:定义文档某个区域<aside>:侧边栏标签<footer>:尾部标签

- 这种语义化标准主要是针对搜索引擎的(seo)
- 这些新标签页面中可以使用多次
- 在 IE9 中,需要把这些元素转换为块级元素
- 其实,移动端更喜欢使用这些标签
<!-- HTML5新增的语义化标签---增强SEO --><header>头部<nav>导航栏</nav></header><aside>侧边栏</aside><main>主体区<aticle>文体1<section>第一部分</section><section>第二部分</section></aticle><aticle>文体2<section>第一部分</section><section>第二部分</section></aticle><aticle>文体3<section>第一部分</section><section>第二部分</section></aticle></main><footer>底部区</footer>
二、HTML5 新增的多媒体标签
新增的多媒体标签主要包含两个:
- 音频:
<audio> - 视频:
<video>
使用它们可以很方便的在页面中嵌入音频和视频,而不再去使用 flash 和其他浏览器插件。
HTML5 在不使用插件的情况下,也可以原生的支持视频格式文件的播放,当然,支持的格式是有限的。
当前 元素支持三种视频格式: 尽量使用 mp4格式

<video src="文件地址" controls="controls"></video><video controls="controls" width="300"><source src="move.ogg" type="video/ogg" ><source src="move.mp4" type="video/mp4" >您的浏览器暂不支持 <video> 标签播放视频
</video>
当前 元素支持三种音频格式: 尽量使用 mp3格式

常见属性

<!-- HTML5新增的多媒体标签 --><audio src="1.mp3" controls="controls" autoplay="autoplay" loop="loop"></audio><video src="2.mp4" controls="controls" autoplay="autoplay" loop="loop" ></viedo>
三、HTML表单增强
1.HTML5 新增的 input 类型

<!-- HTML新增的表单类型 --><input type="email"><input type="url"><input type="date"><input type="month"><input type="week"><input type="number"><input type="tel"><input type="search"><input type="color">
2.HTML5 新增的input属性

<input type="text" required placeholder="请输入内容" autocomplete="off"><input type="file" multiple>
3.HTML新增的表单标签
1️⃣ 标签
标签规定了 元素可能的选项列表。
标签被用来在为 元素提供"自动完成"的特性。用户能看到一个下拉列表,里边的选项是预先定义好的,将作为用户的输入数据。
请使用 元素的 list 属性来绑定 元素。
<input list="browsers">
<datalist id="browsers"><option value="Internet Explorer"><option value="Firefox"><option value="Chrome"><option value="Opera"><option value="Safari">
</datalist>

2️⃣output标签
output标签作为计算结果输出显示(比如执行脚本的输出)。
- 注意:如果是字符串类型的数字才会被计算
<form oninput="x.value=parseInt(a.value)+parseInt(b.value)">0<input type="range" id="a" value="50">100+<input type="number" id="b" value="50">=<output name="x" for="a b"></output>

六、HTML5 Web Storage
使用HTML5可以在本地存储用户的浏览数据。
早些时候,本地存储使用的是 cookie。但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,但是这些数据只用于用户请求网站数据上.它也可以存储大量的数据,而不影响网站的性能.
数据以 键/值 对存在, web网页的数据只允许该网页访问使用。
客户端存储数据的两个对象为:
- localStorage - 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除。
- sessionStorage - 用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。
在使用 web 存储前,应检查浏览器是否支持 localStorage 和 sessionStorage:
1️⃣localStorage对象
localStorage 对象存储的数据没有时间限制。第二天、第二周或下一年之后,数据依然可用。
// 存储
localStorage.setItem("sitename", "菜鸟");// 查找
document.getElementById("result").innerHTML = "网站名:" + localStorage.getItem("sitename");
实例解析:
- 使用 key=“sitename” 和 value=“菜鸟” 创建一个 localStorage 键/值对。
- 检索键值为 “sitename” 的值然后将数据插入 id=“result” 的元素中。
以上实例也可以这么写:
// 存储
localStorage.sitename = "菜鸟教程";
// 查找
document.getElementById("result").innerHTML = localStorage.sitename;
移除 localStorage 中的 “sitename” :
localStorage.removeItem("sitename");
不管是 localStorage,还是 sessionStorage,可使用的API都相同,常用的有如下几个(以localStorage为例):
- 保存数据:localStorage.setItem(key,value);
- 读取数据:localStorage.getItem(key);
- 删除单个数据:localStorage.removeItem(key);
- 删除所有数据:localStorage.clear();
- 得到某个索引的key:localStorage.key(index);
提示: 键/值对通常以字符串存储,你可以按自己的需要转换该格式。
2️⃣sessionStorage对象
sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。
如何创建并访问一个 sessionStorage:
if (sessionStorage.clickcount)
{sessionStorage.clickcount=Number(sessionStorage.clickcount)+1;
}
else
{sessionStorage.clickcount=1;
}
document.getElementById("result").innerHTML="在这个会话中你已经点击了该按钮 " + sessionStorage.clickcount + " 次 ";
不管是 localStorage,还是 sessionStorage,可使用的API都相同,常用的有如下几个(以localStorage为例):
- 保存数据:sessionStorage.setItem(key,value);
- 读取数据:sessionStorage.getItem(key);
- 删除单个数据:sessionStorage.removeItem(key);
- 删除所有数据:sessionStorage.clear();
- 得到某个索引的key:sessionStorage.key(index);
七、HTML5 Web Worker
1️⃣为什么需要Web Worker
由于JavaScript语言采用的是单线程,同一时刻只能做一件事,如果有多个同步计算任务执行,则在这段同步计算逻辑执行完之前,它下方的代码不会执行,从而造成了阻塞,用户的交互也可能无响应。
但如果把这段同步计算逻辑放到Web Worker执行,在这段逻辑计算运行期间依然可以执行它下方的代码,用户的操作也可以响应了。
2️⃣Web Worker是什么
HTML5 提供并规范了 Web Worker 这样一套 API,它允许一段 JavaScript 程序运行在主线程之外的另外一个线程(Worker 线程)中。
Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程就会很流畅,不会被阻塞或拖慢
3️⃣Web Worker分类
Web Worker 根据工作环境的不同,可分为
- 专用线程 Dedicated Worker
- 共享线程 Shared Worker
Dedicated Worker的Worker只能从创建该Woker的脚本中访问,而SharedWorker则可以被多个脚本所访问。
在开发中如果使用到 Web Worker,目前大部分主要还是使用 Dedicated Worker的场景多,它只能为一个页面所使用,本文讲的也是这一类;而Shared Worker可以被多个页面共享,为跨浏览器 tab 共享数据提供了一种解决方案。
4️⃣Web Worker使用限制
①同源限制
分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。
“同源策略”(Same-origin policy)是浏览器的一种安全措施,它限制了一个源(域名、协议和端口)的文档或脚本如何与另一个源的资源进行交互。所谓的"同源"指的是三个标签(协议、域名、端口)完全一致
- 如果你想在主线程中使用 Web Worker,那么你必须将 Web Worker 的脚本文件与主线程的脚本文件放置在同一个域、使用相同的协议(例如都是 HTTPS 或者都是 HTTP)和端口。
- 如果你的主线程脚本运行在 “example.com” 域下的 “http” 协议,并且端口是 “8080”,那么你的 Web Worker 脚本也必须来自 “example.com” 域下的 “http” 协议,端口为 “8080”。
②文件限制
Worker 线程无法读取本地文件(file://),会拒绝使用 file 协议来创建 Worker实例,它所加载的脚本,必须来自网络。
③DOM和BOM操作限制
Worker 线程所在的全局对象,与主线程不一样,区别是:
- 无法读取主线程所在网页的 DOM 对象
- 无法使用
document、window、parent这些对象
④通信限制
Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成,交互方法是postMessage和onMessage,并且在数据传递的时候,不管是什么类型的数据, Worker 是使用拷贝的方式。
⑤脚本限制
Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求,也可以使用setTimeout/setInterval等API
5️⃣常用的API
// 创建worker线程
const worker = new Worker(aURL, options)
• worker.postMessage(): 向 worker 的内部作用域发送一个消息,消息可由任何 JavaScript 对象组成
• worker.terminate(): 立即终止 worker。该方法并不会等待 worker 去完成它剩余的操作;worker 将会被立刻停止
• worker.onmessage:当 worker 的父级接收到来自其 worker 的消息时,会在 Worker 对象上触发 message 事件
• worker.onerror: 当 worker 出现运行中错误时,它的 onerror 事件处理函数会被调用。它会收到一个扩展了 ErrorEvent 接口的名为 error 的事件
worker.addEventListener('error', function (e) {console.log(e.message) // 可读性良好的错误消息console.log(e.filename) // 发生错误的脚本文件名console.log(e.lineno) // 发生错误时所在脚本文件的行号
})
6️⃣常见的使用方式
①直接定义脚本文件
const myWorker = new Worker(aURL, options);
aURL表示 worker 将执行的脚本的 URL(脚本文件), 即 Web Worker 所要执行的任务。
案例如下:
// 主线程下创建worker线程
const worker = new Worker('./worker.js')// 监听接收worker线程发的消息
worker.onmessage = function (e) {console.log('主线程收到worker线程消息:', e.data)
}// 向worker线程发送消息
worker.postMessage('主线程发送hello world')
worker.js:
// self 代表子线程自身,即子线程的全局对象
self.addEventListener("message", function (e) {// e.data表示主线程发送过来的数据self.postMessage("worker线程收到的:" + e.data); // 向主线程发送消息
});
Web Worker 的执行上下文名称是 self,无法调用主线程的 window 对象的。上述写法等同于以下写法:
this.addEventListener("message", function (e) {// e.data表示主线程发送过来的数据this.postMessage("worker线程收到的:" + e.data); // 向主线程发送消息
});
将JS文件引入html挂在本地开发环境运行,运行结果如下:
主线程收到worker线程消息: worker线程收到的:主线程发送hello world
②使用Blob和URL创建
除了这种通过引入js文件的方式,也可以通过URL.createObjectURL()创建URL对象,创建内嵌的worker
在JavaScript中,
URL.createObjectURL()方法用于创建一个表示 Blob 对象或 File 对象的 URL。这个 URL 可以使用在任何需要 URL 的地方,比如<img>标签的src属性或<a>标签的href属性中。当使用完该 URL 之后,建议通过URL.revokeObjectURL()方法来释放 URL,以便浏览器可以回收相关资源。
/*** const blob = new Blob(array, options);* Blob() 构造函数返回一个新的 Blob 对象。blob 的内容由参数数组中给出的值的串联组成。* @params array 是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array* @options type,默认值为 "",它代表了将会被放入到 blob 中的数组内容的 MIME 类型。还有两个这里忽略不列举了*//*** URL.createObjectURL():静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的 URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的 URL 对象表示指定的 File 对象或 Blob 对象*/
const worker = new Worker(URL.createObjectURL(blob));
- Blob 对象表示一个不可变、原始数据的类文件对象,它的数据可以按文本或二进制的格式进行读取。File 接口基于 Blob,继承了 blob 的功能并将其扩展以支持用户系统上的文件。
- Blob URL/Object URL 是一种伪协议,允许 Blob 和 File 对象用作图像,下载二进制数据链接等的 URL 源。在浏览器中,我们使用 URL.createObjectURL 方法来创建 Blob URL,该方法接收一个 Blob 对象,并为其创建一个唯一的 URL,其形式为
blob:<origin>/<uuid> - 浏览器内部为每个通过 URL.createObjectURL 生成的 URL 存储了一个 URL 到 Blob 映射。因此,此类 URL 较短,但可以访问 Blob。生成的 URL 仅在当前文档打开的状态下才有效,它保存在内存中的。它允许引用
<img>、<a>中的 Blob,但如果你访问的 Blob URL 不再存在,则会从浏览器中收到 404 错误
function func() {console.log('hello')
}function createWorker(fn) {// const blob = new Blob([fn.toString() + ' fn()'], { type: 'text/javascript' })const blob = new Blob([`(${fn.toString()})()`], { type: 'text/javascript' })return URL.createObjectURL(blob)
}createWorker(func)
③Worker线程引入脚本
Worker线程内部要加载其他脚本,可以使用 importScripts()
// worker.js
importScripts("constants.js");// self 代表子线程自身,即子线程的全局对象
self.addEventListener("message", function (e) {self.postMessage(foo); // 可拿到 `foo`、`getAge()`、`getName`的结果值
});// constants.js
const foo = "变量";function getAge() {return 25;
}const getName = () => {return "jacky";
};
还可以同时加载多个脚本
importScripts('script1.js', 'script2.js');
7️⃣实战应用场景
处理大量CPU耗时计算操作
大家最关心的还是 Web Worker 实战场景,开头我们说到,当有大量复杂计算场景时,可使用 Web Worker
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>worker计算</title></head><body><div>计算从 1 到给定数值的总和</div><input type="text" placeholder="请输入数字" id="num" /><button onclick="calc()">开始计算</button><span>计算结果为:<span id="result">-</span></span><div>在计算期间你可以填XX表单</div><input type="text" placeholder="请输入姓名" /><input type="text" placeholder="请输入年龄" /><script>function calc() {const num = parseInt(document.getElementById('num').value)let result = 0let startTime = performance.now()// 计算求和(模拟复杂计算)for (let i = 0; i <= num; i++) {result += i}// 由于是同步计算,在没计算完成之前下面的代码都无法执行const time = performance.now() - startTimeconsole.log('总计算花费时间:', time)document.getElementById('result').innerHTML = result}</script></body>
</html>

如上,第一个输入框与按钮是负责模拟复杂计算的,比如输入 10000000000,点击开始计算,这时主线程处理一直在处理同步计算逻辑,在完成计算之前,会发现页面处于卡顿的状态,下方的两个输入框也无法点击交互,在我的电脑这部分计算是花了14s左右,这个卡顿时间给用户的体验就很差了。
打开控制台调用也可以看到这里CPU使用率是100%

如果把这部分计算交给 Web Worker 来处理,修改代码:
<script>
const worker = new Worker('./worker.js')function calc() {const num = parseInt(document.getElementById('num').value)worker.postMessage(num)
}worker.onmessage = function (e) {document.getElementById('result').innerHTML = e.data
}
</script>
./worker.js
self.onmessage = function (e) {calc(e.data)
}function calc(num) {let result = 0let startTime = performance.now()// 计算求和(模拟复杂计算)for (let i = 0; i <= num; i++) {result += i}// 由于是同步计算,在没计算完成之前下面的代码都无法执行const time = performance.now() - startTimeconsole.log('总计算花费时间:', time)self.postMessage(result)
}
然后重复上述一样的操作,输入 10000000000 计算,会发现下方两个输入框可正常流畅输入,整个页面也不卡顿。
Worker 运行独立于主线程的后台线程中,分担执行了大量占用CPU密集型的操作(但运行时间并不会变短),解放了主线程,主线程就能及时响应用户操作而不会造成卡顿的现象。使用Web Worker后,控制台工具可看到CPU使用率处于较低正常水平,计算过程跟没计算之前的水平一样。

八、HTML5 WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。
1️⃣创建WebSocket连接,返回连接的实例对象
以下 API 用于创建 WebSocket 对象。
var ws = new WebSocket(url, [protocol] );
以上代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。
2️⃣WebSocket实例属性
ws.readyState
只读属性 readyState 表示连接状态,可以是以下值:
- 0 - 表示连接尚未建立。
- 1 - 表示连接已建立,可以进行通信。
- 2 - 表示连接正在进行关闭。
- 3 - 表示连接已经关闭或者连接不能打开。
3️⃣WebSocket 事件
以下是 WebSocket 对象的相关事件。假定我们使用了以上代码创建了 Socket 对象:
| 事件 | 事件处理程序 | 描述 |
|---|---|---|
| open | ws.onopen | 连接建立时触发 |
| message | ws.onmessage | 客户端接收服务端数据时触发 |
| error | ws.onerror | 通信发生错误时触发 |
| close | ws.onclose | 连接关闭时触发 |
4️⃣WebSocket 方法
以下是 WebSocket 对象的相关方法。假定我们使用了以上代码创建了 Socket 对象:
| 方法 | 描述 |
|---|---|
| Socket.send() | 使用连接发送数据 |
| Socket.close() | 关闭连接 |
5️⃣WebSocket本质
WebSocket 协议本质上是一个基于 TCP 的协议。
为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
<!DOCTYPE HTML>
<html><head><meta charset="utf-8"><title>菜鸟教程(runoob.com)</title><script type="text/javascript">function WebSocketTest(){if ("WebSocket" in window){alert("您的浏览器支持 WebSocket!");// 打开一个 web socketvar ws = new WebSocket("ws://localhost:9998/echo");ws.onopen = function(){// Web Socket 已连接上,使用 send() 方法发送数据ws.send("发送数据");alert("数据发送中...");};ws.onmessage = function (evt) { var received_msg = evt.data;alert("数据已接收...");};ws.onclose = function(){ // 关闭 websocketalert("连接已关闭..."); };}else{// 浏览器不支持 WebSocketalert("您的浏览器不支持 WebSocket!");}}</script></head><body><div id="sse"><a href="javascript:WebSocketTest()">运行 WebSocket</a></div></body>
</html>
九、HTML5 地理位置
HTML5 Geolocation API 用于获得用户的地理位置。
鉴于该特性可能侵犯用户的隐私,需要用户授权,否则用户位置信息是不可用的。
let geoloc = window.navigator.geolocation
let success = function(msg){}
let error = function(msg){}
geoloc.getCurrentPosition(success, // 获取定位成功后执行的回调函数 error, // 获取定位失败后执行的回调函数 option // {}对象类型, 指定定位配置参数
);
一旦定位成功, 将会输出如下位置信息:
coords: Coordinatesaccuracy: 19218 定位准确度 altitude: 0 海拔高度 altitudeAccuracy: null 海拔准确度heading: NaN latitude: 39.9078 纬度longitude: 116.3975 经度speed: NaN 运动速度
timestamp: 1636426246419 毫秒时间戳
接入第三方位置服务平台 - 百度地图/高德地图
高德地图 JS API 是一套 JavaScript 语言开发的的地图应用编程接口,移动端、PC端一体化设计,一套 API 兼容众多系统平台。目前 JS API 免费开放使用。
JS API 提供了2D、3D地图模式,满足绝大多数开发者对地图展示、地图自定义、图层加载、点标记添加、矢量图形绘制的需求,同时也提供了 POI 搜索、路线规划、地理编码、行政区查询、定位等众多开放服务接口。
高德的开发平台:https://lbs.amap.com/demo/list/js-api
步骤:
①注册账号并申请Key
- 首先,注册开发者账号,成为高德开放平台开发者
- 登陆之后,在进入「应用管理」 页面「创建新应用」
- 为应用添加 Key,「服务平台」一项请选择「 Web 端 ( JSAPI ) 」
②基本使用
- 新建一个
html页面 - 新增一个
div, 设置css与id属性. - 引入高德地图的
script脚本. (替换自己申请的key) - 创建
map对象, 在div中初始化地图.
注意:第三方地图的API也支持定位,所以也不需要使用该HTML5特性
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>#container {width: 640px;height: 360px;border: 1px solid black;}</style></head><body><div id="container"></div><scripttype="text/javascript"src="https://webapi.amap.com/maps?v=1.4.15&key=申请的key"></script><script>let geoloc = window.navigator.geolocation;geoloc.getCurrentPosition(res => {let lat = res.coords.latitude; //纬度let lng = res.coords.longitude; //精度//初始化地图var map = new AMap.Map("container", {zoom: 18, //级别center: [lng, lat], //中心点坐标viewMode: "3D", //使用3D视图});//添加点标记var marker = new AMap.Marker({position: [lng, lat],});map.add(marker);//弹出信息窗体marker.on("click", e => {var infoWindow = new AMap.InfoWindow({isCustom: false, //使用默认窗口content: "<div>信息窗体</div>",offset: new AMap.Pixel(16, -45),closeWhenClickMap: true,});infoWindow.open(map, marker.getPosition());});//引入AMap的插件AMap.plugin(["AMap.ToolBar","AMap.Scale","AMap.OverView","AMap.MapType","AMap.Geolocation","AMap.PlaceSearch", //POI搜索"AMap.Geocoder", //地理编码,地址解析],function () {//完成地理编码(str -> 坐标let geocoder = new AMap.Geocoder({city: "北京",extensions: "all",});geocoder.getLocation("北京大学", (s, res) => {console.log("地理编码:", res);});//逆地理编码(坐标 -> str)geocoder.getAddress([106, 35], (s, res) => {console.log("逆地理编码:", res);});// 在图面添加工具条控件,工具条控件集成了缩放、平移、定位等功能按钮在内的组合控件map.addControl(new AMap.ToolBar());// 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺map.addControl(new AMap.Scale());// 在图面添加鹰眼控件,在地图右下角显示地图的缩略图map.addControl(new AMap.OverView({ isOpen: true }));// 在图面添加类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制map.addControl(new AMap.MapType());// 在图面添加定位控件,用来获取和展示用户主机所在的经纬度位置map.addControl(new AMap.Geolocation({buttonOffset: new AMap.Pixel(20, 50),}));//位置对象检索,搜索//创建PlaceSearch对象,按关键字搜索相关位置结果let placeSearch = new AMap.PlaceSearch({city: "重庆", //指定城市/区号pageSize: 50,});placeSearch.search("学校", (status, result) => {console.log("status:", status);console.log("result:", result);});placeSearch.getDetails("B000A816R6", (status, res) => {console.log(res);});});},err => {console.warn(err);},{ timeout: 5000 });</script></body>
</html>
十、HTML5 画布元素
十一、HTML5 拖放API
在日常开发中,拖拽功能无疑是一个常见的需求场景。为了更好地满足这一需求,HTML5提供了一套便捷的拖放API。这些API不仅能够帮助开发者轻松实现拖拽效果,还可以提高排查拖拽问题的效率,甚至可以让我们更加灵活地自定义拖拽场景和设计能力。
十二、HTML5 应用缓存
相关文章:
HTML5【新特性总结】
HTML5【新特性总结】 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题,基本是 IE9 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性。…...
【面试题】面试官:判断图是否有环?_数据结构复试问题 有向图是否有环
type: NODE;name: string;[x: string]: any; }; [x: string]: any;}; export type Data Node | Edge; 复制代码 * 测试数据如下const data: Data[] [ { id: ‘1’, data: { type: ‘NODE’, name: ‘节点1’ } }, { id: ‘2’, data: { type: ‘NODE’, name: ‘节点2’ } },…...
办理北京公司注册地址异常变更要求和流程
在北京注册公司时选择注册地址是非常重要的一环,注册地址不仅体现在营业执照上,在网上也有公示信息,一般选用的是商用地址和商住两用地址,在公司经营过程中,因为经营需要变更注册地址,也要依法变更…...
当你在浏览器输入一个地址
你在浏览器中输出了一个地址,回车后,一直到显示页面,中间经历了哪些过程 ? 1. 用户输入 URL 并按下回车 用户在浏览器的地址栏中输入一个 URL(例如 http://example.com)并按下回车键。 2. DNS 解析 浏览…...
JSP基础知识概述
目录 JSP一、什么是JSP1.1 概念1.2 创建JSP1.3 JSP编写Java代码1.4 JSP实现原理 二、JSP与HTML集成2.1 普通脚本2.2 声明脚本2.3 输出脚本2.4 JSP指令2.5 动作标签 三、内置对象3.1 四大域对象 JSP 一、什么是JSP 1.1 概念 简化的Servlet设计,在HTMl标签中嵌套Jav…...
国产编程—— 仓颉
应用 仓颉编程语言是一款由华为主导设计和实现的面向全场景智能的编程语言,主要应用于以下领域: 中文字符编码和文本数据处理:仓颉编程语言充分利用汉字的结构特点来设计编码,为开发者提供了一种高效的方式来编码、存储和处理中…...
0X JavaSE-并发编程(锁)
1...
云计算【第一阶段(18)】磁盘管理与文件系统 分区格式挂载(一)
目录 一、磁盘基础 二、磁盘结构 2.1、机械硬盘 2.2、固态硬盘 2.3、扩展移动硬盘 2.4、机械磁盘的一些计算(了解) 2.5、磁盘接口类型 二、Linux 中使用的文件系统类型 2.1、磁盘分区的表示 2.1.1、主引导记录(MBR) 2.1.2、Linux中将硬盘、分…...
Flask-cache
Flask-cache 目录 Flask-cache基本使用配置可用参数SimpleCacheNullCacheFileSystemCacheRedisCacheRedisSentinelCacheRedisClusterCacheMemcachedCacheSASLMemcachedCacheUWSGICache Flask-Cache是一个强大的缓存库,为基于Flask的应用提供了简单易用的API和多种缓…...
【面试题】面试小技巧:如果有人问你 xxx 技术是什么?_面试问你对什么技术特别了解
前端工程越来越大,前面几种方案不能很好的支持单元测试。 在这样的背景下,React 诞生了。React 带来了新的思维模式,UI fn(props),React 中一个组件就是一个函数或者一个类,一个函数或者一个类就是一个基础单位&…...
简单分享Python语言(发现其实并不难)
一. Python基础 Python是一种解释型语言,这意味着开发者可以在代码被编写后立即执行它们,而无需编译。Python的基本语法简单明了,以下是一些基础知识点: 变量和数据类型:Python支持多种数据类型,包括整型&…...
基于VTK9.3.0+Visual Studio2017 c++实现DICOM影像MPR多平面重建
开源库:VTK9.3.0 开发工具:Visual Studio2017 开发语言:C 实现过程: void initImageActor(double* Matrix, double* center, vtkSmartPointer<vtkImageCast> pImageCast,vtkSmartPointer<vtkImageReslice> imageRe…...
【论文精读】ViM: Out-Of-Distribution with Virtual-logit Matching 使用虚拟分对数匹配的分布外检测
文章目录 一、文章概览(一)问题来源(二)文章的主要工作(三)相关研究 二、动机:Logits 中缺失的信息(一)logits(三)基于零空间的 OOD 评分…...
【面试题】前端 移动端自适应?_前端移动端适配面试题
设备像素比 设备像素比 (DevicePixelRatio) 指的是设备物理像素和逻辑像素的比例 。比如 iPhone6 的 DPR 是2。 设备像素比 物理像素 / 逻辑像素。可通过 window.devicePixelRatio 获取,CSS 媒体查询代码如下 media (-webkit-min-device-pixel-ratio: 3), (min-…...
在Maven工程中手动配置并测试SpringBoot(巨详)
本篇博客承继自博客: 在IDEA 2024.1.3 (Community Edition)中创建Maven项目_idea2024.1.3如何创建maven项目-CSDN博客 配置POM文件 打开工程中的pom.xml文件,先向其中写入 <parent><groupId>org.springframework.boot</groupId><…...
c# 去掉字符串首尾的 特殊符号
如果首尾的 - 数量不确定,可以使用以下方法来去掉字符串两端的 - 字符: 使用正则表达式: using System.Text.RegularExpressions;string input "---Hello, World!---"; string trimmed Regex.Replace(input, "^-*|-*$", ""); // trimmed 为 …...
在容器中共享本地文件
在容器中共享本地文件 目录 卷与绑定挂载的对比在主机和容器之间共享文件Docker 访问主机文件的文件权限试一试 运行一个容器使用绑定挂载在 Docker Dashboard 中访问文件停止容器 额外资源下一步 每个容器都有一切需要运行的资源,而不依赖于主机机器上预先安装的…...
Java Matcher类方法深度剖析:查找和匹配、索引方法
1. 引言 在Java中,正则表达式是处理字符串的强大工具,而java.util.regex包中的Matcher类则是实现这一功能的核心。对于Java工程师而言,熟练掌握Matcher类的使用方法,无疑能够极大地提升字符串处理的效率和准确性。本文将对Matcher类的方法进行深度讲解,并按照查找和匹配方…...
Redis-数据类型-zset
文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db4数据库4、将一个或多个member元素及其score值加入到有序集key当中5、升序返回有序集key6、升序返回有序集key,让分数一起和值返回的结果集7、降序返回有序集key,让分数一起和值返回到结…...
手撕RPC——前言
手撕RPC——前言 一、RPC是什么?二、为什么会出现RPC三、RPC的原理3.1 RPC是如何做到透明化远程服务调用?3.2 如何实现传输消息的编解码? 一、RPC是什么? RPC(Remote Procedure Call,远程过程调用ÿ…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
