拖放(Drag
)API【下面有详细讲解 => 3】
画布(Canvas
) AP
地理(Geolocation
) API
音频、视频API(audio
, video
)
localStorage
和 sessionStorage
WebWorker
, WebSocket
【下面有详细讲解 => 2】
新的一套标签 header
, nav
, footer
, aside
, article
, section
web worker
是运行在浏览器后台的js程序,他不影响主程序的运行,是另开的一个js线程,可以用这个线程执行复杂的数据操作,然后把操作结果通过 postMessage
传递给主线程,这样在进行复杂且耗时的操作时就不会阻塞主线程了
HTML5 History两个新增的API:history.pushState
和 history.replaceState
,两个 API 都会操作浏览器的历史记录,而不会引起页面的刷新
Hash
就是 url 中看到#
,我们需要一个根据监听哈希变化触发的事件(hashchange
) 事件。我们用window.location
处理哈希的改变时不会重新渲染页面,而是当作新页面加到历史记录中,这样我们跳转页面就可以在hashchange
事件中注册ajax
从而改变页面内容。 可以为hash
的改变添加监听事件:
window.addEventListener("hashchange", funcRef, false
WebSocket
使用 ws
或 wss
协议,WebSocket
是一个持久化的协议,相对于HTTP
这种非持久的协议来说。WebSocket
API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。
WebSocket
并不限于以 Ajax
(或 XHR
)方式通信,因为 Ajax
技术需要客户端发起请求,而 WebSocket
服务器和客户端可以彼此相互推送信息;XHR
受到域的限制,而 WebSocket
允许跨域通信。
// 创建一个Socket实例
var socket = new WebSocket('ws://localhost:8080');
// 打开Socket
socket.onopen = function(event) {
// 发送一个初始化消息
socket.send('I am the client and I\'m listening!');
// 监听消息
socket.onmessage = function(event) {
console.log('Client received a message',event);
};
// 监听Socket的关闭
socket.onclose = function(event) {
console.log('Client notified socket has closed',event);
};
}
// 关闭Socket....
// socket.close()
dragstart
:在开始拖放被拖放元素时触发(拖拽开始)darg
:在正在拖放被拖放元素时触发(拖拽事件)dragend
:在整个拖放操作结束时触(拖拽结束)dragenter
:在被拖放元素进入某元素时触发(拖拽进入)dragover
:在被拖放在某元素内移动时触发(悬浮事件)dragleave
:在被拖放元素移出目标元素时触发(拖拽离开)drop
:在目标元素停止拖拽时触发(丢弃事件)【需要在dragover
中调用e.preventDefault()
;才能触发drop
】iframe
会阻塞主页面的onLoad
事件;iframe
和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载;iframe
之前需要考虑这两个缺点。如果需要使用 iframe
,最好是通过j,动态给 iframe
添加 src
属性。WebSocket
可以实现多个标签页之间的通信localStorage
localStorage.setItem(key,value)
添加(修改、删除)内容storage
事件localstorge
存储的值,实现不同标签页之间的通信cookie
+ setInterval()
将要传递的信息存储在
cookie
中,每隔一定时间读取cookie
信息,即可随时获取要传递的信息。
具体demo见【】
src
用于替换当前元素,href
用于在当前文档和引用资源之间确立联系。
src
是 source
的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求 src
资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素
<script src =”index.js”>
当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,img 图片和frame等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部
href
是 Hypertext Reference
的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,如果我们在文档中添加
<link href=”common.css” rel=”stylesheet”/>
那么浏览器会识别该文档为css文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用
link
方式来加载css,而不是使用@import
方式。
png-8
,png-24
,jpeg
,gif
,svg
,WebP
()
Webp
:WebP
格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG
的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP
格式。
在质量相同的情况下,WebP
格式图像的体积要比JPEG
格式图像小40%
script
:会阻碍 HTML
解析,只有下载好并执行完脚本才会继续解析 HTML
。defer
:浏览器指示脚本在文档被解析后执行,script
被异步加载后并不会立刻执行,而是等待文档被解析完毕后执行。async
:同样是异步加载脚本,区别是脚本加载完毕后立即执行,这导致async
属性下的脚本是乱序的,对于 script
有先后依赖关系的情况,并不适用蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析
在
HTML
页面中,如果在执行脚本时,页面的状态是不可响应式的,直到脚本执行完成后, 页面才变成可响应。web worker
是运行在后台的 js,独立于其他脚本,不会影响页面你的性能。并且通过postMessage
将结果回传到主线程。这样在进行复杂操作的时候,就不会阻塞主线程了
如何创建 web worker
给 div
添加 contenteditable=true
即可
都是告知浏览器提前加载文件(图片、视频、js、css等),但执行上是有区别的。
prefetch
:利用浏览器空闲时间来下载或预取用户在不久的将来可能访问的文档。
<link href="/js/xx.js" rel="prefetch">
preload
:可以指明哪些资源是在页面加载完成后即刻需要的,浏览器在主渲染机制介入前就进行预加载,这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。
<link href="/js/xxx.js" rel="preload" as="script">
需要
as
指定资源类型目前可用的属性类型:
audio
:音频video
: 视频文件。document
:一个将要被嵌入到或
内部的HTML文档。
embed
: 一个将要被嵌入到元素内部的资源。
fetch
: 那些将要通过fetch和XHR请求来获取的资源,比如一个ArrayBuffer或JSON文件。font
: 字体文件。image
: 图片文件。object
: 一个将会被嵌入到元素内的文件。
script
: JavaScript文件。style
: 样式表。track
: WebVTT文件worker
: 一个JavaScript的web worker
或shared worker
<meta name="viewport" content="width=500, initial-scale=1">
width
:页面宽度,可以取值具体的数字,也可以是 device-width
,表示跟设备宽度相等。height
:页面高度,可以取值具体的数字,也可以是 device-height
,表示跟设备高度相等。initial-scale
:初始缩放比例。minimum-scale
:最小缩放比例。maximum-scale
:最大缩放比例。user-scalable
:是否允许用户缩放。改变 a
标签 css
属性的排列顺序
只需要记住LoVe HAte原则就可以了(爱恨原则)
link → visited → hover → activ
// 注意各个阶段的含义
- a:link:未访问时的样式,一般省略成a
- a:visited:已经访问后的样式
- a:hover:鼠标移上去时的样式
- a:active:鼠标按下时的样式
mouseenter -> mousedown -> focus -> click
const text = document.getElementById('text');
text.onclick = function (e) {
console.log('onclick')
}
text.onfocus = function (e) {
console.log('onfocus')
}
text.onmousedown = function (e) {
console.log('onmousedown')
}
text.onmouseenter = function (e) {
console.log('onmouseenter')
}
答案:
'onmouseenter'
'onmousedown'
'onfocus'
'onclick'
创建自定义事件
原生自定义事件有三种写法:
使用 Event
const myEvent = new Event('event_name')
使用 customEvent
(可以传参数)
const myEvent = new CustomEvent('event_name', {
detail: {
// 将需要传递的参数放到这里
// 可以在监听的回调函数中获取到:event.detail
}
})
使用 document.createEvent('CustomEvent')
和 initCustomEvent()
// createEvent:创建一个事件
const myEvent = document.createEvent('CustomEvent'); // 注意这里是为'CustomEvent
// initEvent:初始化一个事件
myEvent.initEvent(
// initEvent可以指定3个参数:
// 1. event_name: 事件名称
// 2. canBubble: 是否冒泡
// 3. cancelable: 是否可以取消默认行为
)
事件的监听
自定义事件的监听其实和普通事件的一样,使用 addEventListener
来监听:
button.addEventListener('event_name', function (e) {}
事件的触发
触发自定义事件使用 dispatchEvent(myEvent)
注意⚠️ 这里的参数是要自定义事件的对象(也就是myCustomEvent
),而不是自定义事件的名称('myEvent'
)
看案例
const myCustomEvent = document.createEvent('CustomEvent');
myCustomEvent.initEvent('myEvent', true, true)
const btn = document.getElementsByTagName('button')[0]
btn.addEventListener('myEvent', function (e) {
console.log(e)
console.log(e.detail)
})
setTimeout(() => {
btn.dispatchEvent(myCustomEvent)
}, 2000)
详细可见文章:一文彻底搞懂JS的事件流以及事件模型
addEventListener
是标准浏览器中的用法,attachEvent
是IE8以下addEventListener
可有冒泡,可有捕获;attachEvent
只有冒泡,没有捕获。addEventListener
事件名不带on
,attachEvent
带 on
addEventListener
回调函数中的 this
指向当前元素,attachEvent
指向 window
详细可见文章:一文彻底搞懂JS的事件流以及事件模型
第三个参数涉及到冒泡和捕获,是 true
时为捕获,是 false
则为冒泡。
也可以是一个对象
{passive: true}
,针对的是Safari浏览器,禁止/开启使用滚动的时候要用到。
详细可见文章:一文彻底搞懂JS的事件流以及事件模型
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程就叫做DOM事件流。
DOM事件流分为三个阶段:
捕获阶段:事件从window发出,自上而下向目标节点传播的阶段
目标阶段:真正的目标阶段正在处理事件的阶段
冒泡阶段:事件从目标节点自下而上向window传播的阶段
(注意⚠️:JS代码只能执行捕获或者冒泡其中一个阶段,要么是捕获要么是冒泡)
详细可见文章:一文彻底搞懂JS的事件流以及事件模型
冒泡指的是:当给某个目标元素绑定了事件之后,这个事件会依次在它的父级元素中被触发(当然前提是这个父级元素也有这个同名称的事件,比如子元素和父元素都绑定了click
事件就触发父元素的click
)。
捕获则是从上层向下层传递,与冒泡相反。
【非常好记,你就想想水底有一个泡泡从下面往上传的,所以是冒泡】
看案例
<ul onclick="alert('ul')">
<li onclick="alert('li')">
<button onclick="alert('button')">点击button>
li>
ul>
<script>
window.addEventListener('click', function (e) {
alert('window')
},false)
document.addEventListener('click', function (e) {
alert('document')
},true)
script>
结果:
冒泡结果:button > li > ul > document > window
捕获结果:window > document > ul > li > button