犀牛书这里太杂了,我有点跟不上,先去看红宝书理顺一下了。
(面了很多次试,和面试官们的交谈中发现这一块蛮重要的,特来回看(实习时间这个事情真的难以在招聘者和应聘者间达成完美一致,真难受))
BOM
browser object model 浏览器对象模型,提供了与网页无关的浏览器功能对象,这些是可以与浏览器进行交互的对象。
BOM对象有很多↓
window
window对象是BOM的核心,表示浏览器的实例。window对象被复用为ES中的Global对象,又是浏览器窗口中的JS接口。(强烈建议自己F12输出看一下)
Global作用域
通过var声明的所有全局变量和函数都会变成window对象的属性和方法。
1 2 3 4 5 6
| var saySth = () => { alert('Sth') } window.saySth()
var newVal = window.oldVal
|
窗口关系
对象top
始终指向最上层窗口,parent
指向当前窗口的父窗口,self
始终指向window(两者是同一个对象)。
多个窗口window对象可串联。
窗口位置与像素比
window对象的位置可以属性和方法来确定。
1 2 3 4 5
| screenTop screenLeft moveTo(x, y) moveBy(x, y) devicePixelRatio
|
像素比:一个奇异的角度0.0213°,屏幕距离人眼一臂长时CSS像素越1/96英寸。
物理分辨率:硬件固有的分辨率
逻辑分辨率:算法得出的分辨率,是肉眼可以感知的分辨率,一般比物理分辨率小
窗口大小
确定浏览器窗口大小是一个基本操作。
1 2 3 4 5 6 7 8 9 10 11 12
| let pageWidth = window.innerWidth, pageHeight = window.innerHeight
if (typeof pageWidth !== 'number') { if (document.compateMode === 'CSSCompat') { pageWidth = document.documentElement.clientWidth pageHeight = document.documentElment.clientHeight } else { pageWidth = document.body.clientWidth pageHeight = document.body.clientHeight } }
|
窗口缩放
1 2
| window.resizeTo(100, 100) window.resizeBy(100, 50)
|
视口位置
移动窗口
1 2 3 4 5 6 7 8 9
| window.scrollBy(40, 100)
window.scrollTo(0, 0)
window.scrollTo({ left: 100, top: 100, behavior: 'smooth' })
|
导航与打开新窗口
我们可以这样弹出窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| window.open(URL, 窗口名, 特性字符串)
resizable 是否可以拖动改变新窗口大小 top/left height/width
let wroxWin = window.open('http://wrox.com', 'wroxWindow', 'height=400, width=400, top=10, left=10, resizable=yes')
alert(window === wroxWin.opener)
wroxWin.opener = null
|
我们需要一些安全限制:弹出窗口存在一些安全隐患,比如广告之类的。因此浏览器在优化的时候会对其做一些限制。
弹窗屏蔽程序:浏览器内置屏蔽弹窗的程序↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| let blocked = false
try { let wroxWin = window.open(...) if (wroxWin === null) { blocked = true } } catch(e) { blocked = true }
if (blocked) { alert('nono') }
|
定时器
setTimeout():一定时间后执行代码
setInterval() :每隔一段时间执行代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| let timer = null timer = setTimeout(() => alert('hh'), 1000) clearTimeout(timer)
timer = setInterval(() => alert('hh'), 1000) clearInterval(timer)
let num = 0, max = 10, timer = null let incrementNumber = function() { num ++ if (num >= max) { alert('done') } else { clearInterval(timer) } } timer = setInterval(incrementNumber, 500)
let num = 0, max = 10 let incrementNumber = function() { num ++ if (num >= max) { alert('done') } else { setTimout(incrementNumber, 500) } } setTimeout(incrementNumber, 500)
|
系统对话框
alert confirm prompt 简单用法示例↓
1 2 3 4 5 6 7 8
| alert('haha') let confirm = confirm('确定?') let result = prompt('吃啥?', '')
window.print()
window.find()
|
location
location对象是一个非常有用的BOM对象。同样可以输出一下看看。
以下是书中列出的一些属性值,具体再需要什么去MDN自己查
查询字符串
解析查询字符串
解析查询字符串,转换为查询属性对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let getArgs = function() { let qs = location.search.length > 0 ? location.search : '' let args = {} for (let item of qs.split('&').map(val => val.split('='))) { let name = decodeURIComponent(item[0]) let value = decodeURIComponent(item[1]) if (name.length) { args[name] = value } } return args }
|
URLSearchParams
这个接口提供了一组可以简化上述操作的api
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| let qs = location.search let searchParams = new URLSearchParams(qs)
alert(searchParams.toString) searchParams.has('q') searchParams.get('q') searchParams.set('p', 'haha')
for (let item of searchParams) { console.log(item) }
|
操作地址
通过修改location对象修改地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| location.assign('url地址') window.location = 'url地址' location.href = 'url地址'
location.search = "?q=javascript";
location.hostname = "www.somewhere.com";
location.pathname = "mydir";
location.port = 8080;
location.hash = "#section1";
location.replace('url地址')
location.reload() location.reload(true)
|
navigator
该对象是客户端标识浏览器的标准。(比较重要的一个是navigator.userAgent)
该对象提供一些属性和方法,通过这些属性方法,向我们传递浏览器信息↓,方便我们确定浏览器类型。
检测插件
自己去浏览器输出看看
注册处理程序
把一个网站注册为处理某种特定类型信息应用程序
1
| navigator.registerProtocolHandler(协议名, URL)
|
screen
该对象展示的是客户端的能力信息。
history
这个对象虽然不会向用户暴露历史记录中URL地址,但是可以通过调用方法使得前进/回退等。
导航
1 2 3 4 5 6 7 8 9
| history.go(-1) history.go(1) history.go(2) history.go('wrox.com') ↓ history.back() history.forward()
history.length
|
历史状态管理
HTML5中有对history对象增加一些方便状态管理的特性。
1 2 3 4 5
| history.pushState(state对象, 新状态的标题, 可选的相对URL)
let state = { foo: 'bar' } history.pushState(state, 'Title', 'baz.com') history.replaceState(...)
|
好了!BOM就先到这里吧!
DOM
document object model 文档对象模型,是HTML XML文档的编程接口。表示由多层节点构成的文档,我们可以通过对DOM的获取操作来动态操作HTML。
DOM是现在真正实现跨平台、语言无关的表示操作网页的方式。